|
20063
|
5IR LFR by @AnshAgarwal | Stardance
|
AnshAgarwal
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T15:54:48Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a 5IR Line Follower Robot using an ESP32 as the main controller. The robot uses 5 digital IR sensors for line detection and an L298N motor driver to control 300RPM geared motors. I designed the sensor mapping, created the code, assembled the hardware, and completed the full working robot. The main challenge was tuning the sensor logic and movement control so the robot could smoothly handle different paths like loops, 90-degree turns, and curves. I am proud that I was able to build, code, and test a fully functional line follower robot in around 1 hour. To test the project, place the robot on a black line track, make sure the batteries are charged and the sensors are aligned properly, then the robot will automatically detect and follow the path.", "repo": "https://github.com/anshagarwal000112-tech/Line-Following-Car-MIT-Manipur", "demo": ""}]...
|
[{"post_id": 14420, "ts": "202 [{"post_id": 14420, "ts": "2026-06-23T15:24:38Z", "hours": 1.1558, "text": "Today I started and completed my 5IR Line Follower Robot. I worked on the complete build process, including planning the sensor placement, making the circuit connections, and developing the code for the robot. The robot uses 5 digital IR sensors connected with an ESP32 to detect the line. I created the sensor mapping and programmed the movement logic to control the motors through an L298N motor driver. After testing and tuning the code, the robot was able to follow the track properly and handle different paths like curves, loops, and 90-degree turns. I also completed the power setup using two 2200mAh 3.7V Li-ion batteries with a buck converter for stable power. The complete robot was built, coded, and tested successfully in around 1 hour. Hardware used: ESP32 5 Digital IR Sensors L298N Motor Driver 300RPM Geared Motors 2x 2200mAh 3.7V Li-ion Batteries Buck Converter Robot Chassis This was a quick prototype build to test my line following system and understand the performance of the sensor mapping and control logic."}]...
|
Title: 5IR LFR by @AnshAgarwal | Stardance
Devlog Title: 5IR LFR by @AnshAgarwal | Stardance
Devlogs:
Today I started and completed my 5IR Line Follower Robot. I worked on the complete build process, including planning the sensor placement, making the circuit connections, and developing the code for the robot. The robot uses 5 digital IR sensors connected with an ESP32 to detect the line. I created the sensor mapping and programmed the movement logic to control the motors through an L298N motor driver. After testing and tuning the code, the robot was able to follow the track properly and handle different paths like curves, loops, and 90-degree turns. I also completed the power setup using two 2200mAh 3.7V Li-ion batteries with a buck converter for stable power. The complete robot was built, coded, and tested successfully in around 1 hour. Hardware used: ESP32 5 Digital IR Sensors L298N Motor Driver 300RPM Geared Motors 2x 2200mAh 3.7V Li-ion Batteries Buck Converter Robot Chassis This was a quick prototype build to test my line following system and understand the performance of the sensor mapping and control logic.
Ships:
I made a 5IR Line Follower Robot using an ESP32 as the main controller. The robot uses 5 digital IR sensors for line detection and an L298N motor driver to control 300RPM geared motors. I designed the sensor mapping, created the code, assembled the hardware, and completed the full working robot. The main challenge was tuning the sensor logic and movement control so the robot could smoothly handle different paths like loops, 90-degree turns, and curves. I am proud that I was able to build, code, and test a fully functional line follower robot in around 1 hour. To test the project, place the robot on a black line track, make sure the batteries are charged and the sensors are aligned properly, then the robot will automatically detect and follow the path....
|
1793202562.7621663
|
1793288962.7621663
|
|
20067
|
Networkdeck by @quakeq | Stardance
|
quakeq
|
1
|
18.0
|
89
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-09T19:03:57Z", "hours": 18.0, "multiplier": 5.0, "payout": 89, "blessing": "neutral", "text": "I made a cyberdeck! I always wanted to make a cyberdeck, motivated from a friend who made one before. However, the thing that always bugged me about them were that they always were 1) very short lifespan and 2) were kinda useless compared to just normal laptops. I know that cyberdecks are meant to be more stylistic and not really useful but I really wanted a useful cyberdeck, leading me to make this project. To solve these issues, I had 2 solutions: 1) custom battery, 2) storage boxes. I used a custom battery with 13.80 Ah of capacity, which gives the deck around a 10 hour lifespan at full charge (it only draws 1.5 amps normally which is kinda wild) and so that solves the first issue. I utilized a medium sized pelican case to allow for more storage of the large battery and also to allow for the placement of some cubbies for tools like a multimeter, soldering iron, etc. It adds on that extra functionality that a laptop cannot, it’s a on the move workstation.", "repo": "https://github.com/quakeq/cyberdeck-opensauce", "demo": ""}]...
|
[{"post_id": 24534, "ts": "202 [{"post_id": 24534, "ts": "2026-07-08T04:45:02Z", "hours": 6.6886, "text": "Week 2+3: I forgot to post devlog for week 2 so here it is! Week 2: I worked on the battery and it actually worked without blowing up which is very shocking to me as it was sketchy as hell (Amazon BMS and charger). This week was also the week that I discovered that my PCB redesign for the keyboard didn’t work… Really felt that since it was like 100$. RIP my wallet…(PCBWay so expensive). I used JLCPCB which is like so much cheaper (like 60$) and ordered the v3 of the keyboard. The main issue with my design was that I thought I just did not think of how I was going to flash the ESP32 at all… So to power my v3 board, I ended up following the Hackclub Keeb guide and used a Raspberry Pico to simplify the flashing. I also finished getting all of my main components all 3d printed out and switches and thingies attached, so I was ready to basically assemble. Week 3: I faced a really big issue working on the screen. It would not turn on as much as I tried looking through the documentation of my screen. I had tested when I got the screens and it worked fine. I was debugging for like 3 hours and I asked my dad to look at it since I needed a 2nd opinion. I flipped the DSI ribbon cable… RIP 3 hours of my life. I also didn’t get it on Hackatime because I thought it would be a easy assembly… [insert rick and morty meme, “let’s go in and out”] With the screen working and battery working, I worked on putting the top and bottom cases together. So, for the first time I got it powered completely via the battery pack!! [Picture] (yes one of the first things I did was to install and play Stardew Valley on it) Finally, today I got my keyboard v3 in the mail and I started assembling my keyboard. I got it assembled in 2 hours since I had all the parts already. It was honestly not that bad, just soldering a lot of diodes and switches in a row. Using RMK and Vial for keyboard configuration, I was able to get it functioning on my other computer. Todo: Design a keyboard case for the v3 PCB and print out keycaps SHIPPPPP!!!!"}, {"post_id": 15444, "ts": "2026-06-25T03:07:44Z", "hours": 0.6142, "text": "My keyboard PCB and batteries arrived, so I made the cases for them. Wasn’t too challenging as I had already thought out how I wanted them to be laid out in the box."}, {"post_id": 14470, "ts": "2026-06-23T16:33:34Z", "hours": 0.9056, "text": "front panel v5… This front panel was so hard to design, mainly because I have an A1 printer and so its bed cannot fully support the width of the front panel. I think this design fully satisfies my requirements as it 1) is fully printable in one shot so there’s no weird breaks, 2) is wide enough to fit the entire front cover, and 3) looks nice. I don’t have any of my wires yet and so I will be waiting for those to arrive."}, {"post_id": 12928, "ts": "2026-06-21T05:09:30Z", "hours": 1.2833, "text": "I finished my redesign for my front cover from last night. This (almost finalized) design has some kinks to it, such as still needing ports but the overall dimensions and stuff is done, meaning that I should be able to get it printed and finished tomorrow. All that’s left is: 1) Keyboard 2) Battery 3) Raspberry Pi case which is a lot but a lot has also been ordered and is on the way."}, {"post_id": 12424, "ts": "2026-06-20T08:41:43Z", "hours": 1.4017, "text": "I worked on getting the power supply for my cyberdeck. I decided to go with the custom LiPo battery pack because I can store each cell separately for flights. (which is necessary since I’m taking this to Outpost) So here I was just searching for the right BMS for my battery a 3S battery pulling max maybe 20amps. I also worked on the front panel of my cyberdeck (where the screen and ports are going to be located) I originally wanted a dual screen setup in which the two screens were overlayed and you could expand it as one screen was on some linear rails. However, that is wayyy to complex for something that I need to ship in like 10 days and it would look really janky and not nice. In other words, KISS - Keep it simple stupid."}, {"post_id": 12250, "ts": "2026-06-20T00:27:58Z", "hours": 1.9219, "text": "Working on the bottom side of my case, where the keyboard and storage lives. I wanted the storage to be nice and neat (no spaghetti here) and so I made these sliding boxes that would go into the compartment under the keyboard. Some key design constraints was keeping it small and compact, which I did with the hooks on the boxes so retrieving the cases is easy and also really compact. I plan on using the same sort of design on the other half of the bottom part of case. With the bottom half of the case being dedicated to storage I’ve changed my design, moving the Raspberry Pi being on the lid half of the case to make room for the storage. I think this should also make my wiring later simpler because now there’s less wires needing to go through the hinge."}, {"post_id": 11710, "ts": "2026-06-19T02:14:45Z", "hours": 1.5667, "text": "Ordering some components on PCBway, they still need to undergo review but hopefully we should have some stuff arrive soonish"}, {"post_id": 11657, "ts": "2026-06-19T00:16:05Z", "hours": 1.65, "text": "Working on proper spacing and figuring out where I want everything to maximize 1) cooling for the Pi (dunno how much it matters) 2) battery size/life 3) Ports and connections"}, {"post_id": 11107, "ts": "2026-06-18T05:08:49Z", "hours": 1.7167, "text": "Working On My Keyboard Battery"}]...
|
Title: Networkdeck by @quakeq | Stardance
Devlogs Title: Networkdeck by @quakeq | Stardance
Devlogs:
Working On My Keyboard Battery
Working on proper spacing and figuring out where I want everything to maximize 1) cooling for the Pi (dunno how much it matters) 2) battery size/life 3) Ports and connections
Ordering some components on PCBway, they still need to undergo review but hopefully we should have some stuff arrive soonish
Working on the bottom side of my case, where the keyboard and storage lives. I wanted the storage to be nice and neat (no spaghetti here) and so I made these sliding boxes that would go into the compartment under the keyboard. Some key design constraints was keeping it small and compact, which I did with the hooks on the boxes so retrieving the cases is easy and also really compact. I plan on using the same sort of design on the other half of the bottom part of case. With the bottom half of the case being dedicated to storage I’ve changed my design, moving the Raspberry Pi being on the lid half of the case to make room for the storage. I think this should also make my wiring later simpler because now there’s less wires needing to go through the hinge.
I worked on getting the power supply for my cyberdeck. I decided to go with the custom LiPo battery pack because I can store each cell separately for flights. (which is necessary since I’m taking this to Outpost) So here I was just searching for the right BMS for my battery a 3S battery pulling max maybe 20amps. I also worked on the front panel of my cyberdeck (where the screen and ports are going to be located) I originally wanted a dual screen setup in which the two screens were overlayed and you could expand it as one screen was on some linear rails. However, that is wayyy to complex for something that I need to ship in like 10 days and it would look really janky and not nice. In other words, KISS - Keep it simple stupid.
I finished my redesign for my front cover from last night. This (almost finalized) design has some kinks to it, such as still needing ports but the overall dimensions and stuff is done, meaning that I should be able to get it printed and finished tomorrow. All that’s left is: 1) Keyboard 2) Battery 3) Raspberry Pi case which is a lot but a lot has also been ordered and is on the way.
front panel v5… This front panel was so hard to design, mainly because I have an A1 printer and so its bed cannot fully support the width of the front panel. I think this design fully satisfies my requirements as it 1) is fully printable in one shot so there’s no weird breaks, 2) is wide enough to fit the entire front cover, and 3) looks nice. I don’t have any of my wires yet and so I will be waiting for those to arrive.
My keyboard PCB and batteries arrived, so I made the cases for them. Wasn’t too challenging as I had already thought out how I wanted them to be laid out in the box.
Week 2+3: I forgot to post devlog for week 2 so here it is! Week 2: I worked on the battery and it actually worked without blowing up which is very shocking to me as it was sketchy as hell (Amazon BMS and charger). This week was also the week that I discovered that my PCB redesign for the keyboard didn’t work… Really felt that since it was like 100$. RIP my wallet…(PCBWay so expensive). I used JLCPCB which is like so much cheaper (like 60$) and ordered the v3 of the keyboard. The main issue with my design was that I thought I just did not think of how I was going to flash the ESP32 at all… So to power my v3 board, I ended up following the Hackclub Keeb guide and used a Raspberry Pico to simplify the flashing. I also finished getting all of my main components all 3d printed out and switches and thingies attached, so I was ready to basically assemble. Week 3: I faced a really big issue working on the screen. It would not turn on as much as I tried looking through the documentation of my screen. I had tested when I got the screens and it worked fine. I was debugging for like 3 hours and I asked my dad to look at it since I needed a 2nd opinion. I flipped the DSI ribbon cable… RIP 3 hours of my life. I also didn’t get it on Hackatime because I thought it would be a easy assembly… [insert rick and morty meme, “let’s go in and out”] With the screen working and battery working, I worked on putting the top and bottom cases together. So, for the first time I got it powered completely via the battery pack!! [Picture] (yes one of the first things I did was to install and play Stardew Valley on it) Finally, today I got my keyboard v3 in the mail and I started assembling my keyboard. I got it assembled in 2 hours since I had all the parts already. It was honestly not that bad, just soldering a lot of diodes and switches in a row. Using RMK and Vial for keyboard configuration, I was able to get it functioning on my other computer. Todo: Design a keyboard case for the v3 PCB and print out keycaps SHIPPPPP!!!!
Ships:
I made a cyberdeck! I always wanted to make a cyberdeck, motivated from a friend who made one before. However, the thing that always bugged me about them were that they always were 1) very short lifespan and 2) were kinda useless compared to just normal laptops. I know that cyberdecks are meant to be more stylistic and not really useful but I really wanted a useful cyberdeck, leading me to make this project. To solve these issues, I had 2 solutions: 1) custom battery, 2) storage boxes. I used a custom battery with 13.80 Ah of capacity, which gives the deck around a 10 hour lifespan at full charge (it only draws 1.5 amps normally which is kinda wild) and so that solves the first issue. I utilized a medium sized pelican case to allow for more storage of the large battery and also to allow for the placement of some cubbies for tools like a multimeter, soldering iron, etc. It adds on that extra functionality that a laptop cannot, it’s a on the move workstation....
|
1793130851.2887616
|
1793217251.2887616
|
|
20071
|
lunchtime! by @sleepymeep | Stardance
|
sleepymeep
|
1
|
12.0
|
229
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-24T01:08:40Z", "hours": 12.0, "multiplier": 19.2, "payout": 229, "blessing": "neutral", "text": "Welcome to lunchtime, a game made for the summer 2026 Girls Got Game Jam, which was my second game jam! It’s a visual novel made with the ren’py engine, and it’s available to play on itch.io. This was my first time working on a project with this short of a timespan (one week, vs my first game jam with a span of one month), as well as my first time using ren’py, so I learned a lot about both this engine as well as what the development process looks like under a time crunch. :D", "repo": "https://github.com/ayesha-h3/lunchtime", "demo": "https://sleepymeep.itch.io/lunchtime"}]...
|
[{"post_id": 14786, "ts": "202 [{"post_id": 14786, "ts": "2026-06-24T00:53:16Z", "hours": 3.7064, "text": "deadline got slightly extended, which means i was able to make some slight tweaks to make everything run more smoothly! first, i added some music in (all assets from pixabay). then, we merged both the story and gui edits (by @kjoy116 ) onto the main branch so that most of the game was running smoothly. i had some issues with backgrounds not filling in the whole screen which i thought was an issue with my canvas size, but i figured it might be worth it to play around with ren’py to see if there was a fix. i referenced the transform commands in ren’py’s documentation since that’s where some similar problems online pointed me towards, so it ended up being a pretty easy fix! lastly, i worked on making the itch.io page look presentable (which was pretty quick, around half an hour)! the game is live on itch.io now, so that’s exciting!"}, {"post_id": 13970, "ts": "2026-06-22T22:36:04Z", "hours": 4.5897, "text": "game jam ends in seven hours sob. i drew nine backgrounds (quite challenging as a non-artist) and learned….how to draw crystals! i wrote four new scenes (and rewrote them…and rewrote them…) and worked on making the story flow a little bit more smoothly, both writing-wise and display-wise. i learned how to apply transforms and transitions, and started putting them in throughout the game!"}, {"post_id": 12158, "ts": "2026-06-19T21:20:48Z", "hours": 1.9408, "text": "day 3/4: wrote a LOT more of the story, including mapping out 5 endings! our team artist made some more amazing character designs like this one below :) (name tbd) which i’ve started importing. my next few goals are to: add in backgrounds and the rest of the characters, attach variables to every decision so that they all impact which ending you get to varying extents, and making the gui look nicer through adding new fonts, colors, and custom text boxes!"}, {"post_id": 11395, "ts": "2026-06-18T17:31:19Z", "hours": 1.7119, "text": "day 1/2: learning ren’py and planning out a story! it actually ended up being way easier than I was expecting to get the hang of ren’py since it’s basically just python, so it looks like the majority of the effort for this project is going to be going towards story writing. got the opening scene done after a bit of rewriting to make it flow better, and we have a draft of the general story. the theme for the game jam is “the void,” so the way we’ve decided to incorporate this is that you have to fight a void-like entity that sucks the life out of everything she touches, while making new friends (or killing them, it’s up to you) along the way."}]...
|
Title: lunchtime! by @sleepymeep | Stardance
Devl Title: lunchtime! by @sleepymeep | Stardance
Devlogs:
day 1/2: learning ren’py and planning out a story! it actually ended up being way easier than I was expecting to get the hang of ren’py since it’s basically just python, so it looks like the majority of the effort for this project is going to be going towards story writing. got the opening scene done after a bit of rewriting to make it flow better, and we have a draft of the general story. the theme for the game jam is “the void,” so the way we’ve decided to incorporate this is that you have to fight a void-like entity that sucks the life out of everything she touches, while making new friends (or killing them, it’s up to you) along the way.
day 3/4: wrote a LOT more of the story, including mapping out 5 endings! our team artist made some more amazing character designs like this one below :) (name tbd) which i’ve started importing. my next few goals are to: add in backgrounds and the rest of the characters, attach variables to every decision so that they all impact which ending you get to varying extents, and making the gui look nicer through adding new fonts, colors, and custom text boxes!
game jam ends in seven hours sob. i drew nine backgrounds (quite challenging as a non-artist) and learned….how to draw crystals! i wrote four new scenes (and rewrote them…and rewrote them…) and worked on making the story flow a little bit more smoothly, both writing-wise and display-wise. i learned how to apply transforms and transitions, and started putting them in throughout the game!
deadline got slightly extended, which means i was able to make some slight tweaks to make everything run more smoothly! first, i added some music in (all assets from pixabay). then, we merged both the story and gui edits (by @kjoy116 ) onto the main branch so that most of the game was running smoothly. i had some issues with backgrounds not filling in the whole screen which i thought was an issue with my canvas size, but i figured it might be worth it to play around with ren’py to see if there was a fix. i referenced the transform commands in ren’py’s documentation since that’s where some similar problems online pointed me towards, so it ended up being a pretty easy fix! lastly, i worked on making the itch.io page look presentable (which was pretty quick, around half an hour)! the game is live on itch.io now, so that’s exciting!
Ships:
Welcome to lunchtime, a game made for the summer 2026 Girls Got Game Jam, which was my second game jam! It’s a visual novel made with the ren’py engine, and it’s available to play on itch.io. This was my first time working on a project with this short of a timespan (one week, vs my first game jam with a span of one month), as well as my first time using ren’py, so I learned a lot about both this engine as well as what the development process looks like under a time crunch. :D...
|
1793123684.2729099
|
1793210084.2729099
|
|
20086
|
Star Calculator by @Lauren_hackalicious | Stardanc Star Calculator by @Lauren_hackalicious | Stardance...
|
Lauren_hackalicious
|
1
|
2.0
|
4
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T20:55:37Z", "hours": 2.0, "multiplier": 1.64, "payout": 4, "blessing": "neutral", "text": "I made a calculator right before the 2026 spring break cycle at my school. When creating that calculator, I followed a step-by-step tutorial. I did all the coloring myself, but that felt more like a test run. I was thinking of many ways to display my new abilities in CSS, and thought, “Why not make a version 2 of my first calculator?” I built this from scratch and applied everything I learned in the past 3 months. I feel great about this project since it only took ~2 hours, and it’s something I can tell people I made on my own. I will admit I did fork the JavaScript code because I haven’t set aside time to learn the language, but maybe version 3 could be me creating a calculator without forking from a previous project. I also used GitHub Copilot to figure out how to place the display section of the calculator next to the Kirby PNG.", "repo": "https://github.com/example0d1n/web-calculator-v2", "demo": "https://example0d1n.github.io/web-calculator-v2/"}]...
|
[{"post_id": 10216, "ts": "202 [{"post_id": 10216, "ts": "2026-06-16T20:44:14Z", "hours": 0.7397, "text": "web-calculator v2 is COMPLETE. I polished the buttons and gave them some color. I embedded a Kirby PNG, similar to my first iteration. I added a button click sound :) I hope you all enjoy testing out and using this calculator"}, {"post_id": 10178, "ts": "2026-06-16T19:50:03Z", "hours": 1.16, "text": "I got all the buttons to work using JavaScript and have begun working on styling ideas! Compared to my first iteration, I’ve definitely improved my CSS styling. Link to my first calculator: https://example0d1n.github.io/calculator/"}, {"post_id": 10076, "ts": "2026-06-16T17:34:58Z", "hours": 0.3878, "text": "I’m making a Kirby-star themed calculator! This is an upgrade from my first “mymelody” calculator from 3 months ago. I just added the buttons, and I’m currently working on making them work in JavaScript."}]...
|
Title: Star Calculator by @Lauren_hackalicious | S Title: Star Calculator by @Lauren_hackalicious | Stardance
Devlogs:
I’m making a Kirby-star themed calculator! This is an upgrade from my first “mymelody” calculator from 3 months ago. I just added the buttons, and I’m currently working on making them work in JavaScript.
I got all the buttons to work using JavaScript and have begun working on styling ideas! Compared to my first iteration, I’ve definitely improved my CSS styling. Link to my first calculator: https://example0d1n.github.io/calculator/
web-calculator v2 is COMPLETE. I polished the buttons and gave them some color. I embedded a Kirby PNG, similar to my first iteration. I added a button click sound :) I hope you all enjoy testing out and using this calculator
Ships:
I made a calculator right before the 2026 spring break cycle at my school. When creating that calculator, I followed a step-by-step tutorial. I did all the coloring myself, but that felt more like a test run. I was thinking of many ways to display my new abilities in CSS, and thought, “Why not make a version 2 of my first calculator?” I built this from scratch and applied everything I learned in the past 3 months. I feel great about this project since it only took ~2 hours, and it’s something I can tell people I made on my own. I will admit I did fork the JavaScript code because I haven’t set aside time to learn the language, but maybe version 3 could be me creating a calculator without forking from a previous project. I also used GitHub Copilot to figure out how to place the display section of the calculator next to the Kirby PNG....
|
1793202569.9801335
|
1793288969.9801335
|
|
20111
|
Hardware-In-the-Loop (HIL) by @sathyndhira | Stard Hardware-In-the-Loop (HIL) by @sathyndhira | Stardance...
|
sathyndhira
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T20:37:12Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a simulator that treats an Arduino like a flight computer that displays the status of a satellite. I was hard to connect the Arduino’s language to the python script, but I learned how to do that with the help of AI. I felt proud of it because this is my first public independent project with no guide to help me on the way.", "repo": "https://github.com/Sathyndhira/HIL-Satellite-Simulator", "demo": ""}]...
|
[{"post_id": 10121, "ts": "202 [{"post_id": 10121, "ts": "2026-06-16T18:41:49Z", "hours": 0.5667, "text": "Hardware-In-the-Loop Satellite Simluation This projects connects a testing bridge between two things: an Arduino UNO (Physical Microcontroller) which acts like a Flight Computer, and a Python Script in VS Code which acts as Ground Control. As the orbital physics are simulated in Python and sent live over a serial data highway to the Arduino, the Arduino must process this information to execute decision-making logic, and showcase the simulation’s state based on hardware constraints."}]...
|
Title: Hardware-In-the-Loop (HIL) by @sathyndhira Title: Hardware-In-the-Loop (HIL) by @sathyndhira | Stardance
Devlogs:
Hardware-In-the-Loop Satellite Simluation This projects connects a testing bridge between two things: an Arduino UNO (Physical Microcontroller) which acts like a Flight Computer, and a Python Script in VS Code which acts as Ground Control. As the orbital physics are simulated in Python and sent live over a serial data highway to the Arduino, the Arduino must process this information to execute decision-making logic, and showcase the simulation’s state based on hardware constraints.
Ships:
I made a simulator that treats an Arduino like a flight computer that displays the status of a satellite. I was hard to connect the Arduino’s language to the python script, but I learned how to do that with the help of AI. I felt proud of it because this is my first public independent project with no guide to help me on the way....
|
1793293018.314436
|
1793379418.314436
|
|
20114
|
Synthesizer by @amk9809 | Stardance
|
amk9809
|
1
|
12.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-13T18:28:57Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a simple python and pygame GUI of a synthesizer. What is special about this is that it only uses of note, that is C major, to create all the other notes for the synthesizer. It uses librosas pitch_shift function to create all the other notes needed. All of this came from a single project of creating a code for transforming one note into another. I liked it a lot so I decided to build a GUI for it and here we are. Throughout the project, there weren’t many problems, since it isn’t that complicted, but there still were a few. When I first tried to make the notes change colour when you clicked them, it was really challenging to create a system so they would do it in a set amount of time. Then I came to the idea of using some kind of memory for the notes and empty it in a set amount of time. So I made it like this: -once you click a note it changes colour; -its position and time when it was clicked is added to the memory; -with every frame, the game checks if the time that was recoreded in the memory was 3 or more seconds ago; -after it sees that it was, it changes back the colour of the note, and empties the note from the memory. I am really proud of how I made a solution for that problem, because I really like using matrices and arrays for such solutions. Except that, I tried making the sound change pitch different instead of with librosas pitch_shift funtion. I wanted to create a funtion which will utilise the FFT and change the frequency that way. That was really hard. Most of the time spent in the last devpost were me trying to do it. I just didn’t realise how it should me done, but then I tested it on a random sine signal I created using numpy and once I did it with that simple signal I tried it with mine signal. Some key problems I had to solve was that: -I had to change my audio array froma multidimensional to a onedimensional array, since the fft worked with those; -I had to move items to a fractional place, which used some special python and mathematical function. Other than those, there weren’t any significant problems I found. But I am really proud of myself on this project for doing more than just creating a GUI. I am proud I used signal proccesiong and mathematical functions to manipulate the audio waves inputted. What’s fun is that you can input any wave file into the program and it will use it, so you can basically input anything you want to use for your synth.", "repo": "https://github.com/amk9809/Python_Synthesizer", "demo": "https://amk9809.itch.io/pygame-synthesizer"}]...
|
[{"post_id": 38355, "ts": "202 [{"post_id": 38355, "ts": "2026-07-31T18:12:30Z", "hours": 2.0006, "text": "So, in the last week I’ve been trying to make this synth into and executable binary, but python being python made problems with the libraries such as librosa, which I can’t replace because there aren’t any other suitable libraries like that that work for me in this case. I’ve been breaking my back with libraries like nuitka and pyinstaller which had problems of their own (pyinstaller not wanting to work because of flexiblas and nuitk because of librosa). But I finally think I did the job and It’s available on the itch.io page of the game."}, {"post_id": 27767, "ts": "2026-07-13T16:42:01Z", "hours": 4.9431, "text": "I’m finally done with the idea of this synthesizer. From the last update I have tried to implement a different approach to the pitch change. I have tried, instead of the librosa pitch_shift, to use the sound made using a FFT. That ended up not sounding better, even though I though it would. I basically just turned my audio info into a complex array using a FFT, where I mover the frequency bins higher or lower depending on if the sound should be lower or higher. There I also calculate how much the sound should be moved based on how many semitones you want. In the end, the full project consists of a notebook (where you can see the FFT) where there are some tests with the audio. There are also the input audio: C_Major_Piano and the output audio(Only used in testing): Output_Note. Other than that, there are two GUIs, where on one you play with the C Major note and change it’s pitch and on the other you just play the frequency of the wanted note."}, {"post_id": 11948, "ts": "2026-06-19T14:25:00Z", "hours": 3.5386, "text": "From the last devlog, I have been working on the GUI of the synthesizer. For now it looks pretty promising and I lile how it is going. I have made the synthesizer work and now you click on the notes and the sound lasts two seconds. The high pitched sounds don’t sound like the piano though…but I’m not sure how to work that out yet. What was the hard part from the last update wasd making the buttons change colour once clicked. Since they are not part of any class or struct, I have to draw them again in different colour once they are clicked and again in the original colour two seconds later. For that I use a matrix which serves as a memory, which works fine for now, which holds the time when the button was clicked and its position so it can be drawn again."}, {"post_id": 10082, "ts": "2026-06-16T17:40:09Z", "hours": 1.2558, "text": "Currently I have imported the .mp3 file of the C major note onto python and have read it’s contents. And here is the plot of the sound itself. One part of the code currently reads from your terminal which note you want to play, for example “A4”, and it scales the C major note to that pitch and plays it. After that there is a low-pass filter to clear the frequencies over 4500Hz, mainly to make the notes of higher octaves sound cleaner and like piano notes and not banjo. I have started to copy the final products from a jupyter notebook to a python file because I want to create a GUI so the user can actually click the note to play, like a little piano."}]...
|
Title: Synthesizer by @amk9809 | Stardance
Devlog Title: Synthesizer by @amk9809 | Stardance
Devlogs:
Currently I have imported the .mp3 file of the C major note onto python and have read it’s contents. And here is the plot of the sound itself. One part of the code currently reads from your terminal which note you want to play, for example “A4”, and it scales the C major note to that pitch and plays it. After that there is a low-pass filter to clear the frequencies over 4500Hz, mainly to make the notes of higher octaves sound cleaner and like piano notes and not banjo. I have started to copy the final products from a jupyter notebook to a python file because I want to create a GUI so the user can actually click the note to play, like a little piano.
From the last devlog, I have been working on the GUI of the synthesizer. For now it looks pretty promising and I lile how it is going. I have made the synthesizer work and now you click on the notes and the sound lasts two seconds. The high pitched sounds don’t sound like the piano though…but I’m not sure how to work that out yet. What was the hard part from the last update wasd making the buttons change colour once clicked. Since they are not part of any class or struct, I have to draw them again in different colour once they are clicked and again in the original colour two seconds later. For that I use a matrix which serves as a memory, which works fine for now, which holds the time when the button was clicked and its position so it can be drawn again.
I’m finally done with the idea of this synthesizer. From the last update I have tried to implement a different approach to the pitch change. I have tried, instead of the librosa pitch_shift, to use the sound made using a FFT. That ended up not sounding better, even though I though it would. I basically just turned my audio info into a complex array using a FFT, where I mover the frequency bins higher or lower depending on if the sound should be lower or higher. There I also calculate how much the sound should be moved based on how many semitones you want. In the end, the full project consists of a notebook (where you can see the FFT) where there are some tests with the audio. There are also the input audio: C_Major_Piano and the output audio(Only used in testing): Output_Note. Other than that, there are two GUIs, where on one you play with the C Major note and change it’s pitch and on the other you just play the frequency of the wanted note.
So, in the last week I’ve been trying to make this synth into and executable binary, but python being python made problems with the libraries such as librosa, which I can’t replace because there aren’t any other suitable libraries like that that work for me in this case. I’ve been breaking my back with libraries like nuitka and pyinstaller which had problems of their own (pyinstaller not wanting to work because of flexiblas and nuitk because of librosa). But I finally think I did the job and It’s available on the itch.io page of the game.
Ships:
I made a simple python and pygame GUI of a synthesizer. What is special about this is that it only uses of note, that is C major, to create all the other notes for the synthesizer. It uses librosas pitch_shift function to create all the other notes needed. All of this came from a single project of creating a code for transforming one note into another. I liked it a lot so I decided to build a GUI for it and here we are. Throughout the project, there weren’t many problems, since it isn’t that complicted, but there still were a few. When I first tried to make the notes change colour when you clicked them, it was really challenging to create a system so they would do it in a set amount of time. Then I came to the idea of using some kind of memory for the notes and empty it in a set amount of time. So I made it like this: -once you click a note it changes colour; -its position and time when it was clicked is added to the memory; -with every frame, the game checks if the time that was recoreded in the memory was 3 or more seconds ago; -after it sees that it was, it changes back the colour of the note, and empties the note from the memory. I am really proud of how I made a solution for that problem, because I really like using matrices and arrays for such solutions. Except that, I tried making the sound change pitch different instead of with librosas pitch_shift funtion. I wanted to create a funtion which will utilise the FFT and change the frequency that way. That was really hard. Most of the time spent in the last devpost were me trying to do it. I just didn’t realise how it should me done, but then I tested it on a random sine signal I created using numpy and once I did it with that simple signal I tried it with mine signal. Some key problems I had to solve was that: -I had to change my audio array froma multidimensional to a onedimensional array, since the fft worked with those; -I had to move items to a fractional place, which used some special python and mathematical function. Other than those, there weren’t any significant problems I found. But I am really proud of myself on this project for doing more than just creating a GUI. I am proud I used signal proccesiong and mathematical functions to manipulate the audio waves inputted. What’s fun is that you can input any wave file into the program and it will use it, so you can basically input anything you want to use for your synth....
|
1793137669.5294383
|
1793224069.5294383
|
|
20181
|
My awesome macropad! by @aayanalikhan09 | Stardanc My awesome macropad! by @aayanalikhan09 | Stardance...
|
aayanalikhan09
|
1
|
1.45
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-30T02:43:33Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "hello! This is my first ship, so I will try to keep this succinct! My name is Aayan, and I hope to go very far with my designs, but for now, this is where they are! I have developed a Rock, Paper, Scissors toy that you can build yourself at home with the help of a soldering iron, a few extra screws, and a Hackpad kit! You simply choose an option, and the CPU will also randomly choose an option. The CPU will display the appropriate outcome based on whether you won, lost, or tied. Some initial challenges I faced in the development stages were the wiring for all the tracks! So many different configurations were made until I eventually landed on this! This, of course, was my first ever PCB, so there were bound to be many such configurations. I’m pretty proud of the idea I had for the integration of the LEDs as a more garnish-type element to accent the OLED panel display results. I initially was thinking to add a potentiometer for brightness control, but decided against it as it didn’t really add too much to the overall function of the project. Before you go ahead and get to printing, you should know this project is still in the dev stages and once its finished(which I will publish) it will be easy to setup. In the interim, I will post updates of the build progress and what bugs I may fix in the future. Thank you for reading and I hope to see you again soon :D", "repo": "https://github.com/aayanalikhan09-hash/project-hackpad-rps-project-waow", "demo": ""}]...
|
[{"post_id": 20011, "ts": "202 [{"post_id": 20011, "ts": "2026-07-01T14:38:43Z", "hours": 0.4503, "text": "Added safety guidelines and updated the README! I checked the resources tab yesterday and realized my README was not up to par! So I decided to make it as polished as possible and also forgot to log some of the hours! oops :P Anywhooo the readme has been updated so that now most people who have a basic understanding of robotics stuff can make my project! If any of you guys choose to make this, please let me know! I think it would make a great little HCB prize if I’m being honest."}, {"post_id": 18068, "ts": "2026-06-29T01:51:11Z", "hours": 6.0342, "text": "ITS COMPLETE STICKER HERE I COME I finally finished the full design for my Rock Paper Scissors module! Some notes before I ship: This project requires TWO smaller M3x8 screws for the standoffs, but that shouldn’t be too much of a worry for me personally because I am very fortunate to have access to a robotics trove of parts. This project features an OLED panel along with two LEDs that are meant to display different states based on what the player chooses to play against the CPU. The initial display will feature text saying “RPS?” and the player will choose the corresponding key. Upon their selection, the game will then display if the player has won, tied, or lost to the CPU who has randomly chosen an option. I would’ve loved to add a speaker, but that’s not included in the kit :( - maybe something to suggest for the next round of hackpads! this is my first ship so im pretty excited to get the hardware and upload the code and make it work!"}, {"post_id": 17625, "ts": "2026-06-28T14:33:48Z", "hours": 7.8544, "text": "I finally finished the PCB! : D I had to do some major rearranging for tracks(pcb wire connections), but it’s finally done! I have finished the PCB and I am now starting the preliminary stages of making a case for the PCB. explanation for other beginners :D i had to redo a lot of my wiring because i had thought that the components had to be facing a specific based on diagrams i saw that were not specific to my hardware. however, i did not check the hackpad docs, and therefore went through some quite unnecessary pain to rearrange all the tracks to accommodate such a major change. side note for beginners aka tldr:CHECK THE DOCUMENTATION ALWAYS ITS FOR YOUR OWN SANITY"}, {"post_id": 10440, "ts": "2026-06-17T05:03:25Z", "hours": 1.2117, "text": "Keypad :D Rn im trying to make a rock paper scissors type game with three keys and an oled with two leds im also switching permanently to kicad for my other project KiCAD is WAY easier to use and is so much less clunky notes for beginners: i was initially using EasyEDA, another free tool that im sure many use - i am no longer one of them lol easy eda was great for getting parts from the cloud and just wiring em up, but was horrible for the work itself and was rather unintuitive kicad provides a much smoother experience that i have enjoyed much more thoroughly than easyeda lol :D"}]...
|
Title: My awesome macropad! by @aayanalikhan09 | S Title: My awesome macropad! by @aayanalikhan09 | Stardance
Devlogs:
Keypad :D Rn im trying to make a rock paper scissors type game with three keys and an oled with two leds im also switching permanently to kicad for my other project KiCAD is WAY easier to use and is so much less clunky notes for beginners: i was initially using EasyEDA, another free tool that im sure many use - i am no longer one of them lol easy eda was great for getting parts from the cloud and just wiring em up, but was horrible for the work itself and was rather unintuitive kicad provides a much smoother experience that i have enjoyed much more thoroughly than easyeda lol :D
I finally finished the PCB! : D I had to do some major rearranging for tracks(pcb wire connections), but it’s finally done! I have finished the PCB and I am now starting the preliminary stages of making a case for the PCB. explanation for other beginners :D i had to redo a lot of my wiring because i had thought that the components had to be facing a specific based on diagrams i saw that were not specific to my hardware. however, i did not check the hackpad docs, and therefore went through some quite unnecessary pain to rearrange all the tracks to accommodate such a major change. side note for beginners aka tldr:CHECK THE DOCUMENTATION ALWAYS ITS FOR YOUR OWN SANITY
ITS COMPLETE STICKER HERE I COME I finally finished the full design for my Rock Paper Scissors module! Some notes before I ship: This project requires TWO smaller M3x8 screws for the standoffs, but that shouldn’t be too much of a worry for me personally because I am very fortunate to have access to a robotics trove of parts. This project features an OLED panel along with two LEDs that are meant to display different states based on what the player chooses to play against the CPU. The initial display will feature text saying “RPS?” and the player will choose the corresponding key. Upon their selection, the game will then display if the player has won, tied, or lost to the CPU who has randomly chosen an option. I would’ve loved to add a speaker, but that’s not included in the kit :( - maybe something to suggest for the next round of hackpads! this is my first ship so im pretty excited to get the hardware and upload the code and make it work!
Added safety guidelines and updated the README! I checked the resources tab yesterday and realized my README was not up to par! So I decided to make it as polished as possible and also forgot to log some of the hours! oops :P Anywhooo the readme has been updated so that now most people who have a basic understanding of robotics stuff can make my project! If any of you guys choose to make this, please let me know! I think it would make a great little HCB prize if I’m being honest.
Ships:
hello! This is my first ship, so I will try to keep this succinct! My name is Aayan, and I hope to go very far with my designs, but for now, this is where they are! I have developed a Rock, Paper, Scissors toy that you can build yourself at home with the help of a soldering iron, a few extra screws, and a Hackpad kit! You simply choose an option, and the CPU will also randomly choose an option. The CPU will display the appropriate outcome based on whether you won, lost, or tied. Some initial challenges I faced in the development stages were the wiring for all the tracks! So many different configurations were made until I eventually landed on this! This, of course, was my first ever PCB, so there were bound to be many such configurations. I’m pretty proud of the idea I had for the integration of the LEDs as a more garnish-type element to accent the OLED panel display results. I initially was thinking to add a potentiometer for brightness control, but decided against it as it didn’t really add too much to the overall function of the project. Before you go ahead and get to printing, you should know this project is still in the dev stages and once its finished(which I will publish) it will be easy to setup. In the interim, I will post updates of the build progress and what bugs I may fix in the future. Thank you for reading and I hope to see you again soon :D...
|
1793252878.8719413
|
1793339278.8719413
|
|
20182
|
SidOS 1: Final Iteration by @SiddyG | Stardance
|
SiddyG
|
1
|
12.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T05:04:24Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a personal web OS for the HackClub WebOS 1 Jam. Through this experience, I learnt a great deal about what to do with elements, classes, IDs, functions, and much more. For my advanced app, I wanted to challenge myself and see what I could do with just a simple app window. I decided to embed a JS-coded game inside the window, and after a bit of brainstorming, I decided to add a classic-Atari-based PONG, which would contribute to a distinct feature in and of itself. I appreciate the learning experience and the great deal of knowledge I gained from building this. I hope you enjoy it, especially the game I spent a few hours building!", "repo": "https://github.com/SiddyG96/PersonalOS", "demo": "https://siddyg96.github.io/PersonalOS/"}]...
|
[{"post_id": 52790, "ts": "202 [{"post_id": 52790, "ts": "2026-08-23T04:14:51Z", "hours": 0.3683, "text": "Minor Tweaks to App Icons & Positioning Added absolute positioning to app icons Adjusted pong icon so it is aligned vertically and spacing is correct"}, {"post_id": 52776, "ts": "2026-08-23T03:47:12Z", "hours": 0.4142, "text": "Fixed Git Page not opening window(s): Made savedTop and savedLeft variables global Made openWindow and closeWindow functions global"}, {"post_id": 52718, "ts": "2026-08-23T01:11:54Z", "hours": 10.9767, "text": "(NOTE: Previous devlog deleted??? I will add everything I have done since the beginning here) OLD Highlights: Added welcome window and small bio Created Mini-Portfolio App Icon Added four sections to Mini-Portfolio (Home, Hobbies, Classes, Aspirations) NEW Highlights: Added a new app –> Pong (Atari Style) - Utilized seperate JS File for this (pong.js) - USE W and S to control paddle - AI Opponent; Singleplayer -Modified “Icon Click” logic to target the iconElement as well as windowId"}]...
|
Title: SidOS 1: Final Iteration by @SiddyG | Stard Title: SidOS 1: Final Iteration by @SiddyG | Stardance
Devlogs:
(NOTE: Previous devlog deleted??? I will add everything I have done since the beginning here) OLD Highlights: Added welcome window and small bio Created Mini-Portfolio App Icon Added four sections to Mini-Portfolio (Home, Hobbies, Classes, Aspirations) NEW Highlights: Added a new app –> Pong (Atari Style) - Utilized seperate JS File for this (pong.js) - USE W and S to control paddle - AI Opponent; Singleplayer -Modified “Icon Click” logic to target the iconElement as well as windowId
Fixed Git Page not opening window(s): Made savedTop and savedLeft variables global Made openWindow and closeWindow functions global
Minor Tweaks to App Icons & Positioning Added absolute positioning to app icons Adjusted pong icon so it is aligned vertically and spacing is correct
Ships:
I made a personal web OS for the HackClub WebOS 1 Jam. Through this experience, I learnt a great deal about what to do with elements, classes, IDs, functions, and much more. For my advanced app, I wanted to challenge myself and see what I could do with just a simple app window. I decided to embed a JS-coded game inside the window, and after a bit of brainstorming, I decided to add a classic-Atari-based PONG, which would contribute to a distinct feature in and of itself. I appreciate the learning experience and the great deal of knowledge I gained from building this. I hope you enjoy it, especially the game I spent a few hours building!...
|
1793246029.7749944
|
1793332429.7749944
|
|
20183
|
IronManOS by @raczjonathan12 | Stardance
|
raczjonathan12
|
1
|
15.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T19:17:52Z", "hours": 15.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A browser-based Iron Man OS — a desktop with a quiz app, a Jarvis video app, and an animated Suit HUD with live diagnostics and a spinning arc reactor. First time hand-coding HTML, CSS, and JS from scratch. Used AI to work through specific bugs and unfamiliar concepts, but wrote and understood the code myself.", "repo": "https://github.com/raczjonathan12/raczjonathan12.github.io", "demo": "https://raczjonathan12.github.io/"}]...
|
[{"post_id": 20203, "ts": "202 [{"post_id": 20203, "ts": "2026-07-01T19:05:46Z", "hours": 5.4783, "text": "Wrapping up IronManOS. Added the last piece - a Suit HUD app with live power diagnostics, a spinning arc reactor tied to the reactor readout, animated radar, and a boot sequence that reveals each panel in turn. Wrote a proper README and pushed everything live on GitHub Pages: https://raczjonathan12.github.io/ . This was my first time hand-coding HTML from scratch - no framework, no tutorial copy-paste. Building something this involved (animations, live data updates, a working desktop-style OS) while learning the language at the same time was the real challenge."}, {"post_id": 19374, "ts": "2026-06-30T17:38:59Z", "hours": 1.6233, "text": "Back on IronManOS after a break. This session: built the Jarvis app, click a button and a video plays. First time I’ve gotten video embedded and triggered inside an HTML file myself. Wasn’t hard exactly, just new - had to figure out the click handler and video element actually talking to each other."}, {"post_id": 12499, "ts": "2026-06-20T12:35:43Z", "hours": 8.3136, "text": "Hello everyone, this is my first devlog I’m currently building my IronManOS project, this is the first time I’m manually coding in HTML and not letting AI do all the work, that’s why it took me so long (8 hours and 16 minutes to be exact across 2 days). I just finished my first app on the OS which is a quiz app with 10 questions. Next I’m building a JARVIS app, just one line and a close, but it will be good practice."}]...
|
Title: IronManOS by @raczjonathan12 | Stardance
D Title: IronManOS by @raczjonathan12 | Stardance
Devlogs:
Hello everyone, this is my first devlog I’m currently building my IronManOS project, this is the first time I’m manually coding in HTML and not letting AI do all the work, that’s why it took me so long (8 hours and 16 minutes to be exact across 2 days). I just finished my first app on the OS which is a quiz app with 10 questions. Next I’m building a JARVIS app, just one line and a close, but it will be good practice.
Back on IronManOS after a break. This session: built the Jarvis app, click a button and a video plays. First time I’ve gotten video embedded and triggered inside an HTML file myself. Wasn’t hard exactly, just new - had to figure out the click handler and video element actually talking to each other.
Wrapping up IronManOS. Added the last piece - a Suit HUD app with live power diagnostics, a spinning arc reactor tied to the reactor readout, animated radar, and a boot sequence that reveals each panel in turn. Wrote a proper README and pushed everything live on GitHub Pages: https://raczjonathan12.github.io/ . This was my first time hand-coding HTML from scratch - no framework, no tutorial copy-paste. Building something this involved (animations, live data updates, a working desktop-style OS) while learning the language at the same time was the real challenge.
Ships:
A browser-based Iron Man OS — a desktop with a quiz app, a Jarvis video app, and an animated Suit HUD with live diagnostics and a spinning arc reactor. First time hand-coding HTML, CSS, and JS from scratch. Used AI to work through specific bugs and unfamiliar concepts, but wrote and understood the code myself....
|
1793285617.409408
|
1793372017.409408
|
|
20200
|
Numera by @Mubashir_Shah | Stardance
|
Mubashir_Shah
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-21T20:29:51Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "MathGen A tool which allows the user to generate a manim animation from an natural language prompt without having to write a single line of code. Try Demo → Description Type “derivative of sin(x)” and MathGen will generate the manim code for you and display the animation, along with the code so that you can change it or try out different prompts. MathGen is ideal for people who have struggled to grasp mathmatical concepts visually, and who dont want to spend hours learning an animation library just to produce a quick explainer video. Process The user types in a prompt This prompt is validated before being passed to an LLM The LLM (we used chatgpt 5.6 and claude fable 5) produces the manim code based on the prompt This code is then run and debugged on replit Finally, the animation is displayed along with the code used to produce it The stack includes HTML/CSS/JS for the frontend, FastAPI, Flask, Node for the backend, and Manim, Matplotlib, and sympy for the math and animations. Example Prompt: “derivative of sin(x)” Code: from manim import * import numpy as np class SinTangent(Scene): def construct(self): axes = Axes(x_range=[-4, 4, 1], y_range=[-2, 2, 1]) curve = axes.plot(lambda x: np.sin(x), color=BLUE) self.play(Create(axes), Create(curve)) x_tracker = ValueTracker(-4) def get_tangent_line(): x = x_tracker.get_value() slope = np.cos(x) point = axes.c2p(x, np.sin(x)) return Line( point + np.array([-1, -slope, 0]), point + np.array([1, slope, 0]), color=YELLOW, ) tangent = always_redraw(get_tangent_line) self.play(Create(tangent)) self.play(x_tracker.animate.set_value(4), run_time=6, rate_func=linear) This produces a 30 second long animation of a tangent line tracing around the curve y=sin(x). Installation git clone cd mathgen pip install -r requirements.txt add any missing setup commands for the frontent/backend here, and test them python app.py What was challenging Getting the LLM to produce working manim code in the first place was challenging, as there was a lot of trial and error involved in prompting it. The sympy dependency also proved to be somewhat challenging to setup, as one syntax error took several days to fix. Finally, making sure that the animation looked good while also being mathematically correct was also a balancing act. Future work The ability to change what rendering engine is used, and what mathematical fields are supported, with the ultimate goal of making a general purpose visual reasoning assistant for math.", "repo": "https://github.com/Mubashirshahhh/Numera", "demo": "https://polished-sardonic-demos.replit.app/"}]...
|
[{"post_id": 18581, "ts": "202 [{"post_id": 18581, "ts": "2026-06-29T19:31:03Z", "hours": 1.0689, "text": "First working prototype of Numera is officially up and running. I spent the last few days building the core system, and today I finally got to test it end to end. The results were really encouraging, the main idea works, and the prototype is performing much better than I expected. There’s still a lot that needs to be improved, polishing the UI, fixing edge cases, and making everything faster and more reliable. But getting from an idea to something that actually works pretty great. Excited to keep iterating and see where it goes next."}]...
|
Title: Numera by @Mubashir_Shah | Stardance
Devlo Title: Numera by @Mubashir_Shah | Stardance
Devlogs:
First working prototype of Numera is officially up and running. I spent the last few days building the core system, and today I finally got to test it end to end. The results were really encouraging, the main idea works, and the prototype is performing much better than I expected. There’s still a lot that needs to be improved, polishing the UI, fixing edge cases, and making everything faster and more reliable. But getting from an idea to something that actually works pretty great. Excited to keep iterating and see where it goes next.
Ships:
MathGen A tool which allows the user to generate a manim animation from an natural language prompt without having to write a single line of code. Try Demo → Description Type “derivative of sin(x)” and MathGen will generate the manim code for you and display the animation, along with the code so that you can change it or try out different prompts. MathGen is ideal for people who have struggled to grasp mathmatical concepts visually, and who dont want to spend hours learning an animation library just to produce a quick explainer video. Process The user types in a prompt This prompt is validated before being passed to an LLM The LLM (we used chatgpt 5.6 and claude fable 5) produces the manim code based on the prompt This code is then run and debugged on replit Finally, the animation is displayed along with the code used to produce it The stack includes HTML/CSS/JS for the frontend, FastAPI, Flask, Node for the backend, and Manim, Matplotlib, and sympy for the math and animations. Example Prompt: “derivative of sin(x)” Code: from manim import * import numpy as np class SinTangent(Scene): def construct(self): axes = Axes(x_range=[-4, 4, 1], y_range=[-2, 2, 1]) curve = axes.plot(lambda x: np.sin(x), color=BLUE) self.play(Create(axes), Create(curve)) x_tracker = ValueTracker(-4) def get_tangent_line(): x = x_tracker.get_value() slope = np.cos(x) point = axes.c2p(x, np.sin(x)) return Line( point + np.array([-1, -slope, 0]), point + np.array([1, slope, 0]), color=YELLOW, ) tangent = always_redraw(get_tangent_line) self.play(Create(tangent)) self.play(x_tracker.animate.set_value(4), run_time=6, rate_func=linear) This produces a 30 second long animation of a tangent line tracing around the curve y=sin(x). Installation git clone cd mathgen pip install -r requirements.txt add any missing setup commands for the frontent/backend here, and test them python app.py What was challenging Getting the LLM to produce working manim code in the first place was challenging, as there was a lot of trial and error involved in prompting it. The sympy dependency also proved to be somewhat challenging to setup, as one syntax error took several days to fix. Finally, making sure that the animation looked good while also being mathematically correct was also a balancing act. Future work The ability to change what rendering engine is used, and what mathematical fields are supported, with the ultimate goal of making a general purpose visual reasoning assistant for math....
|
1793134339.836344
|
1793220739.836344
|
|
20230
|
Sick tutoring buddy by @Anushaa | Stardance
|
Anushaa
|
1
|
14.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-29T15:13:15Z", "hours": 14.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I just made an sat tutoring buddy. I wanted to make this edtech project cause why not? but heres the thing : i couldnt use AI. SOOOOOOO it took me hoursss to debug, to fix the css (def the hardest part fsfs) i used clerk for auth, render to deploy and it is a react based web application that makes use of open ai api :) thats all thankyou", "repo": "https://github.com/pxrple6/satcram", "demo": "https://satcram.onrender.com/"}]...
|
[{"post_id": 37059, "ts": "202 [{"post_id": 37059, "ts": "2026-07-29T15:10:21Z", "hours": 2.1222, "text": "IM FINALLY DONE!!!!! alotttttt of errors, changes yadi yada later im finally done, i just deployed it and im so happy :))))) ill have my friends try it out too! def worth the hustle, i did use AI at the end to help me deploy and i forgot to mention that (about 40 minutes out of 14 hours so 5%)"}, {"post_id": 29306, "ts": "2026-07-16T04:07:47Z", "hours": 2.6531, "text": "done with the website, fixed ui, fixed backend using clerk for now :) will fix the rest later"}, {"post_id": 18214, "ts": "2026-06-29T08:48:12Z", "hours": 2.4228, "text": "learning node js today.. i swear i never thought id be working on the backend.. learned css n fixed ui also made changes in the signup page"}, {"post_id": 16136, "ts": "2026-06-26T07:13:14Z", "hours": 4.3822, "text": "i js completley changed the ui and made 2 pages the home as well as the test date tracking.. honestly it feels amazing when u fix stuff on ur own rather than rushing towards AI.. i know the css looks plain i will try to learn more components to add here… i spent 2 days on it and ive been travelling so i couldnt put in alot of time for my first page i think one of the best things i learn was the css box style– ive seen it being used alot b4 and it honestly was something i wanted to learn.. further something that MADE ME CRASH OUT was the navigation in the nav bar turns out “import { NavLink, useNavigate } from “react-router”; “ is the new command instead of “import { NavLink, useNavigate } from “react-router-dom”; and countless google searches n console updates later i realized im using v7 which has changed the import statement… the test dates page was fairly easy im using the react-calendar package.. ill try getting started on my sign up but i want a tutorial that will teach me how to make it super secure.. any guidance is appreciated :)"}, {"post_id": 13574, "ts": "2026-06-22T07:09:36Z", "hours": 1.4125, "text": "i js made the login page by myself instead of using premade templates"}, {"post_id": 10520, "ts": "2026-06-17T08:36:58Z", "hours": 0.5869, "text": "I js made a sign up page and im v happy with it.. I love making progress"}]...
|
Title: Sick tutoring buddy by @Anushaa | Stardance Title: Sick tutoring buddy by @Anushaa | Stardance
Devlogs:
I js made a sign up page and im v happy with it.. I love making progress
i js made the login page by myself instead of using premade templates
i js completley changed the ui and made 2 pages the home as well as the test date tracking.. honestly it feels amazing when u fix stuff on ur own rather than rushing towards AI.. i know the css looks plain i will try to learn more components to add here… i spent 2 days on it and ive been travelling so i couldnt put in alot of time for my first page i think one of the best things i learn was the css box style– ive seen it being used alot b4 and it honestly was something i wanted to learn.. further something that MADE ME CRASH OUT was the navigation in the nav bar turns out “import { NavLink, useNavigate } from “react-router”; “ is the new command instead of “import { NavLink, useNavigate } from “react-router-dom”; and countless google searches n console updates later i realized im using v7 which has changed the import statement… the test dates page was fairly easy im using the react-calendar package.. ill try getting started on my sign up but i want a tutorial that will teach me how to make it super secure.. any guidance is appreciated :)
learning node js today.. i swear i never thought id be working on the backend.. learned css n fixed ui also made changes in the signup page
done with the website, fixed ui, fixed backend using clerk for now :) will fix the rest later
IM FINALLY DONE!!!!! alotttttt of errors, changes yadi yada later im finally done, i just deployed it and im so happy :))))) ill have my friends try it out too! def worth the hustle, i did use AI at the end to help me deploy and i forgot to mention that (about 40 minutes out of 14 hours so 5%)
Ships:
I just made an sat tutoring buddy. I wanted to make this edtech project cause why not? but heres the thing : i couldnt use AI. SOOOOOOO it took me hoursss to debug, to fix the css (def the hardest part fsfs) i used clerk for auth, render to deploy and it is a react based web application that makes use of open ai api :) thats all thankyou...
|
1793249268.5564067
|
1793335668.5564067
|
|
20231
|
Tao - a wearable digital pet by @academicalvin | S Tao - a wearable digital pet by @academicalvin | Stardance...
|
academicalvin
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T03:29:03Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I tried replicating this digital pet I’ve seen on the internet and I absolutely love it. It’s not as sensor packed as the real thing but Tao packs an IMU, round LCD screen, haptic motor, and a temperature sensor. When turned on, it has a fun little expressive face that reacts to the world around it. Shake it –> it’ll get dizzy Leave it alone –> it gets sleepy Drop it –> it feels that Move it around –> its eyes moves", "repo": "https://github.com/alvi-n/TaoTheWearableDigitalPet", "demo": ""}]...
|
[{"post_id": 24416, "ts": "202 [{"post_id": 24416, "ts": "2026-07-07T23:22:51Z", "hours": 1.25, "text": "Time skip - I finished all the CAD and code for the project and I think it’s about time to submit! I added a charzard silkscreen design and it looks pretty cool the case has a pretty big back for the battery but I guess it’s not too noticable the main thing i’m not too sure about is the schematic and pcb wiring but hopefully if the design comes back to be for a redo I can do that fast this was a really fun project and I’m suprised myself i was able to remain consistent with this project"}, {"post_id": 22293, "ts": "2026-07-04T18:01:39Z", "hours": 1.9775, "text": "Taking out the NFC, Retracing Everything This took a little too long. Turns out since I didn’t have a LCD screen footprint I didn’t really know where the middle of the screen would be relative to the rest of the PCB. When I put everything into my 3d modeling software (Shapr3d), I realized it would be better if the screen was directly in the middle of the pcb by making it vertical. Which ultimately means I have to retrace almost everything."}, {"post_id": 18122, "ts": "2026-06-29T04:08:06Z", "hours": 3.1003, "text": "Honestly, I do not think I can get past the cut Spent too long trying to figure out how to make my own NFC chip antenna and for the time I’m trying to rush this project I don’t think I can. I think I will end up using a module with header pins for it instead of making it myself, it’s really devastating but for the sake of maintaining my enjoyment throughout this project I’m going to lower my scope."}, {"post_id": 15494, "ts": "2026-06-25T05:55:08Z", "hours": 1.3628, "text": "PCB routing - continued So far I believe I setted up the temperature sensor, motor driver, and accelerometer well and by that, I mean just the capacitors and resistors. I’m planning on putting this esp32 on the back side where I’ll also keep the battery so it doesn’t interfere with the lcd screen. This has been quite fun so far."}, {"post_id": 15364, "ts": "2026-06-24T23:49:22Z", "hours": 0.5, "text": "Outlining my pcb Not much was done in these 30 minutes, just imported a drawing of the shape of the pet."}, {"post_id": 14894, "ts": "2026-06-24T05:50:35Z", "hours": 0.8503, "text": "A little bit of this and a little bit of that. Today I started on my actual PCB design and turns out it’s harder than I thought. My schematic is like a maze, some lines in my schematic going two directions. Figuring out the best way to put everything is definitely a challenge. Tomorrow, I’ll start working on the edge cuts first and try to get 50% of the pcb wired."}, {"post_id": 13558, "ts": "2026-06-22T06:08:19Z", "hours": 2.3167, "text": "Tao Now Has an Accelerometer, NFC Reader, and a Temperature Sensor all powered by the xiao esp-32 s3 I never realized how powerful development boards are. Last session, I took an hour trying to figure out how make a buck converter, battery charger, and an external usb-c connector -> turns out the xiao board does all of that for me. Now instead of focusing my time on the power managing side of my project which was really confusing for me, I could now focus on adding additional fun elements to my project such as a haptic motor and temperature sensor Overall this project has been pretty fun so far, next step is working on the pcb layout and thinking about the shape of my digital pet."}, {"post_id": 10451, "ts": "2026-06-17T05:41:13Z", "hours": 1.0139, "text": "No modules, everything on a PCB. I’ve been seeing these digital pet accessories, similar to a Tamagotchi, on my feed a lot and the company selling these were listing them for ~$300 and I thought “I could definitely make this myself”. These things interact with the environment with some basic sensors which gives the face a signal to change its animation. Turns out its wayy harder than I thought to make myself. considering my only hardware project I’ve made was a macropad. There is a lot of pieces and I obviously haven’t built anything like this ever. Instead of adding modules that hook up to a breadboard, I realized that all of those parts can be added to the PCB itself and it all starts with the chip. I looked for the best chip for each of the different features and looked at the schematic for each. The only chip with a datasheet that actually made sense was for the battery charger, the rest…it took a bit more work. Anyways tomorrow, I’m planning on trying to finish the schematics so make sure to follow!"}]...
|
Title: Tao - a wearable digital pet by @academical Title: Tao - a wearable digital pet by @academicalvin | Stardance
Devlogs:
No modules, everything on a PCB. I’ve been seeing these digital pet accessories, similar to a Tamagotchi, on my feed a lot and the company selling these were listing them for ~$300 and I thought “I could definitely make this myself”. These things interact with the environment with some basic sensors which gives the face a signal to change its animation. Turns out its wayy harder than I thought to make myself. considering my only hardware project I’ve made was a macropad. There is a lot of pieces and I obviously haven’t built anything like this ever. Instead of adding modules that hook up to a breadboard, I realized that all of those parts can be added to the PCB itself and it all starts with the chip. I looked for the best chip for each of the different features and looked at the schematic for each. The only chip with a datasheet that actually made sense was for the battery charger, the rest…it took a bit more work. Anyways tomorrow, I’m planning on trying to finish the schematics so make sure to follow!
Tao Now Has an Accelerometer, NFC Reader, and a Temperature Sensor all powered by the xiao esp-32 s3 I never realized how powerful development boards are. Last session, I took an hour trying to figure out how make a buck converter, battery charger, and an external usb-c connector -> turns out the xiao board does all of that for me. Now instead of focusing my time on the power managing side of my project which was really confusing for me, I could now focus on adding additional fun elements to my project such as a haptic motor and temperature sensor Overall this project has been pretty fun so far, next step is working on the pcb layout and thinking about the shape of my digital pet.
A little bit of this and a little bit of that. Today I started on my actual PCB design and turns out it’s harder than I thought. My schematic is like a maze, some lines in my schematic going two directions. Figuring out the best way to put everything is definitely a challenge. Tomorrow, I’ll start working on the edge cuts first and try to get 50% of the pcb wired.
Outlining my pcb Not much was done in these 30 minutes, just imported a drawing of the shape of the pet.
PCB routing - continued So far I believe I setted up the temperature sensor, motor driver, and accelerometer well and by that, I mean just the capacitors and resistors. I’m planning on putting this esp32 on the back side where I’ll also keep the battery so it doesn’t interfere with the lcd screen. This has been quite fun so far.
Honestly, I do not think I can get past the cut Spent too long trying to figure out how to make my own NFC chip antenna and for the time I’m trying to rush this project I don’t think I can. I think I will end up using a module with header pins for it instead of making it myself, it’s really devastating but for the sake of maintaining my enjoyment throughout this project I’m going to lower my scope.
Taking out the NFC, Retracing Everything This took a little too long. Turns out since I didn’t have a LCD screen footprint I didn’t really know where the middle of the screen would be relative to the rest of the PCB. When I put everything into my 3d modeling software (Shapr3d), I realized it would be better if the screen was directly in the middle of the pcb by making it vertical. Which ultimately means I have to retrace almost everything.
Time skip - I finished all the CAD and code for the project and I think it’s about time to submit! I added a charzard silkscreen design and it looks pretty cool the case has a pretty big back for the battery but I guess it’s not too noticable the main thing i’m not too sure about is the schematic and pcb wiring but hopefully if the design comes back to be for a redo I can do that fast this was a really fun project and I’m suprised myself i was able to remain consistent with this project
Ships:
I tried replicating this digital pet I’ve seen on the internet and I absolutely love it. It’s not as sensor packed as the real thing but Tao packs an IMU, round LCD screen, haptic motor, and a temperature sensor. When turned on, it has a fun little expressive face that reacts to the world around it. Shake it –> it’ll get dizzy Leave it alone –> it gets sleepy Drop it –> it feels that Move it around –> its eyes moves...
|
1793152579.6275673
|
1793238979.6275673
|
|
20232
|
My first slack bot! by @MurodbekTuychiyev | Starda My first slack bot! by @MurodbekTuychiyev | Stardance...
|
MurodbekTuychiyev
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-04T14:00:40Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I successfully built and completed uz-bot , my very first interactive Slack bot! It uses Node.js and the Slack Bolt framework via Socket Mode. I registered three unique slash commands: /uz-bot-ping , /uz-bot-catfact , and /uz-bot-joke . I used AI to understand the core programming workflow and step-by-step logic. The code is public, and a professional README has been added to GitHub!", "repo": "https://github.com/Murodbektuychiyev/slack-bot/", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354/"}]...
|
[{"post_id": 22141, "ts": "202 [{"post_id": 22141, "ts": "2026-07-04T13:21:02Z", "hours": 0.3931, "text": "Today, I successfully built and completed my very first Slack bot called uz-bot ! 🚀 I configured it using JavaScript, Node.js, and the Slack Bolt framework via Socket Mode. I successfully registered and tested three custom slash commands: /uz-bot-ping to measure real-time latency, /uz-bot-catfact to fetch dynamic data from a public API, and /uz-bot-joke to bring some humor into the channel. Everything runs perfectly on my local environment, and I’ve pushed the clean code along with a professional README to my public GitHub repository. This is my first major project, and I used AI to better understand the workflow step-by-step. Ready to keep shipping! 🔥"}]...
|
Title: My first slack bot! by @MurodbekTuychiyev | Title: My first slack bot! by @MurodbekTuychiyev | Stardance
Devlogs:
Today, I successfully built and completed my very first Slack bot called uz-bot ! 🚀 I configured it using JavaScript, Node.js, and the Slack Bolt framework via Socket Mode. I successfully registered and tested three custom slash commands: /uz-bot-ping to measure real-time latency, /uz-bot-catfact to fetch dynamic data from a public API, and /uz-bot-joke to bring some humor into the channel. Everything runs perfectly on my local environment, and I’ve pushed the clean code along with a professional README to my public GitHub repository. This is my first major project, and I used AI to better understand the workflow step-by-step. Ready to keep shipping! 🔥
Ships:
I successfully built and completed uz-bot , my very first interactive Slack bot! It uses Node.js and the Slack Bolt framework via Socket Mode. I registered three unique slash commands: /uz-bot-ping , /uz-bot-catfact , and /uz-bot-joke . I used AI to understand the core programming workflow and step-by-step logic. The code is public, and a professional README has been added to GitHub!...
|
1793123668.5769324
|
1793210068.5769324
|
|
20255
|
Easy-4-Wheeled-Car by @Livinx77 | Stardance
|
Livinx77
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T19:06:45Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a car or at least, the base of a car, the most difficult part was maybe designing it because its made from scratch, the code, chasis, transmision, electrical schemes, everything, no references at all so I had to manage all the problems by myself and thats what im the proudest of, to be able to make things by myself and that they later work. when building it, I advise to be as precise as posible with the meassures and that they use WD-40 on the gears bc it lowkey gets stuck sometimes", "repo": "https://github.com/Livinx77/Easy-and-simple-4-wheeled-car", "demo": ""}]...
|
[{"post_id": 11447, "ts": "202 [{"post_id": 11447, "ts": "2026-06-18T18:31:16Z", "hours": 0.5169, "text": "This is my first devlog, really excited To start the backstory of this is that I wanted to make a silly lil vehicle for myself and leave it there, So as anyone would do, I looked up a tutorial, and all I saw was projects with 3d printing (wich i dont have) and electronics that their only purpose is a vehicle, so I kinda got pissed off and made it myself (engineer mentality) and it took me a bit more than I expected so I think it is worth posting. In addition, I wanted to develop it further, but due to me not having the resources, and that it alr works, I left it here, tho I can help with the 2 most important things I wanted to add; Bluetooth and some kind of suspension, bc I alr have them mapped out The funcionality is pretty simple, the car can go back and forth, turn and no more (Its just a base what did you expect) but it can be improved in many ways and its easy to mod and build. The sole purpose is just being simple and needing little resources Wich speaking of, you will need: An arduino (or any microcontroler tho esp32 is the one i advise bc it has bluetooth), jumper cables, a L293D integrated circuit, a protoboard, 4 buttons, a DC motor, a servo, wheels, axles, and a chasis (left one in github, check it out) The detailed instructions and details will be on github, feel free to ask any question (Dont mind my poorly made car pls)"}]...
|
Title: Easy-4-Wheeled-Car by @Livinx77 | Stardance Title: Easy-4-Wheeled-Car by @Livinx77 | Stardance
Devlogs:
This is my first devlog, really excited To start the backstory of this is that I wanted to make a silly lil vehicle for myself and leave it there, So as anyone would do, I looked up a tutorial, and all I saw was projects with 3d printing (wich i dont have) and electronics that their only purpose is a vehicle, so I kinda got pissed off and made it myself (engineer mentality) and it took me a bit more than I expected so I think it is worth posting. In addition, I wanted to develop it further, but due to me not having the resources, and that it alr works, I left it here, tho I can help with the 2 most important things I wanted to add; Bluetooth and some kind of suspension, bc I alr have them mapped out The funcionality is pretty simple, the car can go back and forth, turn and no more (Its just a base what did you expect) but it can be improved in many ways and its easy to mod and build. The sole purpose is just being simple and needing little resources Wich speaking of, you will need: An arduino (or any microcontroler tho esp32 is the one i advise bc it has bluetooth), jumper cables, a L293D integrated circuit, a protoboard, 4 buttons, a DC motor, a servo, wheels, axles, and a chasis (left one in github, check it out) The detailed instructions and details will be on github, feel free to ask any question (Dont mind my poorly made car pls)
Ships:
I made a car or at least, the base of a car, the most difficult part was maybe designing it because its made from scratch, the code, chasis, transmision, electrical schemes, everything, no references at all so I had to manage all the problems by myself and thats what im the proudest of, to be able to make things by myself and that they later work. when building it, I advise to be as precise as posible with the meassures and that they use WD-40 on the gears bc it lowkey gets stuck sometimes...
|
1793242552.6496038
|
1793328952.6496038
|
|
20269
|
Social Media Website (YSX) by @AuraMonster | Stard Social Media Website (YSX) by @AuraMonster | Stardance...
|
AuraMonster
|
1
|
61.45
|
1074
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T00:44:15Z", "hours": 61.0, "multiplier": 17.75, "payout": 1074, "blessing": "neutral", "text": "This is YSX! A social media website where you can do pretty much anything! This project took a lot of time because of all the complex code involved with it. Fortunately, UI libraries (Such as ShadCN and Radix UI) and frameworks (such as Next.JS), as well as AI and other stuff helped me overcome this. IMPORTANT NOTE FOR SHIPWRIGHTS: IF YOU WANT TO TEST ADMIN PLEASE DM ME ON SLACK (username: mdmutahhar24).", "repo": "https://github.com/mdmutahhar24-pixel/YSX", "demo": "https://ysx-mu.vercel.app/"}]...
|
[{"post_id": 25748, "ts": "202 [{"post_id": 25748, "ts": "2026-07-10T05:57:49Z", "hours": 0.45, "text": "reship"}, {"post_id": 23816, "ts": "2026-07-06T23:48:56Z", "hours": 6.0539, "text": "Eleventh and final Devlog for YSX Social Media Website :D Changes: Removed empty screen from home page Heavy UI Changes Added Search bar to create Conversation Share, Comment Added Dislike removed Scrapped some ideas (or will come next ship) Updated Changelog so that it fits release New Features: Home Screen got added You can Now comment and share Files now compress in Chat but takes longer for larger files background around your name if you are creator of the post and you commented on it. Project will be shipped out soon :) (Image is admin POV)"}, {"post_id": 17752, "ts": "2026-06-28T17:50:39Z", "hours": 3.8953, "text": "Tenth Devlog for YSX Social Media Website Changes: Feed bug fixed and works again Liked button remains toggled even after refreshing the page Added a UI Sheet (from ShadCN) to comments button (Comments not finished) Switched from custom attachment style to using UI library’s attachment New Features: Ban Page (redirected when user is banned) In Progress: Comments Algorithm Chat Rework Feed Ban Expiry Being able to attach large files to chat Future Plans (Subject to Change): More features on Settings page Changelog upon release More (If you guys have any more ideas, I could use them!)"}, {"post_id": 16610, "ts": "2026-06-27T00:50:38Z", "hours": 4.315, "text": "Ninth Devlog for YSX Social Media Website Changes: UI Changes Chat Bug fixes New Features: Admin Features section now added! Frontend for Admin features Frontend Ban feature for admins In Progress: Chat UI revamp due to ShadCN (UI library) adding a message component Admin Features backend Ban backend Future Plans(subject to change): Being able to attach large files to chat Setting Page more features More loading pages Bug fixes More"}, {"post_id": 16033, "ts": "2026-06-26T01:13:55Z", "hours": 5.1086, "text": "Eight Devlog for YSX Social Media Website Changes: Added a posts tag feature Heavy UI changes and Bug fixes New Features: Added Banner Change feature Added Profile picture change feature Added scoring system (AKA an algorithm that tracks what you watch) Account Page now complete! You can also now delete your account via the settings page In Progress: Chat Page down due to multiple errors (trying to fix) Algorithm bug fixes Future plans (Subject to change): New features to settings page Ability to attach large files to chat Admin features Posts’ like, dislike, comment, share (crucial for algorithm) More"}, {"post_id": 15393, "ts": "2026-06-25T00:55:18Z", "hours": 8.6514, "text": "Seventh Devlog for YSX Social Media website Changes: Multiple bugs were fixed Loading Screens added for only a few pages New Features: Notifications now work! (This took me a long time and lots of frustration) Change description feature added In Progress: Banner change (frontend) Profile Picture change (frontend and backend) Settings Page Skeletons (loading pages) for other pages Future Plans (Subject to change): Being able to attach large files to chat (pushed off for later) Reels Algorithm Admin Features Post Editing Chat Editing Post likes, dislikes, messaging, share More"}, {"post_id": 14010, "ts": "2026-06-23T00:00:49Z", "hours": 5.8522, "text": "Sixth Devlog for YSX Social Media Website Changes: Chat Input styling Changed Messages styling Changed New Features: You can now attach small images/videos to chat Backend resolved for images/video attachments Mobile Support for chatting In Progress: Account Profile Picture changing being able to attach large files Account Banner Picture changing Account Page Settings Page Future Features (Subject to Change): Add comment, share, and like/dislike on posts Post editing Changelog editing upon release Admin Features Featured Posts Status for chatting Continually add mobile support for upcoming features"}, {"post_id": 13298, "ts": "2026-06-21T19:36:50Z", "hours": 2.9967, "text": "Fifth Devlog of YSX Social Media Website Changes: None New Features: Typing messages now works Backend added for Messaging Both users get messages and are automatically added to a conversation if one users starts it. In Progress: Account page Settings Page Future Things (To-Do list): Add attachments to messaging Add delete button to Posting Make a posts/reels algorithm Add User status on messaging page More (Subject to change)"}, {"post_id": 12700, "ts": "2026-06-20T18:55:57Z", "hours": 2.7692, "text": "Fourth Devlog of YSX Social Media Website Changes: Layout positioning UI design Instead of Relying on built in auth, created a synchronized table for extra features. New Features: Added and Completed Create Chat/Conversation Completed Backend to create chat In Progress: Messaging screen Sidebar Trigger fixed position Planned Features (Subject to change): Profile image changeable Chatting completion Likes/Dislikes feature on posts Comment Feature Share Feature Account and setting pages More undecided…"}, {"post_id": 12266, "ts": "2026-06-20T01:00:45Z", "hours": 6.4089, "text": "Third Devlog for YSX Social Media Website What is YSX? It is a social media website similar to websites like X, instagram, tik tok, etc. Changes: Added changelog section Chatting UI layout complete Chatting backend in progress Worked on UI Style Changes Made Chatting UI layout unique to YSX and no other social media website."}, {"post_id": 11571, "ts": "2026-06-18T21:09:22Z", "hours": 4.6431, "text": "Second Devlog for YSX Social Media Website What is YSX? A social media website. Changes: Added form to post (no built-in recorder) Added Backend to store posts information Added Feed page (Holds all posts) Added Likes feature Added Backend for Likes Log Out and Delete feature added (Incomplete) Mobile support built in Fixed text going under post instead of on top. Added reel snapping Added placeholder incase of no posts"}, {"post_id": 10973, "ts": "2026-06-18T00:07:27Z", "hours": 9.9475, "text": "First Devlog for YSX What is YSX? YSX is a social media website, like instagram, tiktok, x, etc. Why Make This? It’s fun. Added: Register Page Log In Page Sidebar Navigation Reel Creation Custom Logo Backend UI Redirects based on status (logged in/not logged in) Dark/Light Mode"}]...
|
Title: Social Media Website (YSX) by @AuraMonster Title: Social Media Website (YSX) by @AuraMonster | Stardance
Devlogs:
First Devlog for YSX What is YSX? YSX is a social media website, like instagram, tiktok, x, etc. Why Make This? It’s fun. Added: Register Page Log In Page Sidebar Navigation Reel Creation Custom Logo Backend UI Redirects based on status (logged in/not logged in) Dark/Light Mode
Second Devlog for YSX Social Media Website What is YSX? A social media website. Changes: Added form to post (no built-in recorder) Added Backend to store posts information Added Feed page (Holds all posts) Added Likes feature Added Backend for Likes Log Out and Delete feature added (Incomplete) Mobile support built in Fixed text going under post instead of on top. Added reel snapping Added placeholder incase of no posts
Third Devlog for YSX Social Media Website What is YSX? It is a social media website similar to websites like X, instagram, tik tok, etc. Changes: Added changelog section Chatting UI layout complete Chatting backend in progress Worked on UI Style Changes Made Chatting UI layout unique to YSX and no other social media website.
Fourth Devlog of YSX Social Media Website Changes: Layout positioning UI design Instead of Relying on built in auth, created a synchronized table for extra features. New Features: Added and Completed Create Chat/Conversation Completed Backend to create chat In Progress: Messaging screen Sidebar Trigger fixed position Planned Features (Subject to change): Profile image changeable Chatting completion Likes/Dislikes feature on posts Comment Feature Share Feature Account and setting pages More undecided…
Fifth Devlog of YSX Social Media Website Changes: None New Features: Typing messages now works Backend added for Messaging Both users get messages and are automatically added to a conversation if one users starts it. In Progress: Account page Settings Page Future Things (To-Do list): Add attachments to messaging Add delete button to Posting Make a posts/reels algorithm Add User status on messaging page More (Subject to change)
Sixth Devlog for YSX Social Media Website Changes: Chat Input styling Changed Messages styling Changed New Features: You can now attach small images/videos to chat Backend resolved for images/video attachments Mobile Support for chatting In Progress: Account Profile Picture changing being able to attach large files Account Banner Picture changing Account Page Settings Page Future Features (Subject to Change): Add comment, share, and like/dislike on posts Post editing Changelog editing upon release Admin Features Featured Posts Status for chatting Continually add mobile support for upcoming features
Seventh Devlog for YSX Social Media website Changes: Multiple bugs were fixed Loading Screens added for only a few pages New Features: Notifications now work! (This took me a long time and lots of frustration) Change description feature added In Progress: Banner change (frontend) Profile Picture change (frontend and backend) Settings Page Skeletons (loading pages) for other pages Future Plans (Subject to change): Being able to attach large files to chat (pushed off for later) Reels Algorithm Admin Features Post Editing Chat Editing Post likes, dislikes, messaging, share More
Eight Devlog for YSX Social Media Website Changes: Added a posts tag feature Heavy UI changes and Bug fixes New Features: Added Banner Change feature Added Profile picture change feature Added scoring system (AKA an algorithm that tracks what you watch) Account Page now complete! You can also now delete your account via the settings page In Progress: Chat Page down due to multiple errors (trying to fix) Algorithm bug fixes Future plans (Subject to change): New features to settings page Ability to attach large files to chat Admin features Posts’ like, dislike, comment, share (crucial for algorithm) More
Ninth Devlog for YSX Social Media Website Changes: UI Changes Chat Bug fixes New Features: Admin Features section now added! Frontend for Admin features Frontend Ban feature for admins In Progress: Chat UI revamp due to ShadCN (UI library) adding a message component Admin Features backend Ban backend Future Plans(subject to change): Being able to attach large files to chat Setting Page more features More loading pages Bug fixes More
Tenth Devlog for YSX Social Media Website Changes: Feed bug fixed and works again Liked button remains toggled even after refreshing the page Added a UI Sheet (from ShadCN) to comments button (Comments not finished) Switched from custom attachment style to using UI library’s attachment New Features: Ban Page (redirected when user is banned) In Progress: Comments Algorithm Chat Rework Feed Ban Expiry Being able to attach large files to chat Future Plans (Subject to Change): More features on Settings page Changelog upon release More (If you guys have any more ideas, I could use them!)
Eleventh and final Devlog for YSX Social Media Website :D Changes: Removed empty screen from home page Heavy UI Changes Added Search bar to create Conversation Share, Comment Added Dislike removed Scrapped some ideas (or will come next ship) Updated Changelog so that it fits release New Features: Home Screen got added You can Now comment and share Files now compress in Chat but takes longer for larger files background around your name if you are creator of the post and you commented on it. Project will be shipped out soon :) (Image is admin POV)
reship
Ships:
This is YSX! A social media website where you can do pretty much anything! This project took a lot of time because of all the complex code involved with it. Fortunately, UI libraries (Such as ShadCN and Radix UI) and frameworks (such as Next.JS), as well as AI and other stuff helped me overcome this. IMPORTANT NOTE FOR SHIPWRIGHTS: IF YOU WANT TO TEST ADMIN PLEASE DM ME ON SLACK (username: mdmutahhar24)....
|
1793127148.3566325
|
1793213548.3566325
|
|
20274
|
Pokédle by @maruscarebecca | Stardance
|
maruscarebecca
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T21:44:24Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My most recent (and second ever) web project is something I’ve been looking forward to building for a while :)) I love playing my dopamine dose of daily games and decided to put my own spin on a wordle clone, and made Pokedle. I’ve loved Pokemon since I was little and my older brother taught me the art of the GBA Emulator on my barely functional Motorola phone, and to this day the obsession hasn’t left me, so here we are! I’m definitely still not in my element in web, but this was a fun way of getting some practice in! Definitely suffered a lot less than last time, so I’m seeing improvements, at the least:)) Once I get better at web I’ll definitely add more animations and make it look 10x better, but for now I’m pretty proud of my (small, but worthy!) coding accomplishment.", "repo": "https://github.com/rebecca-marusca/Pokedle", "demo": "https://pokedle-lilac.vercel.app/"}]...
|
[{"post_id": 10907, "ts": "202 [{"post_id": 10907, "ts": "2026-06-17T21:38:14Z", "hours": 0.3383, "text": "Added a title and made the final message pop out a bit more, then deployed and edited the readme file for the repo Also got sidetracked and addded a bunch of 5 letter pokemon names to the words.js file"}, {"post_id": 10891, "ts": "2026-06-17T21:00:30Z", "hours": 1.0633, "text": "Finished the base game functionality - now the keyboard’s keys change colors based on their status! Crazy:)) And played around with some different Pokemon-esque colors (not quite it yet, but I wanted to get rid of the boring white backround and not vibrant enough yellow) Now I want to make it prettier, add a title and make the You won! or You lose! message more prominent. Also need to come up with more 5 letter pokemon as eligible answers, maybe in a future rendition I’ll make it work for any no. of letters, and make it only accept as valid guesses actual pokemon."}, {"post_id": 10839, "ts": "2026-06-17T19:45:04Z", "hours": 1.0719, "text": "Finished implementing the keyboard and I can now type, delete, enter. Up next I’m working on actually checking the guesses and coloring letters:))"}, {"post_id": 10795, "ts": "2026-06-17T18:24:54Z", "hours": 0.9539, "text": "Started working on my pokemon themed wordle :)) Made 3 key components - board, tile, and keyboard, and started working on some of the board logic."}]...
|
Title: Pokédle by @maruscarebecca | Stardance
Dev Title: Pokédle by @maruscarebecca | Stardance
Devlogs:
Started working on my pokemon themed wordle :)) Made 3 key components - board, tile, and keyboard, and started working on some of the board logic.
Finished implementing the keyboard and I can now type, delete, enter. Up next I’m working on actually checking the guesses and coloring letters:))
Finished the base game functionality - now the keyboard’s keys change colors based on their status! Crazy:)) And played around with some different Pokemon-esque colors (not quite it yet, but I wanted to get rid of the boring white backround and not vibrant enough yellow) Now I want to make it prettier, add a title and make the You won! or You lose! message more prominent. Also need to come up with more 5 letter pokemon as eligible answers, maybe in a future rendition I’ll make it work for any no. of letters, and make it only accept as valid guesses actual pokemon.
Added a title and made the final message pop out a bit more, then deployed and edited the readme file for the repo Also got sidetracked and addded a bunch of 5 letter pokemon names to the words.js file
Ships:
My most recent (and second ever) web project is something I’ve been looking forward to building for a while :)) I love playing my dopamine dose of daily games and decided to put my own spin on a wordle clone, and made Pokedle. I’ve loved Pokemon since I was little and my older brother taught me the art of the GBA Emulator on my barely functional Motorola phone, and to this day the obsession hasn’t left me, so here we are! I’m definitely still not in my element in web, but this was a fun way of getting some practice in! Definitely suffered a lot less than last time, so I’m seeing improvements, at the least:)) Once I get better at web I’ll definitely add more animations and make it look 10x better, but for now I’m pretty proud of my (small, but worthy!) coding accomplishment....
|
1793270956.0715728
|
1793357356.0715728
|
|
20293
|
Utiliy Tools Website by @timon | Stardance
|
timon
|
1
|
17.0
|
58
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-26T23:07:18Z", "hours": 17.0, "multiplier": 3.33, "payout": 58, "blessing": "neutral", "text": "I built a utility hub featuring two main categories Chance & Decisions and Time & Progress. The idea came to me because I was constantly switching between different sites for tools. I realized that while I use these features every week, I always end up on a completely different website every time I search for them. So I decided to build a central hub where everything is in one place. Im proud that I learned much JavaScript. Especially because the website includes multiple sites that some use similar but slightly different js code. It was a great way for me to learn even more becuase there were small differences which was perfect for the beginning! Ofcourse everyone can / should use the code for themselves and maybe learn from it or create new things. ( Even though I can probably learn even more…). You can always add Issues in github and I will tryto fix them :) (i hope there arent any..)", "repo": "https://github.com/Facticee/manager", "demo": "https://utilies-tool.vercel.app"}]...
|
[{"post_id": 16568, "ts": "202 [{"post_id": 16568, "ts": "2026-06-26T22:56:46Z", "hours": 2.0, "text": "I finished the Spin the wheel. The logic itself wasnt too bad, but handeling with multipleclicks i didnt get that at first. If you clicked the “Turn” button while the wheel was already spinning, the animations would stack, the timer would go crazy, and the wheel would just glitch out. I had to completely clean up the animation loop. (with ai troubleshooting) Now, every single time you hit that button, it instantly cancels the previous requestAnimationFrame and starts new again. Once the wheel was done, I built two more tools. A Local Time clock and a World Time dashboard. While building them, I learned much… I used to write way too much code formatting dates and strings manually. Then I found out JavaScript has a built-in code for this: document.getElementById(‘live-uhr’).textContent = now.toLocaleTimeString(); I dont even know how I didnt know about this.. Though, I do now…"}, {"post_id": 15862, "ts": "2026-06-25T19:47:56Z", "hours": 9.0, "text": "This is gonna be a big devlog, since i forgot to make one in between. I added two new features and i am currently working on the next one. Coinflip It is a minimalist coinflip feature where you just click a button and a animation comes which tells heads or tails. There was a Problem. At first when you would click throw multiple times while still in animation, the logic wouldnt work and the results from the first press of the button would come during the the animation of the (for example) fourth throw. To fix that i added let isFlipping = false; and if (isFlipping) return; in the main function. How many days till You put in a date and it calcualtes for you, how many days, hours and minutes it is till that date (00:00 time). The problem was with the time zones so i added: const targetDate = new Date(targetDateInput.value + “T00 : 00 : 00); (dont wonder it would be without spaces between the zeors but it wont let me here in the devlog menu) The third one will be a spin the wheel feature, where you can add your own names and it will pick one. Though, im currently struggeling with the java script… so that the browser would always assume local time midnight!"}, {"post_id": 12667, "ts": "2026-06-20T18:09:28Z", "hours": 2.0, "text": "Final homepage (probably). I finished how to topics will look in the grid and i am currently working on the first site “Random Number”. Its just an easy random number, where you pick the min and max number. The design of the element is nearly done and then im going to work on the java script for the Randomness :)"}, {"post_id": 10515, "ts": "2026-06-17T08:18:17Z", "hours": 0.0, "text": "I made an update on the design. Initially, the background was too flahsy and the cards too dark, making it look weird. To fix this, I decided to go with a more simple and basic theme. I think it looks way better as its more simple and basic."}, {"post_id": 10214, "ts": "2026-06-16T20:43:29Z", "hours": 1.0, "text": "I finished the basic design of the Website. I will keep tweaking with the colors of the background and the cards as they dont match that good yet. I tried many designs and also tried vertical but I noticed that when i categorize them, horizontal would work and look better."}]...
|
Title: Utiliy Tools Website by @timon | Stardance
Title: Utiliy Tools Website by @timon | Stardance
Devlogs:
I finished the basic design of the Website. I will keep tweaking with the colors of the background and the cards as they dont match that good yet. I tried many designs and also tried vertical but I noticed that when i categorize them, horizontal would work and look better.
I made an update on the design. Initially, the background was too flahsy and the cards too dark, making it look weird. To fix this, I decided to go with a more simple and basic theme. I think it looks way better as its more simple and basic.
Final homepage (probably). I finished how to topics will look in the grid and i am currently working on the first site “Random Number”. Its just an easy random number, where you pick the min and max number. The design of the element is nearly done and then im going to work on the java script for the Randomness :)
This is gonna be a big devlog, since i forgot to make one in between. I added two new features and i am currently working on the next one. Coinflip It is a minimalist coinflip feature where you just click a button and a animation comes which tells heads or tails. There was a Problem. At first when you would click throw multiple times while still in animation, the logic wouldnt work and the results from the first press of the button would come during the the animation of the (for example) fourth throw. To fix that i added let isFlipping = false; and if (isFlipping) return; in the main function. How many days till You put in a date and it calcualtes for you, how many days, hours and minutes it is till that date (00:00 time). The problem was with the time zones so i added: const targetDate = new Date(targetDateInput.value + “T00 : 00 : 00); (dont wonder it would be without spaces between the zeors but it wont let me here in the devlog menu) The third one will be a spin the wheel feature, where you can add your own names and it will pick one. Though, im currently struggeling with the java script… so that the browser would always assume local time midnight!
I finished the Spin the wheel. The logic itself wasnt too bad, but handeling with multipleclicks i didnt get that at first. If you clicked the “Turn” button while the wheel was already spinning, the animations would stack, the timer would go crazy, and the wheel would just glitch out. I had to completely clean up the animation loop. (with ai troubleshooting) Now, every single time you hit that button, it instantly cancels the previous requestAnimationFrame and starts new again. Once the wheel was done, I built two more tools. A Local Time clock and a World Time dashboard. While building them, I learned much… I used to write way too much code formatting dates and strings manually. Then I found out JavaScript has a built-in code for this: document.getElementById(‘live-uhr’).textContent = now.toLocaleTimeString(); I dont even know how I didnt know about this.. Though, I do now…
Ships:
I built a utility hub featuring two main categories Chance & Decisions and Time & Progress. The idea came to me because I was constantly switching between different sites for tools. I realized that while I use these features every week, I always end up on a completely different website every time I search for them. So I decided to build a central hub where everything is in one place. Im proud that I learned much JavaScript. Especially because the website includes multiple sites that some use similar but slightly different js code. It was a great way for me to learn even more becuase there were small differences which was perfect for the beginning! Ofcourse everyone can / should use the code for themselves and maybe learn from it or create new things. ( Even though I can probably learn even more…). You can always add Issues in github and I will tryto fix them :) (i hope there arent any..)...
|
1792882030.6848533
|
1793746030.6848533
|
|
20297
|
wld-gas-web by @parthv | Stardance
|
parthv
|
1
|
3.0
|
19
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T20:43:31Z", "hours": 3.0, "multiplier": 10.69, "payout": 19, "blessing": "neutral", "text": "I made a web port of my AP CSA final project, Weird Little Dude Gets a Sandwich. This is a 2D platformer game that follows the story of Weird Little Dude (WLD), and their journey of escaping the Computer to get a Sandwich. There were many challenges for the web port. To start, I had to completely implement TeaVM support into my Gradle project, as I initially had no plans for HTML5. I spent around an hour (undocumented) figuring out libGDX documentation, HTML tags and basic JS that tbh, I should’ve known already. In addition, I had many bugs that existed in the desktop build that I swept under the rug but had to fix for a stable build, but all together I believe this turned out better than I imagined. Note: Mobile support is not implemented, and currently there are no plans to support mobile. The game should be played on a desktop computer for the best experience :D", "repo": "https://github.com/pvparthverma/wld-gas-web", "demo": "https://parthv.online/play/"}]...
|
[{"post_id": 10872, "ts": "202 [{"post_id": 10872, "ts": "2026-06-17T20:31:31Z", "hours": 0.3986, "text": "bug was happening where preloader wasnt finding cheering.mp3. this was because app.js was live before cheering.mp3 was served, but its all fixed now. view at https://parthv.online/play 😄"}, {"post_id": 10841, "ts": "2026-06-17T19:46:28Z", "hours": 0.7425, "text": "changing sounds around, adding a couple checks to enhance ux. im going to fix a bug with the final level not showing win screen, and after that ill ship :)"}, {"post_id": 10806, "ts": "2026-06-17T18:43:22Z", "hours": 0.8469, "text": "researching headers for embeds within social media to find optimal metadata"}, {"post_id": 10396, "ts": "2026-06-17T02:31:09Z", "hours": 1.025, "text": "embedding game into website"}]...
|
Title: wld-gas-web by @parthv | Stardance
Devlogs Title: wld-gas-web by @parthv | Stardance
Devlogs:
embedding game into website
researching headers for embeds within social media to find optimal metadata
changing sounds around, adding a couple checks to enhance ux. im going to fix a bug with the final level not showing win screen, and after that ill ship :)
bug was happening where preloader wasnt finding cheering.mp3. this was because app.js was live before cheering.mp3 was served, but its all fixed now. view at https://parthv.online/play 😄
Ships:
I made a web port of my AP CSA final project, Weird Little Dude Gets a Sandwich. This is a 2D platformer game that follows the story of Weird Little Dude (WLD), and their journey of escaping the Computer to get a Sandwich. There were many challenges for the web port. To start, I had to completely implement TeaVM support into my Gradle project, as I initially had no plans for HTML5. I spent around an hour (undocumented) figuring out libGDX documentation, HTML tags and basic JS that tbh, I should’ve known already. In addition, I had many bugs that existed in the desktop build that I swept under the rug but had to fix for a stable build, but all together I believe this turned out better than I imagined. Note: Mobile support is not implemented, and currently there are no plans to support mobile. The game should be played on a desktop computer for the best experience :D...
|
1793242513.3169692
|
1793328913.3169692
|
|
20320
|
FLAPPY NYAN CAT by @abhinavP | Stardance
|
abhinavP
|
1
|
9.0
|
48
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-22T07:24:05Z", "hours": 9.0, "multiplier": 5.18, "payout": 48, "blessing": "neutral", "text": "I made a Flappy Bird clone where you play as Nyan Cat flying through Mario-style pipes. The whole game runs in the browser as a single HTML file with no installs or dependencies, and everything including Nyan Cat, the rainbow trail, the pipes, and the boosters are drawn from scratch every frame using the HTML5 Canvas API. The hardest part was getting it to actually run in the browser. I originally built it in Python with Pygame but Codespaces has no display so I had to learn how to convert the whole thing to JavaScript using the Canvas API and rewrite all the drawing logic from scratch. I am most proud of the rainbow trail and the procedural Nyan Cat animation. The legs, tail, and body all animate using sine waves so there are zero image files in the entire project. To test it just open the link, press SPACE or tap the screen to flap, and try to collect the boosters. The star makes you invincible, the mushroom makes you giant, the lightning bolt slows the pipes down, and the coins give you +5 points.", "repo": "https://github.com/Mysterio122/NYAN-BIRD", "demo": "https://mysterio122.github.io/NYAN-BIRD/"}]...
|
[{"post_id": 32835, "ts": "202 [{"post_id": 32835, "ts": "2026-07-22T07:22:18Z", "hours": 1.7508, "text": "Fixing Small Bugs and Issues in final code. ALL DONE!! ENJOY!"}, {"post_id": 23854, "ts": "2026-07-07T01:23:19Z", "hours": 1.8333, "text": "Game start instructions: Creation of frames and layering the background: Making an RGB color-shifting background: Making score, best score, and active booster timers. : Making the starting scene"}, {"post_id": 23339, "ts": "2026-07-06T07:06:51Z", "hours": 1.6, "text": "Making the invincible boundary for the cat : Making the pipe spawning system: Making pipe movement and scoring : Booster and pipe Collision : and pipe cleanup after it leaves the screen."}, {"post_id": 22446, "ts": "2026-07-04T22:21:32Z", "hours": 0.6053, "text": "I was making the pipe and live update system. I noticed that I made a huge error in the code by forgetting to name a variable, and that led to quite a bit of debugging."}, {"post_id": 21965, "ts": "2026-07-04T05:40:56Z", "hours": 1.385, "text": "I was finishing the booster system and started on the particles, but I ran into a few errors while debugging, and I fixed those too."}, {"post_id": 21344, "ts": "2026-07-03T07:16:08Z", "hours": 0.3333, "text": "Getting the code for the boosters finished up: Will most likely come back and add more boosters: The stars in the back are going to come out very nice"}, {"post_id": 21330, "ts": "2026-07-03T06:45:15Z", "hours": 1.7386, "text": "This code handles all the basic setup and visual building blocks of the entire game. The draw_nyan_cat function makes the character form very simple shapes every frame. It also scales up and turns yellow when interacting with power-ups. Rainbow_Trail stores the cat’s last 30 positions and draws the layered color ribbon behind it. The Stars function scrolls 60 twinkling dots across the background of the parallax effect. The Pipe function draws the classic green obstacle pairs and has collision rectangles. The booster is a scrolling collectible that bobs and changes the cat’s visual structure when collected."}]...
|
Title: FLAPPY NYAN CAT by @abhinavP | Stardance
D Title: FLAPPY NYAN CAT by @abhinavP | Stardance
Devlogs:
This code handles all the basic setup and visual building blocks of the entire game. The draw_nyan_cat function makes the character form very simple shapes every frame. It also scales up and turns yellow when interacting with power-ups. Rainbow_Trail stores the cat’s last 30 positions and draws the layered color ribbon behind it. The Stars function scrolls 60 twinkling dots across the background of the parallax effect. The Pipe function draws the classic green obstacle pairs and has collision rectangles. The booster is a scrolling collectible that bobs and changes the cat’s visual structure when collected.
Getting the code for the boosters finished up: Will most likely come back and add more boosters: The stars in the back are going to come out very nice
I was finishing the booster system and started on the particles, but I ran into a few errors while debugging, and I fixed those too.
I was making the pipe and live update system. I noticed that I made a huge error in the code by forgetting to name a variable, and that led to quite a bit of debugging.
Making the invincible boundary for the cat : Making the pipe spawning system: Making pipe movement and scoring : Booster and pipe Collision : and pipe cleanup after it leaves the screen.
Game start instructions: Creation of frames and layering the background: Making an RGB color-shifting background: Making score, best score, and active booster timers. : Making the starting scene
Fixing Small Bugs and Issues in final code. ALL DONE!! ENJOY!
Ships:
I made a Flappy Bird clone where you play as Nyan Cat flying through Mario-style pipes. The whole game runs in the browser as a single HTML file with no installs or dependencies, and everything including Nyan Cat, the rainbow trail, the pipes, and the boosters are drawn from scratch every frame using the HTML5 Canvas API. The hardest part was getting it to actually run in the browser. I originally built it in Python with Pygame but Codespaces has no display so I had to learn how to convert the whole thing to JavaScript using the Canvas API and rewrite all the drawing logic from scratch. I am most proud of the rainbow trail and the procedural Nyan Cat animation. The legs, tail, and body all animate using sine waves so there are zero image files in the entire project. To test it just open the link, press SPACE or tap the screen to flap, and try to collect the boosters. The star makes you invincible, the mushroom makes you giant, the lightning bolt slows the pipes down, and the coins give you +5 points....
|
1793202592.9804316
|
1793288992.9804316
|
|
20321
|
Fork() by @Mokila | Stardance
|
Mokila
|
1
|
11.0
|
153
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T08:05:30Z", "hours": 11.0, "multiplier": 15.16, "payout": 153, "blessing": "neutral", "text": "I built Fork(), a spatial text editor for mapping out logic trees, user flows, and branching thoughts on an infinite canvas. It is designed around a “zero-mouse” flow, allowing users to rapidly brainstorm complex architectures using only keyboard shortcuts without breaking their flow state. What did you find challenging? Exporting an infinite, DOM-based canvas into an image file was a massive pain. Browsers lack a native DOM-to-image API, and standard libraries couldnt handle modern Flexbox math. Furthermore, when trying to export massive trees, Chrome’s memory limits would silently cut the XML data, causing the exports to crash. I had to build a custom “Shrinkwrap” staging area and utilize RAM-based Binary Blobs to bypass browser string limits entirely. What are you proud of? I am proud of the bulletproof export engine that can instantly generate infinite-resolution SVGs, but I’m equally proud of the UI polish. I am also proud of the idea itself because i personally think the idea is very unique. What should people know so they can test your project? No login required: Just open the link and start typing. Use the keyboard: Press Cmd + Enter to spawn a child branch, and Cmd + B for a sibling. Try “Focus Mode” (Cmd + Shift + F) once you have a large tree. And there are more keyboard shortcuts in the Keyboard Shortcuts screen on the website. SVG Testing: Because Chrome flags local SVGs containing tags as a security risk, double-clicking the exported SVG on your desktop might show a blank screen. Drag that exact file into Figma or Illustrator to see the proper image.", "repo": "https://github.com/Moksha-0102/fork", "demo": "https://fork-self.vercel.app/"}]...
|
[{"post_id": 12998, "ts": "202 [{"post_id": 12998, "ts": "2026-06-21T07:51:47Z", "hours": 0.3172, "text": "Readme.md finalized and the project is ready to ship"}, {"post_id": 12977, "ts": "2026-06-21T07:18:52Z", "hours": 3.7025, "text": "Devlog #4: Onboarding and Revised Export Engine + Other improvements. This is probably the final devlog before i ship my project. Here are the changes i made: Onboarding screen : To introduce the user to what Fork() is, i designed and onboarding screen. The screen features a typewriter animation and some bento boxes explaining the usefulness of the app. It introduces the user to the core concepts of the app without overwhelming them. Once dismissed (via a custom checkbox), it saves a flag to localStorage so it never interrupts returning users. The Shortcuts screen: I also added a small section on the bottom left that shows some of the useful keyboard shortcuts. It breaks down the entire zero-mouse flow (like Cmd + ↵ for child branches and Cmd + B for siblings) so users can reference the hotkeys instantly. By pressing on a Show more shortcuts button, another screen pops up with all of the shortcuts SVG & PNG Exports: This was the hardest engineering challenge of the project and took me the longes. Because Fork() uses standard HTML elements ( and ) instead of a raw , exporting it meant reverse-engineering the DOM into an image. Here is what i had to face to perfect these two engines The Outdated Engine: Initially, I used html2canvas, but it couldn’t understand modern Flexbox math or connecting branch lines, resulting in empty, broken files. I completely swapped the engine to the modern html-to-image library. The large canvas: Browsers panic when trying to capture a 100,000-pixel infinite canvas. To fix this, I built an invisible staging area. When you click export, the app clones the tree, strips away the UI buttons, removes all absolute coordinates, and uses native CSS to tightly “shrinkwrap” the bounding box around your exact nodes. The 2MB Chrome Limit: When generating the SVG, Google Chrome kept throwing an XML error. This was because I was putting the raw image data into a URL string, and Chrome silently chops off strings larger than 2 Megabytes. The Blob Fix: To bypass the browser’s memory limits, I converted the raw data into a Binary Blob stored securely in RAM. By using URL.createObjectURL(blob), the app generates a tiny pointer URL that allows users to instantly download massive, infinite-resolution vector trees without the browser crashing. Note on SVGs: Because Chrome flags local SVGs containing tags as a security risk, double-clicking the exported file on a desktop shows a blank screen or a cutoff svg file. But if you drag that exact same file into Figma, Illustrator, or Miro, It renders the vector math flawlessly. Better UX: I entirely stripped out native browser alert() boxes—which are terrible for UX because they freeze the main browser thread—and built a custom Alert System. The Loader: Exports now trigger a Loading Screen with three spinning rings. It features a text element that actively cycles through statuses (“Freezing DOM…”, “Processing spatial math…” and some other stuff). That was my final changes to the website. I just need to write the README.md and then i can officially ship this project"}, {"post_id": 12532, "ts": "2026-06-20T13:51:16Z", "hours": 1.3097, "text": "Devlog #4: Focus Mode + Branching + Recenter The product is almost coming to an end and here are some final features i added: Branch Folding: I added a tiny dropdown button to the bottom of each of the nodes that allows the user to collapse their branches. How it works: Instead of writing complex JavaScript to check if a node has children, I used the modern CSS :has() selector (.node:has(> .children > .node)). The browser automatically figures out if a branch has children and fades the button in for me. Clicking it toggles a .collapsed class that hides the tree below. I also wired the Fork() button and Ctrl+Enter shortcuts to automatically unfold a branch if you try to add a new child to a collapsed node, so you never spawn invisible data. There was a probem however. Everytime i delete or add a branch, the screen jerks and moves somewhere else. This was the hardest technical hurdle. Because the canvas is massive, whenever I used JavaScript to .focus() a new text box, the browser’s native engine would mess up everything. It tried to auto-scroll to center the text box, which contradicted my pan engine, causing the screen to jerk wildly. How I fixed it: I disabled the native and scrollbars (overflow: hidden; overscroll-behavior: none), intercepted any native window.scrollTo events to force them to 0, and applied {preventScroll: true} to every text box. Once I disabled the browser’s native scrolling, the “camera” wouldn’t follow me when I navigated off-screen. I had to build a custom “camera”: Flexbox centering breaks when elements resize (like when collapsing a branch), causing the whole tree to shift. I fixed this by making the canvas 100,000px wide container and locking the transform origin to 0,0. The root node sits permanently at exactly 50,000 pixels. It never moves.Smart Panning: I wrote a math function that calculates the exact pixel center of the active text box, compares it to the physical center of the user’s monitor, and glides the canvas coordinates (panX, panY) to align them perfectly. Zoom-to-Center: I upgraded the mouse-wheel math to calculate where your cursor is relative to the screen, adjusting the pan coordinates while scaling so it zooms smoothly into your target instead of shooting off Focus Mode: I also added a Focus Mode (Cmd+Shift+F). When you are deep in work, the sheer number of boxes is overwhelming. How it works: It strips away the background grid and dims every single node and connecting line to 15% opacity. Using JavaScript’s focusin event, it tracks exactly which box you are typing in and fully illuminates it. Using CSS :has(), I tell the browser to look up the DOM tree and keep the parent nodes semi-illuminated at 60% opacity, creating a “trail” leading back to your root thought. The focus mode is shown in the picture attached below:"}, {"post_id": 12011, "ts": "2026-06-19T16:27:23Z", "hours": 0.9083, "text": "Devlog #3: Undo Redo Engine and Dark Mode The aim was first to create an undo redo option where the user can revert back to the previous change if they made a mistake or sth. To do this i made the following changes: I created two arrays, one for undoHistory and one for redoHistory. They work in such a way that every time you fork or delete a branch, the app takes a snapshot of the DOM and pushes it to the stack. The app only takes a snapshot of the canvas right before you make a structural change (like forking or deleting a branch). If you hit Ctrl+Z, it pops that HTML snapshot back onto the screen. Keystroke typos are still handled by the browser’s native undo. The next change is the dark mode. This is quite self explanatory. I added a dark mode to the website to offer customization options for the user. The preference is also saved to localStorage so the website remembers what theme the user was on."}, {"post_id": 11495, "ts": "2026-06-18T19:44:37Z", "hours": 1.8611, "text": "Devlog #3: localStorage sync + export functoin I realised one of the features missing is the export function where the user can export their tree as many things, so i started coding that. At first, I tried to make the app export to a standard text file or a CSV for Excel. But as soon as I tested it, I realized that a tree/mindmap just doesn’t fit into a flat spreadsheet or as plain text. It was completely illegible. So, I scrapped that and built three new export options: Markdown (Clipboard): I wrote a custom function that takes the tree and converts it into an indented Markdown list. You can click ‘Copy’ and paste it anywhere and it formats it instantly. JSON Data: you can also export the entire tree as a nested JSON file and literally drop it straight into your codebase. PNG Image: to also make exporting it in a visually pleasing way, i coded this option. I integrated html2canvas so you can download a high-res image. To make the UI more like professional, i wrote a script that temporarily hides the UI buttons, resets the zoom/pan, takes the picture, and puts you right back where you were after the export. The second thing i built is the localStorage. I didnt want users refreshing the website and losing all the stuff that they inputted so this is very essential. Fortunately, since i attached the fork button eventListener to the document itself and not only the individual buttons, i could just add a simple localStorage.setItem for each of the events and save it in localStorage. This was quite simple and wasnt too hard to do."}, {"post_id": 10638, "ts": "2026-06-17T14:29:05Z", "hours": 0.6964, "text": "Devlog #2: Infinite Canvas + Keyboard shortcuts. Since this mission is about making life easier, i realised that always switching between mouse and keyboard to just move around and stuff is a bit ironic. So, I rewrote how the entire workspace behaves. Changes: Drag & Pan: I threw out standard scrollbars entirely. Now, the background is like an infinite canvas. You can click and drag anywhere to pan around, or use your trackpad to move in any direction. Keyboard Shortcuts: I wanted to make it possible to map out an entire codebase without ever touching the mouse. I split the branching logic into two intuitive shortcuts: Ctrl + Enter drops down to create a child branch (diving deeper into an idea). Ctrl + B creates a parallel sibling branch right next to you (exploring an alternative idea). Arrow Key Navigation: You can now move through the branches tree using Ctrl + Arrow Keys. Heading Up takes you to the parent thought, Down dives into the branches, and Left/Right hops between parallel options. Ctrl + delete/backspace deletes the current branch/texarea that you are on. If you delete a branch, the cursor shifts focus to the parent node so your typing flow never breaks. Some problems: Fixed a frustrating bug where the connecting lines were off by a single pixel on the outermost branches. Using a calc(), the layout is now completely locked in and perfectly aligned. Next up, I’m diving into LocalStorage so the canvas automatically saves your notes in the background."}, {"post_id": 10604, "ts": "2026-06-17T13:16:03Z", "hours": 1.7267, "text": "Devlog #1: Building Fork() Fork() is a branching notepad for the Frictionless mission. I decided to tackle a massive personal pain point: linear note-taking. Whenever I’m mapping out complex logic or trying to write a function, I always hit a point where I want to try two different approaches. Usually, that means either deleting my past context, or scrolling endlessly up and down a huge document. It completely breaks my flow. So, I started building Fork(). Here’s what I managed to get working for the core engine so far: Branching: I set up the JavaScript so that the moment you click Fork(), a new parallel text box pops up and automatically grabs your cursor. You don’t even have to click into it to start typing. Branchign tree lines: This is the part I’m most proud of. I originally thought I’d have to write a bunch of heavy JavaScript math or use a HTML Canvas to draw the connecting lines between the thoughts. Instead, I figured out how to draw the entire tree using pure CSS. As you spawn new branches, the browser instantly redraws the geometry. Zooming: Since the canvas grows infinitely left, right, and down, I added a custom zoom controller (and also included Ctrl + Scroll). When your logic tree gets massive, you can zoom out to get a bird’s-eye view of your whole thought process. The text boxes also automatically resize and push the rest of the tree down as you type, so nothing gets cut off."}]...
|
Title: Fork() by @Mokila | Stardance
Devlogs:
Dev Title: Fork() by @Mokila | Stardance
Devlogs:
Devlog #1: Building Fork() Fork() is a branching notepad for the Frictionless mission. I decided to tackle a massive personal pain point: linear note-taking. Whenever I’m mapping out complex logic or trying to write a function, I always hit a point where I want to try two different approaches. Usually, that means either deleting my past context, or scrolling endlessly up and down a huge document. It completely breaks my flow. So, I started building Fork(). Here’s what I managed to get working for the core engine so far: Branching: I set up the JavaScript so that the moment you click Fork(), a new parallel text box pops up and automatically grabs your cursor. You don’t even have to click into it to start typing. Branchign tree lines: This is the part I’m most proud of. I originally thought I’d have to write a bunch of heavy JavaScript math or use a HTML Canvas to draw the connecting lines between the thoughts. Instead, I figured out how to draw the entire tree using pure CSS. As you spawn new branches, the browser instantly redraws the geometry. Zooming: Since the canvas grows infinitely left, right, and down, I added a custom zoom controller (and also included Ctrl + Scroll). When your logic tree gets massive, you can zoom out to get a bird’s-eye view of your whole thought process. The text boxes also automatically resize and push the rest of the tree down as you type, so nothing gets cut off.
Devlog #2: Infinite Canvas + Keyboard shortcuts. Since this mission is about making life easier, i realised that always switching between mouse and keyboard to just move around and stuff is a bit ironic. So, I rewrote how the entire workspace behaves. Changes: Drag & Pan: I threw out standard scrollbars entirely. Now, the background is like an infinite canvas. You can click and drag anywhere to pan around, or use your trackpad to move in any direction. Keyboard Shortcuts: I wanted to make it possible to map out an entire codebase without ever touching the mouse. I split the branching logic into two intuitive shortcuts: Ctrl + Enter drops down to create a child branch (diving deeper into an idea). Ctrl + B creates a parallel sibling branch right next to you (exploring an alternative idea). Arrow Key Navigation: You can now move through the branches tree using Ctrl + Arrow Keys. Heading Up takes you to the parent thought, Down dives into the branches, and Left/Right hops between parallel options. Ctrl + delete/backspace deletes the current branch/texarea that you are on. If you delete a branch, the cursor shifts focus to the parent node so your typing flow never breaks. Some problems: Fixed a frustrating bug where the connecting lines were off by a single pixel on the outermost branches. Using a calc(), the layout is now completely locked in and perfectly aligned. Next up, I’m diving into LocalStorage so the canvas automatically saves your notes in the background.
Devlog #3: localStorage sync + export functoin I realised one of the features missing is the export function where the user can export their tree as many things, so i started coding that. At first, I tried to make the app export to a standard text file or a CSV for Excel. But as soon as I tested it, I realized that a tree/mindmap just doesn’t fit into a flat spreadsheet or as plain text. It was completely illegible. So, I scrapped that and built three new export options: Markdown (Clipboard): I wrote a custom function that takes the tree and converts it into an indented Markdown list. You can click ‘Copy’ and paste it anywhere and it formats it instantly. JSON Data: you can also export the entire tree as a nested JSON file and literally drop it straight into your codebase. PNG Image: to also make exporting it in a visually pleasing way, i coded this option. I integrated html2canvas so you can download a high-res image. To make the UI more like professional, i wrote a script that temporarily hides the UI buttons, resets the zoom/pan, takes the picture, and puts you right back where you were after the export. The second thing i built is the localStorage. I didnt want users refreshing the website and losing all the stuff that they inputted so this is very essential. Fortunately, since i attached the fork button eventListener to the document itself and not only the individual buttons, i could just add a simple localStorage.setItem for each of the events and save it in localStorage. This was quite simple and wasnt too hard to do.
Devlog #3: Undo Redo Engine and Dark Mode The aim was first to create an undo redo option where the user can revert back to the previous change if they made a mistake or sth. To do this i made the following changes: I created two arrays, one for undoHistory and one for redoHistory. They work in such a way that every time you fork or delete a branch, the app takes a snapshot of the DOM and pushes it to the stack. The app only takes a snapshot of the canvas right before you make a structural change (like forking or deleting a branch). If you hit Ctrl+Z, it pops that HTML snapshot back onto the screen. Keystroke typos are still handled by the browser’s native undo. The next change is the dark mode. This is quite self explanatory. I added a dark mode to the website to offer customization options for the user. The preference is also saved to localStorage so the website remembers what theme the user was on.
Devlog #4: Focus Mode + Branching + Recenter The product is almost coming to an end and here are some final features i added: Branch Folding: I added a tiny dropdown button to the bottom of each of the nodes that allows the user to collapse their branches. How it works: Instead of writing complex JavaScript to check if a node has children, I used the modern CSS :has() selector (.node:has(> .children > .node)). The browser automatically figures out if a branch has children and fades the button in for me. Clicking it toggles a .collapsed class that hides the tree below. I also wired the Fork() button and Ctrl+Enter shortcuts to automatically unfold a branch if you try to add a new child to a collapsed node, so you never spawn invisible data. There was a probem however. Everytime i delete or add a branch, the screen jerks and moves somewhere else. This was the hardest technical hurdle. Because the canvas is massive, whenever I used JavaScript to .focus() a new text box, the browser’s native engine would mess up everything. It tried to auto-scroll to center the text box, which contradicted my pan engine, causing the screen to jerk wildly. How I fixed it: I disabled the native and scrollbars (overflow: hidden; overscroll-behavior: none), intercepted any native window.scrollTo events to force them to 0, and applied {preventScroll: true} to every text box. Once I disabled the browser’s native scrolling, the “camera” wouldn’t follow me when I navigated off-screen. I had to build a custom “camera”: Flexbox centering breaks when elements resize (like when collapsing a branch), causing the whole tree to shift. I fixed this by making the canvas 100,000px wide container and locking the transform origin to 0,0. The root node sits permanently at exactly 50,000 pixels. It never moves.Smart Panning: I wrote a math function that calculates the exact pixel center of the active text box, compares it to the physical center of the user’s monitor, and glides the canvas coordinates (panX, panY) to align them perfectly. Zoom-to-Center: I upgraded the mouse-wheel math to calculate where your cursor is relative to the screen, adjusting the pan coordinates while scaling so it zooms smoothly into your target instead of shooting off Focus Mode: I also added a Focus Mode (Cmd+Shift+F). When you are deep in work, the sheer number of boxes is overwhelming. How it works: It strips away the background grid and dims every single node and connecting line to 15% opacity. Using JavaScript’s focusin event, it tracks exactly which box you are typing in and fully illuminates it. Using CSS :has(), I tell the browser to look up the DOM tree and keep the parent nodes semi-illuminated at 60% opacity, creating a “trail” leading back to your root thought. The focus mode is shown in the picture attached below:
Devlog #4: Onboarding and Revised Export Engine + Other improvements. This is probably the final devlog before i ship my project. Here are the changes i made: Onboarding screen : To introduce the user to what Fork() is, i designed and onboarding screen. The screen features a typewriter animation and some bento boxes explaining the usefulness of the app. It introduces the user to the core concepts of the app without overwhelming them. Once dismissed (via a custom checkbox), it saves a flag to localStorage so it never interrupts returning users. The Shortcuts screen: I also added a small section on the bottom left that shows some of the useful keyboard shortcuts. It breaks down the entire zero-mouse flow (like Cmd + ↵ for child branches and Cmd + B for siblings) so users can reference the hotkeys instantly. By pressing on a Show more shortcuts button, another screen pops up with all of the shortcuts SVG & PNG Exports: This was the hardest engineering challenge of the project and took me the longes. Because Fork() uses standard HTML elements ( and ) instead of a raw , exporting it meant reverse-engineering the DOM into an image. Here is what i had to face to perfect these two engines The Outdated Engine: Initially, I used html2canvas, but it couldn’t understand modern Flexbox math or connecting branch lines, resulting in empty, broken files. I completely swapped the engine to the modern html-to-image library. The large canvas: Browsers panic when trying to capture a 100,000-pixel infinite canvas. To fix this, I built an invisible staging area. When you click export, the app clones the tree, strips away the UI buttons, removes all absolute coordinates, and uses native CSS to tightly “shrinkwrap” the bounding box around your exact nodes. The 2MB Chrome Limit: When generating the SVG, Google Chrome kept throwing an XML error. This was because I was putting the raw image data into a URL string, and Chrome silently chops off strings larger than 2 Megabytes. The Blob Fix: To bypass the browser’s memory limits, I converted the raw data into a Binary Blob stored securely in RAM. By using URL.createObjectURL(blob), the app generates a tiny pointer URL that allows users to instantly download massive, infinite-resolution vector trees without the browser crashing. Note on SVGs: Because Chrome flags local SVGs containing tags as a security risk, double-clicking the exported file on a desktop shows a blank screen or a cutoff svg file. But if you drag that exact same file into Figma, Illustrator, or Miro, It renders the vector math flawlessly. Better UX: I entirely stripped out native browser alert() boxes—which are terrible for UX because they freeze the main browser thread—and built a custom Alert System. The Loader: Exports now trigger a Loading Screen with three spinning rings. It features a text element that actively cycles through statuses (“Freezing DOM…”, “Processing spatial math…” and some other stuff). That was my final changes to the website. I just need to write the README.md and then i can officially ship this project
Readme.md finalized and the project is ready to ship
Ships:
I built Fork(), a spatial text editor for mapping out logic trees, user flows, and branching thoughts on an infinite canvas. It is designed around a “zero-mouse” flow, allowing users to rapidly brainstorm complex architectures using only keyboard shortcuts without breaking their flow state. What did you find challenging? Exporting an infinite, DOM-based canvas into an image file was a massive pain. Browsers lack a native DOM-to-image API, and standard libraries couldnt handle modern Flexbox math. Furthermore, when trying to export massive trees, Chrome’s memory limits would silently cut the XML data, causing the exports to crash. I had to build a custom “Shrinkwrap” staging area and utilize RAM-based Binary Blobs to bypass browser string limits entirely. What are you proud of? I am proud of the bulletproof export engine that can instantly generate infinite-resolution SVGs, but I’m equally proud of the UI polish. I am also proud of the idea itself because i personally think the idea is very unique. What should people know so they can test your project? No login required: Just open the link and start typing. Use the keyboard: Press Cmd + Enter to spawn a child branch, and Cmd + B for a sibling. Try “Focus Mode” (Cmd + Shift + F) once you have a large tree. And there are more keyboard shortcuts in the Keyboard Shortcuts screen on the website. SVG Testing: Because Chrome flags local SVGs containing tags as a security risk, double-clicking the exported SVG on your desktop might show a blank screen. Drag that exact file into Figma or Illustrator to see the proper image....
|
1793224426.911932
|
1793310826.911932
|
|
20329
|
Pokemon Quiz by @abigail_L | Stardance
|
abigail_L
|
1
|
4.0
|
45
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-22T02:38:19Z", "hours": 4.0, "multiplier": 10.72, "payout": 45, "blessing": "neutral", "text": "Hello I made a Pokemon Quiz using the PokiAPI. Within the quiz users can go through a 10 question where they must identify a pokemon’s name or type. While making this project I wanted to learn about how to use APIs. When watching one tutorial I found my self needing to watch other tutorials in order to understand different parts. I enjoyed working with an API and I for sure plan on making more projects involving API’s", "repo": "https://github.com/Abbby1007/PokemonAPI", "demo": "https://abbby1007.github.io/PokemonAPI/"}]...
|
[{"post_id": 13478, "ts": "202 [{"post_id": 13478, "ts": "2026-06-22T02:20:07Z", "hours": 0.6717, "text": "Okay I have done the finishing touches. I have added some style to the website. While also making two types of quiz either involving the user guessing a Pokémon’s name or type."}, {"post_id": 11666, "ts": "2026-06-19T00:32:36Z", "hours": 1.4364, "text": "Hello I a want to learn how to use APIs So I am using the PokiApi to make a pokemon quiz. I am almost done with the name quiz, here I have added color and a tryagain and home button while having my sister test the website. I thought it would also be fun to have users be quized on a pokemon’s type. So I will work on that next Then I will work on making the website look better"}, {"post_id": 10328, "ts": "2026-06-17T00:08:59Z", "hours": 1.3619, "text": "I am Working on Making 10 Question Pokemon Quiz with the Poki API In this devlog I have created the main mechanic where the user will be provided 10 questions/Pokemon. If the user is correct they get one point. If they are wrong they get no points. I also added to where it stops once they reach 10 questions. Next I will work on the design and look of the quiz. While also of course removing the pokemon’s name appearing before the user answers"}, {"post_id": 10245, "ts": "2026-06-16T21:33:30Z", "hours": 0.7594, "text": "This will be my first time working with an API. SO i followed a Pokémon API. From this I plan on making a Pokémon quiz"}]...
|
Title: Pokemon Quiz by @abigail_L | Stardance
Dev Title: Pokemon Quiz by @abigail_L | Stardance
Devlogs:
This will be my first time working with an API. SO i followed a Pokémon API. From this I plan on making a Pokémon quiz
I am Working on Making 10 Question Pokemon Quiz with the Poki API In this devlog I have created the main mechanic where the user will be provided 10 questions/Pokemon. If the user is correct they get one point. If they are wrong they get no points. I also added to where it stops once they reach 10 questions. Next I will work on the design and look of the quiz. While also of course removing the pokemon’s name appearing before the user answers
Hello I a want to learn how to use APIs So I am using the PokiApi to make a pokemon quiz. I am almost done with the name quiz, here I have added color and a tryagain and home button while having my sister test the website. I thought it would also be fun to have users be quized on a pokemon’s type. So I will work on that next Then I will work on making the website look better
Okay I have done the finishing touches. I have added some style to the website. While also making two types of quiz either involving the user guessing a Pokémon’s name or type.
Ships:
Hello I made a Pokemon Quiz using the PokiAPI. Within the quiz users can go through a 10 question where they must identify a pokemon’s name or type. While making this project I wanted to learn about how to use APIs. When watching one tutorial I found my self needing to watch other tutorials in order to understand different parts. I enjoyed working with an API and I for sure plan on making more projects involving API’s...
|
1793299912.0666196
|
1793386312.0666196
|
|
20332
|
Pronoun Palace Modding famework by @xanderath | St Pronoun Palace Modding famework by @xanderath | Stardance...
|
xanderath
|
1
|
37.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-05T03:50:46Z", "hours": 37.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a mod for Pronoun Palace which allows other mods to add spells, enemies, characters, tile effects, and a mod settings menu. I also created a demonstration mod which adds one of all of these. Enemy: Aqua from Deltarune Character: Dew Jubilist Spell: Inverter, alternates between making tiles negative and crit Tile Effect: Negative, tile is worth negative value In the mod settings menu you can make Aqua small, or guarantee that she appears The project demo is a showcase video so you can see the mod without having to own the game.", "repo": "https://github.com/Emarald64/pronoun-palace-framework", "demo": "https://youtu.be/Dea4LgKEAN8"}]...
|
[{"post_id": 22540, "ts": "202 [{"post_id": 22540, "ts": "2026-07-05T01:59:58Z", "hours": 1.2689, "text": "Its very hard to see, but the shadow of the text can now also have it’s color changed. The second picture has a more visible shadow color"}, {"post_id": 20500, "ts": "2026-07-02T03:18:11Z", "hours": 6.5267, "text": "Added a tile effect loader to add new tile affects. To the example mod, added the tile effect negative, which multiplies tile value by -1 and the spell Inverter which alternates between making a tile negative and crit."}, {"post_id": 18064, "ts": "2026-06-29T01:39:57Z", "hours": 5.4106, "text": "Make knife throwing animation faster and made the wooden slash attack into a chain knife attack that hits all the top and bottom tiles. Released version 1.4.2 on github. (cut out the parts of the video where it took me a while to find a good word to play)"}, {"post_id": 17219, "ts": "2026-06-27T22:38:46Z", "hours": 8.1186, "text": "Added custom intents, put custom enemies in phonebook, added mod settings menu. Replaced the paparazzi with aqua who has uses the custom intents and has her own unique projectile physics and sounds"}, {"post_id": 13414, "ts": "2026-06-21T23:27:43Z", "hours": 15.4203, "text": "Created scripts to add spells, enemies, and characters. Modified character select screen to support more characters. Made example mod to showcase framework features."}]...
|
Title: Pronoun Palace Modding famework by @xandera Title: Pronoun Palace Modding famework by @xanderath | Stardance
Devlogs:
Created scripts to add spells, enemies, and characters. Modified character select screen to support more characters. Made example mod to showcase framework features.
Added custom intents, put custom enemies in phonebook, added mod settings menu. Replaced the paparazzi with aqua who has uses the custom intents and has her own unique projectile physics and sounds
Make knife throwing animation faster and made the wooden slash attack into a chain knife attack that hits all the top and bottom tiles. Released version 1.4.2 on github. (cut out the parts of the video where it took me a while to find a good word to play)
Added a tile effect loader to add new tile affects. To the example mod, added the tile effect negative, which multiplies tile value by -1 and the spell Inverter which alternates between making a tile negative and crit.
Its very hard to see, but the shadow of the text can now also have it’s color changed. The second picture has a more visible shadow color
Ships:
I made a mod for Pronoun Palace which allows other mods to add spells, enemies, characters, tile effects, and a mod settings menu. I also created a demonstration mod which adds one of all of these. Enemy: Aqua from Deltarune Character: Dew Jubilist Spell: Inverter, alternates between making tiles negative and crit Tile Effect: Negative, tile is worth negative value In the mod settings menu you can make Aqua small, or guarantee that she appears The project demo is a showcase video so you can see the mod without having to own the game....
|
1793249704.103572
|
1793336104.103572
|
|
20336
|
bigbot by @arjundakshin | Stardance
|
arjundakshin
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-29T13:23:39Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a slack bot named big bot that has some useful features but mostly just pure fun. But one is extremely dangerous do not do the forbidden command.", "repo": "https://github.com/DrivingStork3952/bigbot_slack/", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354"}]...
|
[{"post_id": 11027, "ts": "202 [{"post_id": 11027, "ts": "2026-06-18T01:49:20Z", "hours": 0.3392, "text": "My first ever DevLog I built my Slack bot. I used Node.js for the first time,e and it was really interesting using APIs with JavaScript. For reference,e my main language is Python, that’s what I usually code everything in. The project started as just a ping and joke, and cat fact, but I started looking into more APIs and kept adding. Bigbott isn’t live is because I still have to apply for a nest container. Hackatime is also being weird and said I only worked on it for 20 minutes, but it was actually a lot more, at least 1 hour. As soon as my Nest Container gets approved, Bigbot will be available for everyone to use (if you want to)."}]...
|
Title: bigbot by @arjundakshin | Stardance
Devlog Title: bigbot by @arjundakshin | Stardance
Devlogs:
My first ever DevLog I built my Slack bot. I used Node.js for the first time,e and it was really interesting using APIs with JavaScript. For reference,e my main language is Python, that’s what I usually code everything in. The project started as just a ping and joke, and cat fact, but I started looking into more APIs and kept adding. Bigbott isn’t live is because I still have to apply for a nest container. Hackatime is also being weird and said I only worked on it for 20 minutes, but it was actually a lot more, at least 1 hour. As soon as my Nest Container gets approved, Bigbot will be available for everyone to use (if you want to).
Ships:
I made a slack bot named big bot that has some useful features but mostly just pure fun. But one is extremely dangerous do not do the forbidden command....
|
1793220708.2924862
|
1793307108.2924862
|
|
20341
|
Hello-Laravel by @cauadev | Stardance
|
cauadev
|
1
|
17.0
|
88
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-15T00:18:57Z", "hours": 17.0, "multiplier": 6.86, "payout": 88, "blessing": "neutral", "text": "Hello-Laravel Hello-Laravel is a Laravel based (duh) unhinged excuses generator, where you can get excuses to bring you out of the blunders created by yourself (or make everything worse, effectivity is not granted). With it, users can add, edit, delete and get custom excuses, defined by: Category -> Work, School, etc. Risk -> Has a severity score (1-10) and a risk tag (like “moderate”, “nuclear” or “you’ll get fired soon”) Believability rate -> How believable is the excuse (from 0 to 100%) Chaos score -> A server-side calculated mathematical formula to get how bad the situation is (bigger is worse), defined as: 100 + Severity score - Believability rate Excuse -> The excuse itself (like “My dog ate the database) Challenges: Tom-Select -> It was hard to figure out how to set it up properly Laravel and PHP -> It was my first dive into PHP and at Laravel. Before that, my only experience with backend web frameworks were Flask and a bit of Django Deploying -> It was my first time ever deploying a website What I’m proud of: Overcame challenges -> Now I know how to setup Tom-Select or write PHP code Learned tools -> Now I know how to write pages using Tailwind CSS, for example, or use ssh to access a remote terminal session Availability -> I can send the link to anyone and proudly announce “I built this all” How to test Open the website: https://brzueira.hackclub.app/ Log in with dummy account: Email: [email protected] Password: admin Know the rules: 1. No NSFW 2. No prejudice, hating speech or offensive content 3. No doxing, harmful or personal info 4. No trolling, griefing or spam, like creating dozens of identical categories or deleting other people’s models 5. No sensitive topics, such as politics or religion 6. If a post breaks one of those rules, feel free to edit or remove it. Have fun (inside the rules)! Remember: be careful about what you post - other people will see it", "repo": "https://github.com/Br-Zueira/Hello-Laravel", "demo": "https://brzueira.hackclub.app/"}]...
|
[{"post_id": 46639, "ts": "202 [{"post_id": 46639, "ts": "2026-08-14T01:14:58Z", "hours": 2.8192, "text": "Hello guys! Today I was finally able of deploying this little silly website, so you all can generate chaos and unhinged excuses without further setup! I used Hackclub’s Nest platform, and found it way more intuitive and easy than other platforms, and is also 100% free, so thank you guys! The only issue was setting the setup.sh file (the code on picture), but after a brave battle against root user, daemons, .env files, ports, hosts, and Vite, I announce I came victorious! Info to access website: URL: https://brzueira.hackclub.app/ Email: [email protected] Password: admin You guys can all use this dummy account to log in into the website and do whatever you want. Just follow the rules, that are: No NSFW No prejudice, hating speech or offensive content No doxing, harmful or personal info No trolling, griefing or spam, like creating dozens of identical categories or deleting other people’s models No sensitive topics, such as politics or religion If a post breaks one of those rules, feel free to edit or remove it. Have fun (inside the rules) Remember: be careful about what you post - other people will see it."}, {"post_id": 10266, "ts": "2026-06-16T22:09:33Z", "hours": 14.2411, "text": "Recently, I’m miserably failing to deploy Hello-Laravel website. Why are there no more devlogs? Simply: I created the Stardance project page just now and just now discovered that devlog meant posting here. I was doing a whole DEVLOG.md thinking it was enough. Here’s a piece of it: Project Context & Progression I started brainstorming and prototyping the initial core engine of this project shortly before discovering Stardance and creating the GitHub repository. At that stage, the project was completely raw and missing the vast majority of its current features. Approximately 50% to 70% of the entire project - Including the terminal style, the finished CRUD operations, TomSelect integrations, mobile optimization, and overall production polishment - was built entirely from scratch during my hours logged for Stardance. […] GitHub History bf4a2a7 (HEAD -> main, origin/main) Remove automatic database creation at docker 3b70ef5 Changed run command in Dockerfile 33493f9 Completely stripped FrankenPHP out because it didn’t work in Render 3158734 Fixed typo in seeder (. to ->) 5510537 Changed User Seeder so it works without factory 939e88a Corrected Dockerfile frankenPHP not having Composer binary 065523a Corrected Dockerfile frankenPHP version d91bde0 Added settings for deploying + included Octane at Composer requirements 9e1facc Corrected PHP version info in README a77e3ca Updated DEVLOG 941b1ec Updated PHP requirement to 8.4 7a3ecc5 Improved DEVLOG.md, specially by adding screenshots 51c3a5f Small tweak in DEVLOG (commiting only to be able to do checkout) be8ed5a Improved DEVLOG 391d482 Moved markdown assets into new assets folder d232336 Created devlog 389bf18 Improved README.md to fit the Stardance README standard 8403d85 Added hero image to be used in README.md 4b87821 Added favicons (bash logo) 4fe3919 Added seeder for user to make creating admin account easier 1f94518 Moved tomSelect scripts out of blade files to organize the code fcc1543 Made tomSelect a local package to make the app more self contained ad911da Updated README 0397bcd Added title to website a5a7632 Added csrf token to logout button 3fb766f Added navbar, admin panel and mobile support 276f3a6 Added terminal style and edit route cc5068c Added admin category editing option 2cc4618 Pushing the already existing files"}]...
|
Title: Hello-Laravel by @cauadev | Stardance
Devl Title: Hello-Laravel by @cauadev | Stardance
Devlogs:
Recently, I’m miserably failing to deploy Hello-Laravel website. Why are there no more devlogs? Simply: I created the Stardance project page just now and just now discovered that devlog meant posting here. I was doing a whole DEVLOG.md thinking it was enough. Here’s a piece of it: Project Context & Progression I started brainstorming and prototyping the initial core engine of this project shortly before discovering Stardance and creating the GitHub repository. At that stage, the project was completely raw and missing the vast majority of its current features. Approximately 50% to 70% of the entire project - Including the terminal style, the finished CRUD operations, TomSelect integrations, mobile optimization, and overall production polishment - was built entirely from scratch during my hours logged for Stardance. […] GitHub History bf4a2a7 (HEAD -> main, origin/main) Remove automatic database creation at docker 3b70ef5 Changed run command in Dockerfile 33493f9 Completely stripped FrankenPHP out because it didn’t work in Render 3158734 Fixed typo in seeder (. to ->) 5510537 Changed User Seeder so it works without factory 939e88a Corrected Dockerfile frankenPHP not having Composer binary 065523a Corrected Dockerfile frankenPHP version d91bde0 Added settings for deploying + included Octane at Composer requirements 9e1facc Corrected PHP version info in README a77e3ca Updated DEVLOG 941b1ec Updated PHP requirement to 8.4 7a3ecc5 Improved DEVLOG.md, specially by adding screenshots 51c3a5f Small tweak in DEVLOG (commiting only to be able to do checkout) be8ed5a Improved DEVLOG 391d482 Moved markdown assets into new assets folder d232336 Created devlog 389bf18 Improved README.md to fit the Stardance README standard 8403d85 Added hero image to be used in README.md 4b87821 Added favicons (bash logo) 4fe3919 Added seeder for user to make creating admin account easier 1f94518 Moved tomSelect scripts out of blade files to organize the code fcc1543 Made tomSelect a local package to make the app more self contained ad911da Updated README 0397bcd Added title to website a5a7632 Added csrf token to logout button 3fb766f Added navbar, admin panel and mobile support 276f3a6 Added terminal style and edit route cc5068c Added admin category editing option 2cc4618 Pushing the already existing files
Hello guys! Today I was finally able of deploying this little silly website, so you all can generate chaos and unhinged excuses without further setup! I used Hackclub’s Nest platform, and found it way more intuitive and easy than other platforms, and is also 100% free, so thank you guys! The only issue was setting the setup.sh file (the code on picture), but after a brave battle against root user, daemons, .env files, ports, hosts, and Vite, I announce I came victorious! Info to access website: URL: https://brzueira.hackclub.app/ Email: [email protected] Password: admin You guys can all use this dummy account to log in into the website and do whatever you want. Just follow the rules, that are: No NSFW No prejudice, hating speech or offensive content No doxing, harmful or personal info No trolling, griefing or spam, like creating dozens of identical categories or deleting other people’s models No sensitive topics, such as politics or religion If a post breaks one of those rules, feel free to edit or remove it. Have fun (inside the rules) Remember: be careful about what you post - other people will see it.
Ships:
Hello-Laravel Hello-Laravel is a Laravel based (duh) unhinged excuses generator, where you can get excuses to bring you out of the blunders created by yourself (or make everything worse, effectivity is not granted). With it, users can add, edit, delete and get custom excuses, defined by: Category -> Work, School, etc. Risk -> Has a severity score (1-10) and a risk tag (like “moderate”, “nuclear” or “you’ll get fired soon”) Believability rate -> How believable is the excuse (from 0 to 100%) Chaos score -> A server-side calculated mathematical formula to get how bad the situation is (bigger is worse), defined as: 100 + Severity score - Believability rate Excuse -> The excuse itself (like “My dog ate the database) Challenges: Tom-Select -> It was hard to figure out how to set it up properly Laravel and PHP -> It was my first dive into PHP and at Laravel. Before that, my only experience with backend web frameworks were Flask and a bit of Django Deploying -> It was my first time ever deploying a website What I’m proud of: Overcame challenges -> Now I know how to setup Tom-Select or write PHP code Learned tools -> Now I know how to write pages using Tailwind CSS, for example, or use ssh to access a remote terminal session Availability -> I can send the link to anyone and proudly announce “I built this all” How to test Open the website: https://brzueira.hackclub.app/ Log in with dummy account: Email: [email protected] Password: admin Know the rules: 1. No NSFW 2. No prejudice, hating speech or offensive content 3. No doxing, harmful or personal info 4. No trolling, griefing or spam, like creating dozens of identical categories or deleting other people’s models 5. No sensitive topics, such as politics or religion 6. If a post breaks one of those rules, feel free to edit or remove it. Have fun (inside the rules)! Remember: be careful about what you post - other people will see it...
|
1793282105.389914
|
1793368505.389914
|
|
20345
|
Boilerplater by @cauadev | Stardance
|
cauadev
|
1
|
72.0
|
922
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T00:03:39Z", "hours": 72.0, "multiplier": 12.85, "payout": 922, "blessing": "neutral", "text": "Hello guys! Today, I celebrate the shipping of Br-Zueira’s Boilerplater! It serves for saving (ctrl+u, mac: cmd+u) and pasting code snippets (ctrl+alt+u, mac: cmd+alt+u). It also supports categorizing them by tags and languages, giving descriptions and titles to them and even supports macros: [%%] -> Supports variables such as BP_FILENAME, some sandboxed JavaScript evaluation and even macros (variables defined by yourself using JavaScript code) [#n#] -> Tabstops, where n is an index (they’re standard Vscode tabstops: evaluated from 1 to infinity and beyond, 0 at last and can be grouped like in the example) [#n|fallback#] -> Tabstops but with a placeholder/fallback if user chooses to ignore the tabstop. Also, you can change the snippets by the extension itself (supports basic coding editor features, such as tab indenting or auto closing quotes). For all this. it uses an in-build webview (ctrl+alt+u, mac: cmd+alt+u). You can easily download it at Microsoft Extension Marketplace (just search by “Br-Zueira’s Boilerplater”). If you want, you can also get the VSIX file at GitHub Releases (then open it with Vscode and click “Download VSIX extension”). It’s plug and enjoy! Hope it really lets your workflow more frictionless!", "repo": "https://github.com/Br-Zueira/Boilerplater", "demo": "https://github.com/Br-Zueira/Boilerplater/releases"}]...
|
[{"post_id": 51978, "ts": "202 [{"post_id": 51978, "ts": "2026-08-21T23:45:24Z", "hours": 0.3475, "text": "Bug patching and extension updating"}, {"post_id": 30442, "ts": "2026-07-18T00:04:29Z", "hours": 4.9075, "text": "Hello, fellow devs! Today, I added this gorgeous gif into the readme. Also, I had to escape the content to be shown in list view (I discovered it the worst way: completely breaking the layout while playing around with HTML and PHP snippets) and added aliases for languages, which makes searching them easier. I removed frontend JS and CSS into actual files (they were string literals before) and, finally, moved some files around."}, {"post_id": 30107, "ts": "2026-07-17T12:50:50Z", "hours": 5.6953, "text": "Hello, fellow devs! Yesterday, I completed the CRUD for languages! You can now create, edit or even delete them. The internal name is searched in Vscode language IDs. To delete one, if you have snippets assigned to them, you can either reassign all of them to another language or delete them along with the language, both automatically made."}, {"post_id": 29226, "ts": "2026-07-16T00:24:16Z", "hours": 5.0817, "text": "Hello, fellow devs! Today, I solved the issues related to macros. Also, letting it in configs.json made it messy, counterintuitive and less integrated with the rest of the extension, so I moved it to the webviews, together with the snippets, tags and languages you’re all already familiar with. The evaluation order is very important, as this is what grants macros can be access by other macros, only needing to come before in the order. I’m really excited to see what will people come up with this."}, {"post_id": 28638, "ts": "2026-07-15T00:35:52Z", "hours": 5.8692, "text": "Hello. I started preparing extension for release, so I changed compiler to esbuild and added the GSL3 license to my project. I also started trying to implement the option to add custom variables for templating to the extension, but it’s all broken."}, {"post_id": 28259, "ts": "2026-07-14T12:35:30Z", "hours": 3.7383, "text": "Hello, fellow devs! I just wrote this info at index about the extension and about the templates. I also made the snippet typing more similar to Vscode coding, so now it has tab indentation, and auto closes quotes, parenthesis, brackets, curly braces and the extension templating “[%” and “[#”. TODO: Fix the frontend script that is now half broken."}, {"post_id": 27340, "ts": "2026-07-12T20:37:25Z", "hours": 5.8317, "text": "Hello guys! Now we can paste the snippets directly from the webview! Also, it has dynamic templates: [%%] executes simple JavaScript and can access variables such as BP_FILENAME or BP_YEAR [##] turns into tabstops: can be either [# index #] or [# index | default value #] where index is an integer, and optional default value can be used when user just skips the tabstop However, as a safety measure, the templates can’t directly access vscode, node.js or other possibly sensible variables, methods or functions."}, {"post_id": 26564, "ts": "2026-07-11T13:44:20Z", "hours": 9.9067, "text": "Hey guys! I did a search engine for the list view! It was kind of complex, as I had to deal with SQL joins (INNER JOIN for NOT NULL fields and LEFT JOIN for optional fields), a bridge table, JSON_GROUP_ARRAY, etc, but in the end, it worked. Just have to test a bit more the search bar as it sometimes have some glitches (every time a search is fired, the whole DOM is reloaded)."}, {"post_id": 22458, "ts": "2026-07-04T22:35:41Z", "hours": 6.6092, "text": "Hey guys! Today, I officially finished CRUD! For all models! I also made tag assignment work 100% fine. Besides that, I improved a bit on code modularity and organization and did small patches. TODO: Improve the “R” and maybe the “D” of CRUD; Add the snippet pasting part (the app focus)."}, {"post_id": 19611, "ts": "2026-06-30T23:46:55Z", "hours": 7.6217, "text": "Hey guys! Now tom-select is 100% working and model editing works… at least 50%? Well, and we also have this gorgeous CSS styling that matches with Vscode styles!"}, {"post_id": 17274, "ts": "2026-06-28T00:14:13Z", "hours": 3.0789, "text": "Today, the edit view successfully shows the right values, but the tomSelect dropdowns I tried to add were a complete failure. TODO: Fix tomSelect."}, {"post_id": 16846, "ts": "2026-06-27T10:53:15Z", "hours": 3.0275, "text": "Hey guys! Yesterday, I tried to make this generic model editor, and I have the layout, but the functionality is… well… broke for now. Also, to correct a bug, I had to rewrite the whole functionality of the database. Now I have a proper class wrapper instead of passing the raw database object around."}, {"post_id": 16008, "ts": "2026-06-26T00:05:24Z", "hours": 2.3042, "text": "Hello, programmers! Today, I improved more the webview, this time focusing on the list view. It successfully shows a list of one of the valid models (snippets, tags, languages) and information about it. TODO: Model creation page, editing page, ensure paginate works 100% fine and add searchbar functionality. Struggles: SQL (I’m having to work with raw SQL as sql.js doesn’t have ORM) and avoiding spaghetti code (trust me: It’s hard when you have to write HTML and frontend JavaScript in string literal templates)"}, {"post_id": 15366, "ts": "2026-06-24T23:50:43Z", "hours": 2.5772, "text": "Hey guys! Today, I worked in the webwiew. For now, we have this index page and the start of the list page. Other improvements were more docs focused, such as improving README.db and code commenting, and enforcing code structure with new ‘helpers’ folder and ‘html’ TypeScript file."}, {"post_id": 14726, "ts": "2026-06-23T22:43:44Z", "hours": 2.8136, "text": "Hey guys. After fighting against compilation errors, caused by libs and shx, and errors in database managing, caused by thread throttling by setup-ing db, that were solved using asynchronous tasks instead, now I’ve finally done the snippet creation part! The extension successfully saves the snippet, along with its title, description (can be empty) and language (in another table, as the snippet itself only carries the language id, in a one-to-many relationship, as a snippet have only one language, while a language can have lots of snippets). Next step is continuing the CRUD part, probably by including a web view."}, {"post_id": 13993, "ts": "2026-06-22T23:22:23Z", "hours": 2.3778, "text": "For now, Boilerplater has just a function to copy a highlighted section (still does nothing with it) and a database loader/initializer. Most of the concepts are still just ideas. Next step is to program the snippet saving part in database."}]...
|
Title: Boilerplater by @cauadev | Stardance
Devlo Title: Boilerplater by @cauadev | Stardance
Devlogs:
For now, Boilerplater has just a function to copy a highlighted section (still does nothing with it) and a database loader/initializer. Most of the concepts are still just ideas. Next step is to program the snippet saving part in database.
Hey guys. After fighting against compilation errors, caused by libs and shx, and errors in database managing, caused by thread throttling by setup-ing db, that were solved using asynchronous tasks instead, now I’ve finally done the snippet creation part! The extension successfully saves the snippet, along with its title, description (can be empty) and language (in another table, as the snippet itself only carries the language id, in a one-to-many relationship, as a snippet have only one language, while a language can have lots of snippets). Next step is continuing the CRUD part, probably by including a web view.
Hey guys! Today, I worked in the webwiew. For now, we have this index page and the start of the list page. Other improvements were more docs focused, such as improving README.db and code commenting, and enforcing code structure with new ‘helpers’ folder and ‘html’ TypeScript file.
Hello, programmers! Today, I improved more the webview, this time focusing on the list view. It successfully shows a list of one of the valid models (snippets, tags, languages) and information about it. TODO: Model creation page, editing page, ensure paginate works 100% fine and add searchbar functionality. Struggles: SQL (I’m having to work with raw SQL as sql.js doesn’t have ORM) and avoiding spaghetti code (trust me: It’s hard when you have to write HTML and frontend JavaScript in string literal templates)
Hey guys! Yesterday, I tried to make this generic model editor, and I have the layout, but the functionality is… well… broke for now. Also, to correct a bug, I had to rewrite the whole functionality of the database. Now I have a proper class wrapper instead of passing the raw database object around.
Today, the edit view successfully shows the right values, but the tomSelect dropdowns I tried to add were a complete failure. TODO: Fix tomSelect.
Hey guys! Now tom-select is 100% working and model editing works… at least 50%? Well, and we also have this gorgeous CSS styling that matches with Vscode styles!
Hey guys! Today, I officially finished CRUD! For all models! I also made tag assignment work 100% fine. Besides that, I improved a bit on code modularity and organization and did small patches. TODO: Improve the “R” and maybe the “D” of CRUD; Add the snippet pasting part (the app focus).
Hey guys! I did a search engine for the list view! It was kind of complex, as I had to deal with SQL joins (INNER JOIN for NOT NULL fields and LEFT JOIN for optional fields), a bridge table, JSON_GROUP_ARRAY, etc, but in the end, it worked. Just have to test a bit more the search bar as it sometimes have some glitches (every time a search is fired, the whole DOM is reloaded).
Hello guys! Now we can paste the snippets directly from the webview! Also, it has dynamic templates: [%%] executes simple JavaScript and can access variables such as BP_FILENAME or BP_YEAR [##] turns into tabstops: can be either [# index #] or [# index | default value #] where index is an integer, and optional default value can be used when user just skips the tabstop However, as a safety measure, the templates can’t directly access vscode, node.js or other possibly sensible variables, methods or functions.
Hello, fellow devs! I just wrote this info at index about the extension and about the templates. I also made the snippet typing more similar to Vscode coding, so now it has tab indentation, and auto closes quotes, parenthesis, brackets, curly braces and the extension templating “[%” and “[#”. TODO: Fix the frontend script that is now half broken.
Hello. I started preparing extension for release, so I changed compiler to esbuild and added the GSL3 license to my project. I also started trying to implement the option to add custom variables for templating to the extension, but it’s all broken.
Hello, fellow devs! Today, I solved the issues related to macros. Also, letting it in configs.json made it messy, counterintuitive and less integrated with the rest of the extension, so I moved it to the webviews, together with the snippets, tags and languages you’re all already familiar with. The evaluation order is very important, as this is what grants macros can be access by other macros, only needing to come before in the order. I’m really excited to see what will people come up with this.
Hello, fellow devs! Yesterday, I completed the CRUD for languages! You can now create, edit or even delete them. The internal name is searched in Vscode language IDs. To delete one, if you have snippets assigned to them, you can either reassign all of them to another language or delete them along with the language, both automatically made.
Hello, fellow devs! Today, I added this gorgeous gif into the readme. Also, I had to escape the content to be shown in list view (I discovered it the worst way: completely breaking the layout while playing around with HTML and PHP snippets) and added aliases for languages, which makes searching them easier. I removed frontend JS and CSS into actual files (they were string literals before) and, finally, moved some files around.
Bug patching and extension updating
Ships:
Hello guys! Today, I celebrate the shipping of Br-Zueira’s Boilerplater! It serves for saving (ctrl+u, mac: cmd+u) and pasting code snippets (ctrl+alt+u, mac: cmd+alt+u). It also supports categorizing them by tags and languages, giving descriptions and titles to them and even supports macros: [%%] -> Supports variables such as BP_FILENAME, some sandboxed JavaScript evaluation and even macros (variables defined by yourself using JavaScript code) [#n#] -> Tabstops, where n is an index (they’re standard Vscode tabstops: evaluated from 1 to infinity and beyond, 0 at last and can be grouped like in the example) [#n|fallback#] -> Tabstops but with a placeholder/fallback if user chooses to ignore the tabstop. Also, you can change the snippets by the extension itself (supports basic coding editor features, such as tab indenting or auto closing quotes). For all this. it uses an in-build webview (ctrl+alt+u, mac: cmd+alt+u). You can easily download it at Microsoft Extension Marketplace (just search by “Br-Zueira’s Boilerplater”). If you want, you can also get the VSIX file at GitHub Releases (then open it with Vscode and click “Download VSIX extension”). It’s plug and enjoy! Hope it really lets your workflow more frictionless!...
|
1793202465.9314814
|
1793288865.9314814
|
|
20351
|
MarPad v1 by @marcel_pb | Stardance
|
marcel_pb
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T16:53:33Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made the MarPad , it is my version of the HackPad and my submission for the Hackpad Mission ! It is a plug-in small keyboard like piece of hardware which is customizable for many uses. I think that the most challenging part of this challenge was the firmware set-up (my first time doing this process) and the PCB creation (which was my first contact with PCB design ever! ) I’m proud of the final product, I think that it reflects both the hurdles I had to overcome to complete it, as well as the creative output I put into the work. I think it is a unique and fun design which reflects who I am and how I work! I am very happy :) Anyone who’d like to test the project must use the HackPad kit, and a 3D printer. Those are the only required materials, and nothing else. Thank you to everyone who has helped me across slack and the guide!", "repo": "https://github.com/12-mrcel/MarcelHackPad", "demo": ""}]...
|
[{"post_id": 14472, "ts": "202 [{"post_id": 14472, "ts": "2026-06-23T16:34:34Z", "hours": 1.2403, "text": "Devlog #5: Setting up Github, finalizing! I want to move towards more ambitious projects once this is done. I’ve just completed the adjustments to the files, the firmware, everything! Accomplishment of the day: I set up my first ever github repo ! I used the resources provided by Stardance to learn Readme files and organization. I’m so glad I discovered Hack Club along with this program. This project has been really fun, very interesting, educational, and definitely a creative output for myself. I struggled a bit, putting all the files into the main section of the repo, before realizing that I can’t move them, and must reupload as well as delete them one by one. But at the end of the day, I’m happy I’ve progressed. If you’d have told me I’d be doing any of this just one month ago, I wouldn’t have believed you! Thank you so very much for this opportunity! I hope everyone likes my MarPad! GitHub link! Demo Link!"}, {"post_id": 14001, "ts": "2026-06-22T23:37:07Z", "hours": 1.0403, "text": "Devlog #4: Some setbacks, and solving them! Today I had one main goal: To finalize the casing for my MarPad. I wanted to ensure that: The PCB would fit in the case (Important!!) The holes for each component are correctly placed The design was well reminiscent of Apollo era NASA mission control desks. So what happened? it turns out, my measurements inside KiCad were slightly off , which led to my measurements in Fusion360 to also have been off. I felt the design was slightly empty, to fix: I added two main changes. The first was a panel on the top left (as seen in old photos) with the name of the Ford company in charge of aerospace. The second was a panel with screw heads. About that problem: I downloaded the PCB from KiCad as a STEP file, and then imported into the CAD software for my case. Once I lined up the PCB with the case, I realized that the position of the pins on the Rotary Encoder weren’t aligned with the holes in the PCB. I didn’t worry, and moved the PCB accordingly, before realizing now it was out of place within the case. I caught on before making many changes, and realized I had to fix the positions of the entirety of the top half of the casing, the plate. And so, I did: I went to the sketches and moved the holes in the plate accordingly, making minute adjustments (Some even fractions of a mm) which fixed the issue. It took me a while (Most of which seems to not be synced to Stardance) but I got it working and I’m really proud. All in all, I’ve made good progress and worked towards a unique design I love."}, {"post_id": 13637, "ts": "2026-06-22T11:30:34Z", "hours": 2.7228, "text": "Devlog #3: Customizing the MarPad v1 Didn’t have too much time in this sitting so I decided to find a model for the keycaps and put them into the CAD design. I used some colors from a photo of the old Apollo 11 mission control desks. I want the buttons to look like and also be named like the NASA mission control desks (e.g. the buttons can be named “launch” “booster” or “voice control” etc.). It was a fun process, but not a long one."}, {"post_id": 12794, "ts": "2026-06-20T22:31:21Z", "hours": 1.6506, "text": "Devlog #2! On my MarPad v1 Only about an hour and a half today, turns out we had plans… nevertheless! I was able to do some fun work on my MarPad v1 and I’m quite proud of it. Today my accomplishments were: Making minor adjustments to the Casing Learning to adjust movements precisely in KiCad Designing and customizing my Casing (this was fun!) What was the inspiration? Well, as you can see, there is a clear color palette and theme behind my HackPad design. That is, of course, the Apollo 11 mission control desks! The Color Scheme is ripped straight out of the 60s, and I loved the “Flight Director” name-triangular prism, thus I added it to the design. Enough nerding out over old NASA desks, I did learn some cool tricks on CAD today, which I am proud of. For example, I learnt how to change what gets selected when I do a box select. Or, another example, how to emboss text or designs. (Very nice!) That’s it for today! I hope to continue swiftly and steadily, and am looking forward to more design ideas for this case."}, {"post_id": 12153, "ts": "2026-06-19T21:02:26Z", "hours": 2.6628, "text": "Setting up the MarPad (“Marcel” Pad V1): Today was a good chunk of work. I worked on the following things: Brainstorming (what will it look like, what components do I need?) Creating the Schematic, and Ensuring the PCB was correct and organized. Setting up QMK and the firmware for the HackPad Creating the base case. These were the three main things I completed. I’d have to say that the most challenging part was the QMK setup, as I am still learning all of the processes involved with CAD, CS, and coding overall. I’m on a Mac, and decided to go the HomeBrew route. Inspiration: I have to give credits to MrKillerShaunBa and Matyas604. Both of their GitHub repos had incredibly useful information to guide me (I mainly used the images as reference and guessed how to DIY it!). Many thanks to both of you! https://github.com/MrKillerShaunBa/BajajPad/tree/main https://github.com/Matyas604/Matyas-s-Hackpad/blob/main/Assets/Case.png Lastly, I finally got my Hackatime working, so this is my first DevLog here, thanks to all the people in #Hackpad in slack who helped me out! (edit: someone helped me learn markdown formatting! :) )"}]...
|
Title: MarPad v1 by @marcel_pb | Stardance
Devlog Title: MarPad v1 by @marcel_pb | Stardance
Devlogs:
Setting up the MarPad (“Marcel” Pad V1): Today was a good chunk of work. I worked on the following things: Brainstorming (what will it look like, what components do I need?) Creating the Schematic, and Ensuring the PCB was correct and organized. Setting up QMK and the firmware for the HackPad Creating the base case. These were the three main things I completed. I’d have to say that the most challenging part was the QMK setup, as I am still learning all of the processes involved with CAD, CS, and coding overall. I’m on a Mac, and decided to go the HomeBrew route. Inspiration: I have to give credits to MrKillerShaunBa and Matyas604. Both of their GitHub repos had incredibly useful information to guide me (I mainly used the images as reference and guessed how to DIY it!). Many thanks to both of you! https://github.com/MrKillerShaunBa/BajajPad/tree/main https://github.com/Matyas604/Matyas-s-Hackpad/blob/main/Assets/Case.png Lastly, I finally got my Hackatime working, so this is my first DevLog here, thanks to all the people in #Hackpad in slack who helped me out! (edit: someone helped me learn markdown formatting! :) )
Devlog #2! On my MarPad v1 Only about an hour and a half today, turns out we had plans… nevertheless! I was able to do some fun work on my MarPad v1 and I’m quite proud of it. Today my accomplishments were: Making minor adjustments to the Casing Learning to adjust movements precisely in KiCad Designing and customizing my Casing (this was fun!) What was the inspiration? Well, as you can see, there is a clear color palette and theme behind my HackPad design. That is, of course, the Apollo 11 mission control desks! The Color Scheme is ripped straight out of the 60s, and I loved the “Flight Director” name-triangular prism, thus I added it to the design. Enough nerding out over old NASA desks, I did learn some cool tricks on CAD today, which I am proud of. For example, I learnt how to change what gets selected when I do a box select. Or, another example, how to emboss text or designs. (Very nice!) That’s it for today! I hope to continue swiftly and steadily, and am looking forward to more design ideas for this case.
Devlog #3: Customizing the MarPad v1 Didn’t have too much time in this sitting so I decided to find a model for the keycaps and put them into the CAD design. I used some colors from a photo of the old Apollo 11 mission control desks. I want the buttons to look like and also be named like the NASA mission control desks (e.g. the buttons can be named “launch” “booster” or “voice control” etc.). It was a fun process, but not a long one.
Devlog #4: Some setbacks, and solving them! Today I had one main goal: To finalize the casing for my MarPad. I wanted to ensure that: The PCB would fit in the case (Important!!) The holes for each component are correctly placed The design was well reminiscent of Apollo era NASA mission control desks. So what happened? it turns out, my measurements inside KiCad were slightly off , which led to my measurements in Fusion360 to also have been off. I felt the design was slightly empty, to fix: I added two main changes. The first was a panel on the top left (as seen in old photos) with the name of the Ford company in charge of aerospace. The second was a panel with screw heads. About that problem: I downloaded the PCB from KiCad as a STEP file, and then imported into the CAD software for my case. Once I lined up the PCB with the case, I realized that the position of the pins on the Rotary Encoder weren’t aligned with the holes in the PCB. I didn’t worry, and moved the PCB accordingly, before realizing now it was out of place within the case. I caught on before making many changes, and realized I had to fix the positions of the entirety of the top half of the casing, the plate. And so, I did: I went to the sketches and moved the holes in the plate accordingly, making minute adjustments (Some even fractions of a mm) which fixed the issue. It took me a while (Most of which seems to not be synced to Stardance) but I got it working and I’m really proud. All in all, I’ve made good progress and worked towards a unique design I love.
Devlog #5: Setting up Github, finalizing! I want to move towards more ambitious projects once this is done. I’ve just completed the adjustments to the files, the firmware, everything! Accomplishment of the day: I set up my first ever github repo ! I used the resources provided by Stardance to learn Readme files and organization. I’m so glad I discovered Hack Club along with this program. This project has been really fun, very interesting, educational, and definitely a creative output for myself. I struggled a bit, putting all the files into the main section of the repo, before realizing that I can’t move them, and must reupload as well as delete them one by one. But at the end of the day, I’m happy I’ve progressed. If you’d have told me I’d be doing any of this just one month ago, I wouldn’t have believed you! Thank you so very much for this opportunity! I hope everyone likes my MarPad! GitHub link! Demo Link!
Ships:
I made the MarPad , it is my version of the HackPad and my submission for the Hackpad Mission ! It is a plug-in small keyboard like piece of hardware which is customizable for many uses. I think that the most challenging part of this challenge was the firmware set-up (my first time doing this process) and the PCB creation (which was my first contact with PCB design ever! ) I’m proud of the final product, I think that it reflects both the hurdles I had to overcome to complete it, as well as the creative output I put into the work. I think it is a unique and fun design which reflects who I am and how I work! I am very happy :) Anyone who’d like to test the project must use the HackPad kit, and a 3D printer. Those are the only required materials, and nothing else. Thank you to everyone who has helped me across slack and the guide!...
|
1793256502.6343603
|
1793342902.6343603
|
|
20353
|
Offline Youtube-esque player by @Fury | Stardance
|
Fury
|
1
|
23.27
|
127
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T04:10:27Z", "hours": 23.0, "multiplier": 5.56, "payout": 127, "blessing": "neutral", "text": "I made an Offline Media player", "repo": "https://github.com/Furyx407/Offline-YT-Player", "demo": "https://github.com/Furyx407/Offline-YT-Player/releases/tag/V1.0.0"}]...
|
[{"post_id": 19836, "ts": "202 [{"post_id": 19836, "ts": "2026-07-01T07:15:55Z", "hours": 0.2714, "text": "Added a Windows executable, was annoying because there is not an easy way to convert python to windows executable on Linux ( PyInstaller converts it to a Linux executable)"}, {"post_id": 18121, "ts": "2026-06-29T04:03:55Z", "hours": 2.5006, "text": "Implemented ability to resize thumbnails"}, {"post_id": 15346, "ts": "2026-06-24T23:03:21Z", "hours": 1.1494, "text": "Added ability to change the playback speed, it was somehow easier than having the icons change colours ( I am still procrastinating it)"}, {"post_id": 14722, "ts": "2026-06-23T22:39:33Z", "hours": 0.7844, "text": "Made settings persistent and added a toggle to set duration label to time left, making settings persistent was easier than expected as it was just a couple lines of code but getting syntax correctly was annoying."}, {"post_id": 14194, "ts": "2026-06-23T05:56:02Z", "hours": 0.6967, "text": "Implemented (Working) Dark and light mode, not currently persistent but was annoying because I had to make a custom toggle switch."}, {"post_id": 14122, "ts": "2026-06-23T03:06:05Z", "hours": 5.3253, "text": "Implemented settings with toggle options, haven’t populated it yet but implementing a toggle switch was hard as there isn’t one natively in PyQt6"}, {"post_id": 12509, "ts": "2026-06-20T13:05:28Z", "hours": 3.3236, "text": "Implemented basic video playback"}, {"post_id": 11931, "ts": "2026-06-19T13:52:04Z", "hours": 7.0711, "text": "Implemented Thumbnails and title (with wrapping), thumbnails layout changes with resizing"}, {"post_id": 10938, "ts": "2026-06-17T22:35:09Z", "hours": 2.1292, "text": "Implement PyQt6 & added exit button and search box"}]...
|
Title: Offline Youtube-esque player by @Fury | Sta Title: Offline Youtube-esque player by @Fury | Stardance
Devlogs:
Implement PyQt6 & added exit button and search box
Implemented Thumbnails and title (with wrapping), thumbnails layout changes with resizing
Implemented basic video playback
Implemented settings with toggle options, haven’t populated it yet but implementing a toggle switch was hard as there isn’t one natively in PyQt6
Implemented (Working) Dark and light mode, not currently persistent but was annoying because I had to make a custom toggle switch.
Made settings persistent and added a toggle to set duration label to time left, making settings persistent was easier than expected as it was just a couple lines of code but getting syntax correctly was annoying.
Added ability to change the playback speed, it was somehow easier than having the icons change colours ( I am still procrastinating it)
Implemented ability to resize thumbnails
Added a Windows executable, was annoying because there is not an easy way to convert python to windows executable on Linux ( PyInstaller converts it to a Linux executable)
Ships:
I made an Offline Media player...
|
1793137921.9539018
|
1793224321.9539018
|
|
20366
|
HydraCoaster by @dxnkey | Stardance
|
dxnkey
|
1
|
23.0
|
116
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-13T04:15:23Z", "hours": 23.0, "multiplier": 5.0, "payout": 116, "blessing": "neutral", "text": "I made a “HydraCoaster”, a smart drink coaster that tracks how much you drink, reminds you when you’ve gone too long without water, and adjusts your hydration goal based on the weather! It connects to a full iOS app where you can see your daily progress, streaks, badges, drink history, and even sync everything with Apple Health! The hardest part was making the coaster reliable when the phone wasn’t connected. I had to fix Bluetooth timing issues, recover offline sips, improve weight accuracy, and make sure celebrations only triggered after the coaster confirmed they actually played. I’m most proud that this started as a basic ESP32 prototype and turned into something that feels like a real product. It’s fully wireless, has a custom enclosure, supports over-the-air updates, logs drinks automatically, and even celebrates when you hit your goal! I’d really appreciate if you could give me all 9s because this took forever to make. Thank you!", "repo": "https://github.com/guptaronav/HydraCoaster", "demo": ""}]...
|
[{"post_id": 27496, "ts": "202 [{"post_id": 27496, "ts": "2026-07-13T03:35:01Z", "hours": 1.9564, "text": "Devlog #8 – HydraCoaster V3 IS HERE!!!! THE PARTY ALWAYS ARRIVES Shipping a celebration and reliably delivering one turn out to be different problems. V2 marked your once-a-day celebration as used the moment the phone sent the command — so if the coaster rejected it or the reply got lost in the air, the day burned with nothing played, and it never retried. Now the day is only recorded when the coaster confirms the flourish actually ran; a bad or lost reply clears the pending marker and the next qualifying sip simply sends it again. Crossing 100% away from the coaster counts too. Log a glass at a restaurant, walk in the door, and the celebration fires the moment the coaster reconnects — no waiting for another sip. Amber pulses and ascending chirps, right on cue. NO MORE VANISHING SIPS The nastiest bug of the release: the app called itself “connected” the instant Bluetooth linked, before it had discovered where writes actually go. Everything that fires on connect — including the request for sips the coaster logged while your phone was away — hit a not-ready guard and was silently dropped. Offline sips just never backfilled. “Connected” now means ready-to-write, and a failed discovery disconnects for a clean retry. Every phone-free sip lands in your history on the next reconnect, every time. A RING WITH A PULSE The Today ring traded flat ink for an angular gradient with a liquid sheen, progress moves on a spring, and the first time it fills each day it does a quick scale pulse and pins a sparkly “goal reached” under the number — the on-phone echo of the coaster’s flourish. The streak flame bounces when your streak grows. The Awards tab got tinted icon circles on the stat tiles, earned badges on accent-washed gradient cards, badge symbols that bounce when unlocked, and a cascading entrance. Turn on Reduce Motion and all of it politely sits still. PUSH TO PARTY A Celebration Test button now lives in Settings, right under Buzz Test. Unlike Buzz Test, it respects your Sound and Light toggles, so it exercises the exact path a real goal celebration takes. A checkmark plus silence means your toggles are off — not that something’s broken."}, {"post_id": 25723, "ts": "2026-07-10T04:54:31Z", "hours": 5.1506, "text": "Devlog #7 – HydraCoaster V2 IS HERE!!!! SMARTER GOALS Your daily goal can now be computed from weight, height, and activity level instead of picked from a wheel, and it scales up on hot or dry days using the same OpenWeatherMap feed that already drives reminder pacing. The Today ring shows the weather bump as a caption so a bigger goal never looks like a bug. Streaks and badges always judge against your base goal, since past days’ weather isn’t stored — that’s deliberate and documented in the code. REAL DRINK TRACKING A 61-drink catalog across 9 categories, each with a hydration factor — water is 1.0, espresso less, beer much less. Log drinks manually with the + button, or reclassify any coaster-detected sip after the fact. Apple Health entries are replaced in place when you reclassify, so Health always agrees with the app. SLEEP-AWARE QUIET HOURS The coaster no longer buzzes at 3am. Quiet hours come in three modes: off, manual times, or derived from your Health sleep data — a 14-day median of bedtime and wake, with naps filtered out and a noon-centered median so bedtimes straddling midnight don’t average to lunchtime. The phone converts your local window to UTC and rewrites it to the coaster on every connect and every half-hour weather tick, which means daylight-saving shifts fix themselves within one cycle and the firmware never learns what a timezone is. A reminder suppressed overnight isn’t lost — it fires on the first check after the window ends. Phone-side, notifications defer to fifteen minutes after wake, reminders got a snooze button, and three presets (Gentle, Standard, Persistent) scale how hard the whole system nags. One casualty: the “Respect Focus” toggle. Apple’s Focus-status entitlement can’t ride on a free personal-team provisioning profile, so the feature is compiled out behind a flag with a note on how to restore it if the project ever gets a paid developer account. STREAKS, BADGES, AWARDS A fourth tab. Today’s hydration score, current streak, and longest streak up top; below, ten badges from First Sip to a 30-day streak, a lifetime 50 liters, an early-bird sip before 8am, and a perfect calendar week. Everything is recomputed from sip history on demand — nothing is stored, so the numbers can never drift from the data. A small flame chip appears on Today once you’re two days deep. DEEPER HISTORY Week and month chart ranges, a GitHub-style heatmap of the last twelve weday got to goal, a per-category drink breakdown, and CSV export of yourentire sip history from the share button — RFC-4180 quoted, ISO-8601 dates, ready for a spreadsheet. THEMES AND A WIDGET Four color themes — Aqua (the original), Sunset, Forest, Mono — plus a light/dark override, all applied live. A home-screen and lock-screen widget shows the progress ring and streak, updated through an App Group the moment a sip lands. THE COASTER CELEBRATES WITH YOU New firmware command: the first time you hit 100% in a day, the coaster pirps with amber LED pulses — deliberately distinct from the reminder alertby both ear and eye. It respects your sound and light preferences, fires once per day, and triggers against the same weather-scaled goal the ring shows."}, {"post_id": 25158, "ts": "2026-07-09T06:26:19Z", "hours": 5.3192, "text": "Devlog #6 – HydraCoaster Today, I setup HydraCoaster with BLE and made a full-fledged iOS app! The whole reminder system is now onboard: sip detection, automatic zero-drift correction, and self-timed buzz reminders now run on the ESP32 with no computer anywhere. Sips get logged to flash and served over a custom BLE service: live weight streaming, history backfill, time sync, calibration commands, battery. The product build is BLE-only, but a dev build keeps WiFi OTA so reflashing stays cable-free. The app has a sixty-second onboarding (pair + set a goal), Today screen with a goal ring and live weight, 14-day history chart, Settings with sound/light/reminder toggles, buzz test, notification test, reset data button, and a guided recalibration flow. Sips sync into SwiftData, write to Apple Health with their real timestamps, and the phone mirrors the coaster’s reminder as a local notification."}, {"post_id": 24555, "ts": "2026-07-08T06:15:02Z", "hours": 5.3839, "text": "Devlog #5 – HydraCoaster Printed and converted to V2 of the hardware enclosure (images not attached)! New CAD has an added cork base, and had to add the hardware for a buzzer as well. Made HydraCoaster fully wireless! It now streams weight over WiFi (UDP), reflashes over the air, and the USB cable is optional. I also built a notification system: a piezo buzzer plays a three-tone alert (low for hearing loss, mid for loudness, high to beat noise-cancelling), with the onboard LED flashing white in sync. The server detects sips from weight drops, and buzzes the coaster when you haven’t drunk for too long — 20 min base, shortened in hot/dry weather (OpenWeatherMap), relaxed after a good drinking session. Dashboard got a console showing location/temp/humidity/interval, a test buzz button, and persistent toggles for sound, LED, and reminders."}, {"post_id": 23818, "ts": "2026-07-06T23:51:44Z", "hours": 1.1592, "text": "Devlog #4 – HydraCoaster I tested V1 of the enclosure and created a proof of concept software to test the basic hydration session system. The electronics fit perfectly but the strain gauge is offset and has less accurate readings in this coaster. I also printed the TPU cover on the wrong build plate, causing for small imperfections in the print. I plan to reprint the TPU cover and the outer wall of the coaster to be a bit taller so that there’s more wiggle room for the strain gauge. The software is measuring values that are really wrong, but the start and end values are equally wrong. This means the session drinking amounts are really right and I’m happy with that for now!"}, {"post_id": 23259, "ts": "2026-07-06T03:15:11Z", "hours": 2.3414, "text": "Devlog #3 – HydraCoaster I designed V1 of the HydraCoaster’s enclosure/case and tried my best to house the electronics as well as possible. I definitely will need future iterations to fix the weight mechanism and also include more features like LEDs, vibration motors, buzzers, etc. I’m really happy with what I’ve got so far and can’t wait to see this through!"}, {"post_id": 22508, "ts": "2026-07-05T00:42:40Z", "hours": 1.2089, "text": "Devlog #2 – HydraCoaster I switched from the FSR402s to a proper 1kg Load Cell that has much higher accuracy when connected to an Adafruit NAU7802. After some testing, the load cell returned values with accuracy down to the tenth of a gram. With the right code and design, this is the perfect component for a compact smart coaster!"}, {"post_id": 10296, "ts": "2026-06-16T22:49:15Z", "hours": 0.7628, "text": "Devlog #1 – HydraCoaster Hi everyone! This is my second hardware project on Stardance and I think it might be my favorite. The goal of this project is to eventually make something with a sleek form factor and the potential of being scaled into a real product. I envision a PCB, meaning I need to learn PCB design and production. However, for now, I’m prototyping with a breadboard and perf board just to learn the basics. I’ve wired an ESP 32 C6 Feather with two FSR402 pressure sensors and a passive buzzer. I’ve coded a basic OWM pull with PlatformIO and Arduino framework. It adapts drinking intervals using the temperature from OWM and buzzes accordingly. That’s all I have for now!"}]...
|
Title: HydraCoaster by @dxnkey | Stardance
Devlog Title: HydraCoaster by @dxnkey | Stardance
Devlogs:
Devlog #1 – HydraCoaster Hi everyone! This is my second hardware project on Stardance and I think it might be my favorite. The goal of this project is to eventually make something with a sleek form factor and the potential of being scaled into a real product. I envision a PCB, meaning I need to learn PCB design and production. However, for now, I’m prototyping with a breadboard and perf board just to learn the basics. I’ve wired an ESP 32 C6 Feather with two FSR402 pressure sensors and a passive buzzer. I’ve coded a basic OWM pull with PlatformIO and Arduino framework. It adapts drinking intervals using the temperature from OWM and buzzes accordingly. That’s all I have for now!
Devlog #2 – HydraCoaster I switched from the FSR402s to a proper 1kg Load Cell that has much higher accuracy when connected to an Adafruit NAU7802. After some testing, the load cell returned values with accuracy down to the tenth of a gram. With the right code and design, this is the perfect component for a compact smart coaster!
Devlog #3 – HydraCoaster I designed V1 of the HydraCoaster’s enclosure/case and tried my best to house the electronics as well as possible. I definitely will need future iterations to fix the weight mechanism and also include more features like LEDs, vibration motors, buzzers, etc. I’m really happy with what I’ve got so far and can’t wait to see this through!
Devlog #4 – HydraCoaster I tested V1 of the enclosure and created a proof of concept software to test the basic hydration session system. The electronics fit perfectly but the strain gauge is offset and has less accurate readings in this coaster. I also printed the TPU cover on the wrong build plate, causing for small imperfections in the print. I plan to reprint the TPU cover and the outer wall of the coaster to be a bit taller so that there’s more wiggle room for the strain gauge. The software is measuring values that are really wrong, but the start and end values are equally wrong. This means the session drinking amounts are really right and I’m happy with that for now!
Devlog #5 – HydraCoaster Printed and converted to V2 of the hardware enclosure (images not attached)! New CAD has an added cork base, and had to add the hardware for a buzzer as well. Made HydraCoaster fully wireless! It now streams weight over WiFi (UDP), reflashes over the air, and the USB cable is optional. I also built a notification system: a piezo buzzer plays a three-tone alert (low for hearing loss, mid for loudness, high to beat noise-cancelling), with the onboard LED flashing white in sync. The server detects sips from weight drops, and buzzes the coaster when you haven’t drunk for too long — 20 min base, shortened in hot/dry weather (OpenWeatherMap), relaxed after a good drinking session. Dashboard got a console showing location/temp/humidity/interval, a test buzz button, and persistent toggles for sound, LED, and reminders.
Devlog #6 – HydraCoaster Today, I setup HydraCoaster with BLE and made a full-fledged iOS app! The whole reminder system is now onboard: sip detection, automatic zero-drift correction, and self-timed buzz reminders now run on the ESP32 with no computer anywhere. Sips get logged to flash and served over a custom BLE service: live weight streaming, history backfill, time sync, calibration commands, battery. The product build is BLE-only, but a dev build keeps WiFi OTA so reflashing stays cable-free. The app has a sixty-second onboarding (pair + set a goal), Today screen with a goal ring and live weight, 14-day history chart, Settings with sound/light/reminder toggles, buzz test, notification test, reset data button, and a guided recalibration flow. Sips sync into SwiftData, write to Apple Health with their real timestamps, and the phone mirrors the coaster’s reminder as a local notification.
Devlog #7 – HydraCoaster V2 IS HERE!!!! SMARTER GOALS Your daily goal can now be computed from weight, height, and activity level instead of picked from a wheel, and it scales up on hot or dry days using the same OpenWeatherMap feed that already drives reminder pacing. The Today ring shows the weather bump as a caption so a bigger goal never looks like a bug. Streaks and badges always judge against your base goal, since past days’ weather isn’t stored — that’s deliberate and documented in the code. REAL DRINK TRACKING A 61-drink catalog across 9 categories, each with a hydration factor — water is 1.0, espresso less, beer much less. Log drinks manually with the + button, or reclassify any coaster-detected sip after the fact. Apple Health entries are replaced in place when you reclassify, so Health always agrees with the app. SLEEP-AWARE QUIET HOURS The coaster no longer buzzes at 3am. Quiet hours come in three modes: off, manual times, or derived from your Health sleep data — a 14-day median of bedtime and wake, with naps filtered out and a noon-centered median so bedtimes straddling midnight don’t average to lunchtime. The phone converts your local window to UTC and rewrites it to the coaster on every connect and every half-hour weather tick, which means daylight-saving shifts fix themselves within one cycle and the firmware never learns what a timezone is. A reminder suppressed overnight isn’t lost — it fires on the first check after the window ends. Phone-side, notifications defer to fifteen minutes after wake, reminders got a snooze button, and three presets (Gentle, Standard, Persistent) scale how hard the whole system nags. One casualty: the “Respect Focus” toggle. Apple’s Focus-status entitlement can’t ride on a free personal-team provisioning profile, so the feature is compiled out behind a flag with a note on how to restore it if the project ever gets a paid developer account. STREAKS, BADGES, AWARDS A fourth tab. Today’s hydration score, current streak, and longest streak up top; below, ten badges from First Sip to a 30-day streak, a lifetime 50 liters, an early-bird sip before 8am, and a perfect calendar week. Everything is recomputed from sip history on demand — nothing is stored, so the numbers can never drift from the data. A small flame chip appears on Today once you’re two days deep. DEEPER HISTORY Week and month chart ranges, a GitHub-style heatmap of the last twelve weday got to goal, a per-category drink breakdown, and CSV export of yourentire sip history from the share button — RFC-4180 quoted, ISO-8601 dates, ready for a spreadsheet. THEMES AND A WIDGET Four color themes — Aqua (the original), Sunset, Forest, Mono — plus a light/dark override, all applied live. A home-screen and lock-screen widget shows the progress ring and streak, updated through an App Group the moment a sip lands. THE COASTER CELEBRATES WITH YOU New firmware command: the first time you hit 100% in a day, the coaster pirps with amber LED pulses — deliberately distinct from the reminder alertby both ear and eye. It respects your sound and light preferences, fires once per day, and triggers against the same weather-scaled goal the ring shows.
Devlog #8 – HydraCoaster V3 IS HERE!!!! THE PARTY ALWAYS ARRIVES Shipping a celebration and reliably delivering one turn out to be different problems. V2 marked your once-a-day celebration as used the moment the phone sent the command — so if the coaster rejected it or the reply got lost in the air, the day burned with nothing played, and it never retried. Now the day is only recorded when the coaster confirms the flourish actually ran; a bad or lost reply clears the pending marker and the next qualifying sip simply sends it again. Crossing 100% away from the coaster counts too. Log a glass at a restaurant, walk in the door, and the celebration fires the moment the coaster reconnects — no waiting for another sip. Amber pulses and ascending chirps, right on cue. NO MORE VANISHING SIPS The nastiest bug of the release: the app called itself “connected” the instant Bluetooth linked, before it had discovered where writes actually go. Everything that fires on connect — including the request for sips the coaster logged while your phone was away — hit a not-ready guard and was silently dropped. Offline sips just never backfilled. “Connected” now means ready-to-write, and a failed discovery disconnects for a clean retry. Every phone-free sip lands in your history on the next reconnect, every time. A RING WITH A PULSE The Today ring traded flat ink for an angular gradient with a liquid sheen, progress moves on a spring, and the first time it fills each day it does a quick scale pulse and pins a sparkly “goal reached” under the number — the on-phone echo of the coaster’s flourish. The streak flame bounces when your streak grows. The Awards tab got tinted icon circles on the stat tiles, earned badges on accent-washed gradient cards, badge symbols that bounce when unlocked, and a cascading entrance. Turn on Reduce Motion and all of it politely sits still. PUSH TO PARTY A Celebration Test button now lives in Settings, right under Buzz Test. Unlike Buzz Test, it respects your Sound and Light toggles, so it exercises the exact path a real goal celebration takes. A checkmark plus silence means your toggles are off — not that something’s broken.
Ships:
I made a “HydraCoaster”, a smart drink coaster that tracks how much you drink, reminds you when you’ve gone too long without water, and adjusts your hydration goal based on the weather! It connects to a full iOS app where you can see your daily progress, streaks, badges, drink history, and even sync everything with Apple Health! The hardest part was making the coaster reliable when the phone wasn’t connected. I had to fix Bluetooth timing issues, recover offline sips, improve weight accuracy, and make sure celebrations only triggered after the coaster confirmed they actually played. I’m most proud that this started as a basic ESP32 prototype and turned into something that feels like a real product. It’s fully wireless, has a custom enclosure, supports over-the-air updates, logs drinks automatically, and even celebrates when you hit your goal! I’d really appreciate if you could give me all 9s because this took forever to make. Thank you!...
|
1793246016.8914316
|
1793332416.8914316
|
|
20368
|
Personal Portfolio by @aamir_pa2009 | Stardance
|
aamir_pa2009
|
1
|
2.17
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-28T22:39:17Z", "hours": 1.0, "multiplier": 2.07, "payout": 2, "blessing": "neutral", "text": "I made my personal portfolio, I used AI for the README and some styling decisions.", "repo": "https://github.com/AamirKPathan/personalWebsite", "demo": "https://aamirkpathan.github.io/personalWebsite/"}]...
|
[{"post_id": 20732, "ts": "202 [{"post_id": 20732, "ts": "2026-07-02T12:51:22Z", "hours": 0.82, "text": "Development Log — 02‑07‑2026 Overview Today’s development session focused on refining the project foundation and establishing a stronger systems engineering baseline for the ASTRA Autonomous Flight System (AAFS) . Completed Completed the Project Administration documentation (EN‑0001 through EN‑0013). Refined the overall project scope and engineering objectives. Removed autonomous powered landing from the baseline project architecture. Updated EN‑0001 – Project Initialization to reflect the revised project vision. Updated EN‑0002 – Development Roadmap to align with the new project scope. Established a formal document revision workflow using Semantic Versioning. Finalized engineering notebook standards, document templates, and repository organization. Engineering Decisions Scope Revision The autonomous powered landing objective has been removed from the baseline ASTRA roadmap. The project will instead focus on: Autonomous Guidance Navigation Flight Stabilization Telemetry Ground Control Systems State Estimation Recovery System Deployment Mission Analysis This decision reduces overall project complexity while allowing greater emphasis on developing a robust and modular flight computer platform. Current Status Project Phase: Program Foundation Overall Progress: Administrative Foundation Complete The engineering framework is now established, allowing development to transition into formal Systems Engineering activities. Next Steps Begin SYS‑001 – Mission Requirements Define mission objectives and operational concept Develop stakeholder requirements Establish functional requirements Build the initial system architecture Notes The project now has a complete administrative framework, including documentation standards, repository standards, requirements traceability, configuration management, verification and validation strategy, and systems engineering management planning. Future development will focus on transforming mission objectives into traceable engineering requirements. Ad Astra Per Artem"}, {"post_id": 18015, "ts": "2026-06-28T23:58:44Z", "hours": 0.355, "text": "I rewrote the README, and some styling to make it more of my style, and align it with the styles of one of my other non open source apps."}, {"post_id": 17970, "ts": "2026-06-28T22:38:47Z", "hours": 0.2594, "text": "Finally figured out how to add my image instead of that floating orange box."}, {"post_id": 10750, "ts": "2026-06-17T17:22:13Z", "hours": 1.17, "text": "I just finished my personal portfolio just some image placeholders to replace right now."}]...
|
Title: Personal Portfolio by @aamir_pa2009 | Stard Title: Personal Portfolio by @aamir_pa2009 | Stardance
Devlogs:
I just finished my personal portfolio just some image placeholders to replace right now.
Finally figured out how to add my image instead of that floating orange box.
I rewrote the README, and some styling to make it more of my style, and align it with the styles of one of my other non open source apps.
Development Log — 02‑07‑2026 Overview Today’s development session focused on refining the project foundation and establishing a stronger systems engineering baseline for the ASTRA Autonomous Flight System (AAFS) . Completed Completed the Project Administration documentation (EN‑0001 through EN‑0013). Refined the overall project scope and engineering objectives. Removed autonomous powered landing from the baseline project architecture. Updated EN‑0001 – Project Initialization to reflect the revised project vision. Updated EN‑0002 – Development Roadmap to align with the new project scope. Established a formal document revision workflow using Semantic Versioning. Finalized engineering notebook standards, document templates, and repository organization. Engineering Decisions Scope Revision The autonomous powered landing objective has been removed from the baseline ASTRA roadmap. The project will instead focus on: Autonomous Guidance Navigation Flight Stabilization Telemetry Ground Control Systems State Estimation Recovery System Deployment Mission Analysis This decision reduces overall project complexity while allowing greater emphasis on developing a robust and modular flight computer platform. Current Status Project Phase: Program Foundation Overall Progress: Administrative Foundation Complete The engineering framework is now established, allowing development to transition into formal Systems Engineering activities. Next Steps Begin SYS‑001 – Mission Requirements Define mission objectives and operational concept Develop stakeholder requirements Establish functional requirements Build the initial system architecture Notes The project now has a complete administrative framework, including documentation standards, repository standards, requirements traceability, configuration management, verification and validation strategy, and systems engineering management planning. Future development will focus on transforming mission objectives into traceable engineering requirements. Ad Astra Per Artem
Ships:
I made my personal portfolio, I used AI for the README and some styling decisions....
|
1793252882.5382705
|
1793339282.5382705
|
|
20373
|
Buddin! by @ayan_bharadwaj | Stardance
|
ayan_bharadwaj
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T15:33:33Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built a mental wellness website called Buddin (getbuddin.org). It’s aimed at teens dealing with loneliness and the pull of social media, and it’s built around a handful of features that work together rather than one single gimmick. The centerpiece is a personal chatbot, designed not as a replacement for real relationships but as a bridge back to them — it’s meant to counter loneliness by encouraging real-world interaction with friends, not by becoming a substitute for it. Alongside that is an activity generator, for the moments when you know there’s more to do than doom-scroll but can’t think of what. There’s also a set of comparison-style activities — choosing between things like luxury products — that work as a light, almost game-like way to understand what kind of person you are and what you actually value. For when you need to physically calm down rather than just distract yourself, there’s a breathing section with a guided animation and calming background music, usable as a short meditation or a quick reset. And tying it all together is a growth tracker, which shows how many activities you’ve completed, badges you’ve earned, and a record of your progress over time. The whole thing is free to use, with a guest mode that lets anyone try a real conversation with Buddin before signing up for an account.", "repo": "https://github.com/ayanbharadwaj/Buddin", "demo": "https://getbuddin.org"}]...
|
[{"post_id": 10406, "ts": "202 [{"post_id": 10406, "ts": "2026-06-17T03:06:55Z", "hours": 0.3097, "text": "Just adding a bit of spacing to the project to make certain parts look a little better."}, {"post_id": 10374, "ts": "2026-06-17T01:44:21Z", "hours": 0.5192, "text": "Fixing the audio because previously the slow rise of the volume when turned on was not working. Just finished and now the volume works lovely!"}, {"post_id": 10357, "ts": "2026-06-17T01:10:40Z", "hours": 1.4958, "text": "The bounce rate was very huge so I had to add a homepage. I also added paths."}]...
|
Title: Buddin! by @ayan_bharadwaj | Stardance
Dev Title: Buddin! by @ayan_bharadwaj | Stardance
Devlogs:
The bounce rate was very huge so I had to add a homepage. I also added paths.
Fixing the audio because previously the slow rise of the volume when turned on was not working. Just finished and now the volume works lovely!
Just adding a bit of spacing to the project to make certain parts look a little better.
Ships:
I built a mental wellness website called Buddin (getbuddin.org). It’s aimed at teens dealing with loneliness and the pull of social media, and it’s built around a handful of features that work together rather than one single gimmick. The centerpiece is a personal chatbot, designed not as a replacement for real relationships but as a bridge back to them — it’s meant to counter loneliness by encouraging real-world interaction with friends, not by becoming a substitute for it. Alongside that is an activity generator, for the moments when you know there’s more to do than doom-scroll but can’t think of what. There’s also a set of comparison-style activities — choosing between things like luxury products — that work as a light, almost game-like way to understand what kind of person you are and what you actually value. For when you need to physically calm down rather than just distract yourself, there’s a breathing section with a guided animation and calming background music, usable as a short meditation or a quick reset. And tying it all together is a growth tracker, which shows how many activities you’ve completed, badges you’ve earned, and a record of your progress over time. The whole thing is free to use, with a guest mode that lets anyone try a real conversation with Buddin before signing up for an account....
|
1793274964.2626994
|
1793361364.2626994
|
|
20376
|
calculater by @CLK | Stardance
|
CLK
|
1
|
2.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T19:06:26Z", "hours": 2.0, "multiplier": 1.11, "payout": 3, "blessing": "neutral", "text": "I made a web-calculator it is a calculator website!!! I am very proud of it because it is the first time I codded in javascript", "repo": "https://github.com/NIVLACvt/web-calculater", "demo": "https://nivlacvt.github.io/web-calculater/"}]...
|
[{"post_id": 13946, "ts": "202 [{"post_id": 13946, "ts": "2026-06-22T21:54:35Z", "hours": 0.58, "text": "Added keyboard translations"}, {"post_id": 13639, "ts": "2026-06-22T11:31:28Z", "hours": 0.3306, "text": "Added 0 and RNG button and made numbers easier to see"}, {"post_id": 13116, "ts": "2026-06-21T13:33:02Z", "hours": 0.3872, "text": "Finished calculating part"}, {"post_id": 13098, "ts": "2026-06-21T13:01:33Z", "hours": 1.0725, "text": "just finished all the buttons and symbols"}]...
|
Title: calculater by @CLK | Stardance
Devlogs:
ju Title: calculater by @CLK | Stardance
Devlogs:
just finished all the buttons and symbols
Finished calculating part
Added 0 and RNG button and made numbers easier to see
Added keyboard translations
Ships:
I made a web-calculator it is a calculator website!!! I am very proud of it because it is the first time I codded in javascript...
|
1793299804.4268084
|
1793386204.4268084
|
|
20381
|
Detention Loop SDK by @DoMax | Stardance
|
DoMax
|
1
|
9.0
|
52
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T16:57:00Z", "hours": 9.0, "multiplier": 5.84, "payout": 52, "blessing": "neutral", "text": "“Exhausted after a long day of school, you just want to go home. Instead, you’re trapped in an endless corridor with entities trying to distort your reality. Look closely. Trust nothing. There might be a way out.” It’s the best way to describe the game “Detention Loop” that was made for Hack Club’s Sprig! Despite the challenges and Sprig’s limitations, it was a very fun time building this project! One of the more frustrating limitations of Sprig’s engine was not being able to load full-sized images. Instead, Sprig only offers loading maps from pre-made sprites. They take up both too much space and are hard to draw/make changes to. So I decided to code it myself - by uploading a full bitmap of the image and dynamically creating maps during runtime with loops, I saved myself a LOT of time. There was other technology involved too that you would rarely see in Sprig games, so I thought of conveniently sharing them all in this Detention Loop SDK available for anyone! With subtle adaptations it can be ported for different purposes too. The SDK includes full game art and script files, as well as reusable snippets and instructions on how to use everything. And as for the game itself, you can play it for free by clicking on the demo link!", "repo": "https://github.com/domasles/detention-loop-sdk", "demo": "https://detention-loop.domax.lt"}]...
|
[{"post_id": 10317, "ts": "202 [{"post_id": 10317, "ts": "2026-06-16T23:53:15Z", "hours": 8.9833, "text": "The first, and probably one of the only devlogs this project will have. It aims to provide all the tools initially used to create a game called “Detention Loop” for the Hack Club’s Sprig! (But heavily updated and adapted for repeated use) It includes: Game itself (with a link to the live demo) A script for converting game assets to a computer-friendly format Reusable code snippets for other game creators that want to adopt Detention Loop’s technology All game assets (and GIMP files with layered drawings) I hope this inspires other creators to pay more attention to code optimization and encourages working with the Sprig! It’s an amazing little gadget with a lot of potential! I also hope that one day solutions used in this project get merged to the full engine so no workarounds need to be found when creating sophisticated games!"}]...
|
Title: Detention Loop SDK by @DoMax | Stardance
D Title: Detention Loop SDK by @DoMax | Stardance
Devlogs:
The first, and probably one of the only devlogs this project will have. It aims to provide all the tools initially used to create a game called “Detention Loop” for the Hack Club’s Sprig! (But heavily updated and adapted for repeated use) It includes: Game itself (with a link to the live demo) A script for converting game assets to a computer-friendly format Reusable code snippets for other game creators that want to adopt Detention Loop’s technology All game assets (and GIMP files with layered drawings) I hope this inspires other creators to pay more attention to code optimization and encourages working with the Sprig! It’s an amazing little gadget with a lot of potential! I also hope that one day solutions used in this project get merged to the full engine so no workarounds need to be found when creating sophisticated games!
Ships:
“Exhausted after a long day of school, you just want to go home. Instead, you’re trapped in an endless corridor with entities trying to distort your reality. Look closely. Trust nothing. There might be a way out.” It’s the best way to describe the game “Detention Loop” that was made for Hack Club’s Sprig! Despite the challenges and Sprig’s limitations, it was a very fun time building this project! One of the more frustrating limitations of Sprig’s engine was not being able to load full-sized images. Instead, Sprig only offers loading maps from pre-made sprites. They take up both too much space and are hard to draw/make changes to. So I decided to code it myself - by uploading a full bitmap of the image and dynamically creating maps during runtime with loops, I saved myself a LOT of time. There was other technology involved too that you would rarely see in Sprig games, so I thought of conveniently sharing them all in this Detention Loop SDK available for anyone! With subtle adaptations it can be ported for different purposes too. The SDK includes full game art and script files, as well as reusable snippets and instructions on how to use everything. And as for the game itself, you can play it for free by clicking on the demo link!...
|
1793141493.6160705
|
1793227893.6160705
|
|
20392
|
Windows Screen Timer Tracker by @Potatoish | Stard Windows Screen Timer Tracker by @Potatoish | Stardance...
|
Potatoish
|
1
|
27.0
|
308
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T06:01:50Z", "hours": 27.0, "multiplier": 11.6, "payout": 308, "blessing": "neutral", "text": "Windows Screen Time Tracker I built a Windows desktop app that automatically tracks, logs, and visualizes how much time you spend in each application. What it does The app runs silently in the background and logs your active window every few seconds. Over time it shows you a picture of how you spend your time on your PC. The app includes: Weekly bar chart that shows your screen time which you can navigate by week A breakdown table that shows you your screentime per app with icons A settings panel which includes settings such as tracking interval, how much data to keep, startup on launch, background running, and dark mode Data is stored locally in JSON files and is never sent anywhere What was challenging The hardest part was getting the app ready to distribute for others since there were issues with versions not being compatible between all the different modules I used and there not being much information available online to troubleshoot properly. How to test it Download the zip from the releases page and extract it Run Windows Screen Time Tracker.exe Open a few different apps and use them for a minute or two each Come back and check the chart and table where you should see your usage broken down by app with accurate times Try the settings panel to change the tracking interval or toggle dark mode by clicking the button", "repo": "https://github.com/amish410/WindowsScreenTimeTracker", "demo": "https://github.com/amish410/WindowsScreenTimeTracker/releases/tag/v1.0.0"}]...
|
[{"post_id": 20563, "ts": "202 [{"post_id": 20563, "ts": "2026-07-02T05:32:36Z", "hours": 2.6281, "text": "Devlog #11 Additions Painfully figured out how to make the app downloadable for others to use after issues with packaging the app with electron due to version issues Some code improvements to be more readable and better in general Updated ReadMe and project info Found and added a logo for the website Finished project and ready for ship #1"}, {"post_id": 19825, "ts": "2026-07-01T06:31:08Z", "hours": 3.3453, "text": "Devlog #10 Additions Added functionality to the dark mode button, which completely changes the background styling Clicking the dark mode button changes the icon to a moon vs a sun on light mode Created a whole new color scheme for dark mode Added dark mode as an automatically saved setting that loads on default upon load Painfully fixed bugs related with storing it as a new setting (mostly due to organization of code and structure) Added new lucide chevron icons for the chart arrow keys Fixed issues with the scroll bar when opening settings pop-up Planned Updates Add some more settings like downloading data, etc. (maybe) Make the app downloadable for others to use Optimize and organize the code to be more readable and better in general Update ReadMe and project info Find and add a logo for the website"}, {"post_id": 19046, "ts": "2026-06-30T07:02:08Z", "hours": 2.7347, "text": "Devlog #9 Additions Added styling to reset button Added the launch on startup and run in background settings that work as said in the names Added tracking interval and how many weeks to keep to decide when to track the data and how much to store Added warning that show what the correct input should be if incorrect input is given Added the reset button functionality that provides a native pop-up to confirm reset before deleting all data Stored settings in a JSON file to save them even after app has been closed Fixed styling and spacing irregularities throughout the app Planned Updates Add functionality to dark mode button Add some more settings like downloading data, etc. Make the app downloadable for others to use Optimize and organize the code to be more readable and better in general Update ReadMe and project info Find and add a logo for the website"}, {"post_id": 18174, "ts": "2026-06-29T06:47:57Z", "hours": 3.2094, "text": "Devlog #8 Additions Added the UI for the settings tab that opens a pop-up showing many settings. Settings include “Launch on Startup,” “Minimize on Close,” “Tracking Interval,” “How many weeks of data to keep,” and a “Reset Data” button. Only the tracking interval has functionality and works as of now Created a slider for the yes or no settings that has a smooth animation/slide Added an input box for other questions with variable settings and a prompt for how to enter settings in Made the chart and table elements auto-adapt to changes in screen size. Planned Updates Add functionality to all other settings Design the reset data button and add functionality Add functionality to dark mode button Make it so settings save even if the app is closed Add some more settings like downloading data, etc. Make the app downloadable for others to use Optimize and organize the code to be more readable and better in general Update ReadMe Update project info Find and add a logo for the website"}, {"post_id": 16703, "ts": "2026-06-27T04:28:53Z", "hours": 2.3692, "text": "Devlog #7 Additions Added custom titlebar at the top with appropriate close, maximize, and minimize buttons Updated scrollbar on the screen to better match the website in terms of styling Changed the layout of the title header to now have the text left-aligned Added two new buttons, one for setting and one for darkmode (might change) on the right side (currently no functionality) Used lucide to get icons for the buttons Updated the font for the chart and the text size Added a footer on the bottom Changed the app name to Windows Screen Time Tracker Fixed any errors that would show up if no active window is detected Planned updates Adding functionality to the buttons Updating the app logo Updating the ReadMe Better organizing code and getting rid of unnecessary things/optimizing Making the chart and other elements auto-adapt to size changes Figuring out how to make it a downloadable app"}, {"post_id": 15502, "ts": "2026-06-25T06:14:17Z", "hours": 2.245, "text": "Devlog #6 Additions Added functionality to arrow buttons that moves between available weeks of data Arrow buttons are grayed out if there is no more data available to be viewed Clicking on different bars of the bar chart now updates the table and the date to show that specific screentime per app for that date Moved the date under the chart and above the table in line with the refresh button Added the week of above the chart, which shows which week of data the chart shows Planned Updates Additional styling for the chart, such as font of numbers Adding new icons and stuff so the app is less bland/boring Fixing bugs, like if no window is detected it doesn’t give an error Finding and changing the logo for the site and the name Making sure the sizing is automatically adaptive to different screen sizes and changes as the screen changes (the chart mainly) Figuring out how to make it so others can download it Maybe dropdown menu if it works out Maybe additional color options like a dark mode Updating README and project info"}, {"post_id": 14898, "ts": "2026-06-24T05:57:41Z", "hours": 2.315, "text": "Devlog #5 Additions Added the refresh button that refreshes the data on both the table and the chart when clicked Added the day for which the data is being displayed at the top of the chart with day of the week and the long date Added the two arrow key buttons on either side of the chart that currently don’t do anything when clicked Changed the times so they no longer say 0s if there is already a minutes and hours time (ie: 2h 34m 0s to 2h 34m) Added styling to the buttons, which makes them have a shadow and glide up and down when hovered over Changed the color of the chart to better match the rest of the website Future Updates Adding functionality to the arrow buttons to move between weeks when clicked Changing the table to show the data for each day when clicking on different days of the week from the chart Making the application look nicer overall and more lively Bug fixes so the time is tracked more accurately (like not tracking time on the desktop home screen) Possibly adding a dropdown menu to show which specific tabs/websites were viewed and for how long (ie: Youtube - 2 hours) Making it a downloadable app that others can also use"}, {"post_id": 14071, "ts": "2026-06-23T01:30:07Z", "hours": 2.2897, "text": "Devlog #4 Additions Used chart.js to add a chart displaying total screen time during the current week The x-axis shows the days of the week, where blank boxes indicate that day hasn’t occured yet or there is no screen time The y-axis goes in increments of 30 minutes and automatically shortens or lengthens based off of your maximum screen time Hovering over the bar displays the total screen time as the table does below Time and days are now automatically tracked in local time instead of UTC Planned Updates Styling for the chart to better match the rest of the website A refresh button that refreshes the data instead of having to reopen or restart the app Screentime history that lets you see your screen time for the past week and possibly more Clicking on a day will also update the table to show your specific app usages for that day."}, {"post_id": 12831, "ts": "2026-06-21T00:23:32Z", "hours": 1.5597, "text": "Additions Added styling to the table and the overall app Added a total at the bottom of the table that shows total time throughout the whole day Added the name of the device for which screen time is being tracked under the main header"}, {"post_id": 12280, "ts": "2026-06-20T01:41:45Z", "hours": 2.3556, "text": "Displayed data from JSON file on the webpage in a table format Added the app icons to the webpage Converted the time from seconds to hours/minutes and formatted it Sorted the time in order of longest to shortest Added basic styling to the page, which will be updated later"}, {"post_id": 10924, "ts": "2026-06-17T22:01:06Z", "hours": 1.6881, "text": "I created a GitHub repository and decided to build this as a desktop app that runs in the background. After researching my options, I chose Electron because it lets me build the UI with HTML and CSS and create the backend/frontend with JavaScript while still allowing it to be used as an application. I used Electron Forge as a project template to start the application. For tracking the screentime, I used the paymoapp/active-window package, which checks the active window every 5 seconds and logs the time to a local JSON file with the app name, date, and time. The app automatically saves every 30 seconds and clears out any data older than 14 days."}]...
|
Title: Windows Screen Timer Tracker by @Potatoish Title: Windows Screen Timer Tracker by @Potatoish | Stardance
Devlogs:
I created a GitHub repository and decided to build this as a desktop app that runs in the background. After researching my options, I chose Electron because it lets me build the UI with HTML and CSS and create the backend/frontend with JavaScript while still allowing it to be used as an application. I used Electron Forge as a project template to start the application. For tracking the screentime, I used the paymoapp/active-window package, which checks the active window every 5 seconds and logs the time to a local JSON file with the app name, date, and time. The app automatically saves every 30 seconds and clears out any data older than 14 days.
Displayed data from JSON file on the webpage in a table format Added the app icons to the webpage Converted the time from seconds to hours/minutes and formatted it Sorted the time in order of longest to shortest Added basic styling to the page, which will be updated later
Additions Added styling to the table and the overall app Added a total at the bottom of the table that shows total time throughout the whole day Added the name of the device for which screen time is being tracked under the main header
Devlog #4 Additions Used chart.js to add a chart displaying total screen time during the current week The x-axis shows the days of the week, where blank boxes indicate that day hasn’t occured yet or there is no screen time The y-axis goes in increments of 30 minutes and automatically shortens or lengthens based off of your maximum screen time Hovering over the bar displays the total screen time as the table does below Time and days are now automatically tracked in local time instead of UTC Planned Updates Styling for the chart to better match the rest of the website A refresh button that refreshes the data instead of having to reopen or restart the app Screentime history that lets you see your screen time for the past week and possibly more Clicking on a day will also update the table to show your specific app usages for that day.
Devlog #5 Additions Added the refresh button that refreshes the data on both the table and the chart when clicked Added the day for which the data is being displayed at the top of the chart with day of the week and the long date Added the two arrow key buttons on either side of the chart that currently don’t do anything when clicked Changed the times so they no longer say 0s if there is already a minutes and hours time (ie: 2h 34m 0s to 2h 34m) Added styling to the buttons, which makes them have a shadow and glide up and down when hovered over Changed the color of the chart to better match the rest of the website Future Updates Adding functionality to the arrow buttons to move between weeks when clicked Changing the table to show the data for each day when clicking on different days of the week from the chart Making the application look nicer overall and more lively Bug fixes so the time is tracked more accurately (like not tracking time on the desktop home screen) Possibly adding a dropdown menu to show which specific tabs/websites were viewed and for how long (ie: Youtube - 2 hours) Making it a downloadable app that others can also use
Devlog #6 Additions Added functionality to arrow buttons that moves between available weeks of data Arrow buttons are grayed out if there is no more data available to be viewed Clicking on different bars of the bar chart now updates the table and the date to show that specific screentime per app for that date Moved the date under the chart and above the table in line with the refresh button Added the week of above the chart, which shows which week of data the chart shows Planned Updates Additional styling for the chart, such as font of numbers Adding new icons and stuff so the app is less bland/boring Fixing bugs, like if no window is detected it doesn’t give an error Finding and changing the logo for the site and the name Making sure the sizing is automatically adaptive to different screen sizes and changes as the screen changes (the chart mainly) Figuring out how to make it so others can download it Maybe dropdown menu if it works out Maybe additional color options like a dark mode Updating README and project info
Devlog #7 Additions Added custom titlebar at the top with appropriate close, maximize, and minimize buttons Updated scrollbar on the screen to better match the website in terms of styling Changed the layout of the title header to now have the text left-aligned Added two new buttons, one for setting and one for darkmode (might change) on the right side (currently no functionality) Used lucide to get icons for the buttons Updated the font for the chart and the text size Added a footer on the bottom Changed the app name to Windows Screen Time Tracker Fixed any errors that would show up if no active window is detected Planned updates Adding functionality to the buttons Updating the app logo Updating the ReadMe Better organizing code and getting rid of unnecessary things/optimizing Making the chart and other elements auto-adapt to size changes Figuring out how to make it a downloadable app
Devlog #8 Additions Added the UI for the settings tab that opens a pop-up showing many settings. Settings include “Launch on Startup,” “Minimize on Close,” “Tracking Interval,” “How many weeks of data to keep,” and a “Reset Data” button. Only the tracking interval has functionality and works as of now Created a slider for the yes or no settings that has a smooth animation/slide Added an input box for other questions with variable settings and a prompt for how to enter settings in Made the chart and table elements auto-adapt to changes in screen size. Planned Updates Add functionality to all other settings Design the reset data button and add functionality Add functionality to dark mode button Make it so settings save even if the app is closed Add some more settings like downloading data, etc. Make the app downloadable for others to use Optimize and organize the code to be more readable and better in general Update ReadMe Update project info Find and add a logo for the website
Devlog #9 Additions Added styling to reset button Added the launch on startup and run in background settings that work as said in the names Added tracking interval and how many weeks to keep to decide when to track the data and how much to store Added warning that show what the correct input should be if incorrect input is given Added the reset button functionality that provides a native pop-up to confirm reset before deleting all data Stored settings in a JSON file to save them even after app has been closed Fixed styling and spacing irregularities throughout the app Planned Updates Add functionality to dark mode button Add some more settings like downloading data, etc. Make the app downloadable for others to use Optimize and organize the code to be more readable and better in general Update ReadMe and project info Find and add a logo for the website
Devlog #10 Additions Added functionality to the dark mode button, which completely changes the background styling Clicking the dark mode button changes the icon to a moon vs a sun on light mode Created a whole new color scheme for dark mode Added dark mode as an automatically saved setting that loads on default upon load Painfully fixed bugs related with storing it as a new setting (mostly due to organization of code and structure) Added new lucide chevron icons for the chart arrow keys Fixed issues with the scroll bar when opening settings pop-up Planned Updates Add some more settings like downloading data, etc. (maybe) Make the app downloadable for others to use Optimize and organize the code to be more readable and better in general Update ReadMe and project info Find and add a logo for the website
Devlog #11 Additions Painfully figured out how to make the app downloadable for others to use after issues with packaging the app with electron due to version issues Some code improvements to be more readable and better in general Updated ReadMe and project info Found and added a logo for the website Finished project and ready for ship #1
Ships:
Windows Screen Time Tracker I built a Windows desktop app that automatically tracks, logs, and visualizes how much time you spend in each application. What it does The app runs silently in the background and logs your active window every few seconds. Over time it shows you a picture of how you spend your time on your PC. The app includes: Weekly bar chart that shows your screen time which you can navigate by week A breakdown table that shows you your screentime per app with icons A settings panel which includes settings such as tracking interval, how much data to keep, startup on launch, background running, and dark mode Data is stored locally in JSON files and is never sent anywhere What was challenging The hardest part was getting the app ready to distribute for others since there were issues with versions not being compatible between all the different modules I used and there not being much information available online to troubleshoot properly. How to test it Download the zip from the releases page and extract it Run Windows Screen Time Tracker.exe Open a few different apps and use them for a minute or two each Come back and check the chart and table where you should see your usage broken down by app with accurate times Try the settings panel to change the tracking interval or toggle dark mode by clicking the button...
|
1793224382.1632252
|
1793310782.1632252
|
|
20429
|
Flappy Bird for the final release of the Nintendo Flappy Bird for the final release of the Nintendo Revolution by @PhantomPorter | Stardance...
|
PhantomPorter
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T04:30:14Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a flappy bird clone for the Wii, which didn’t have a game engine that I could easily use. So I had to learn how to implement simple audio and video in code, but SDL was able to make that much easier. I’m really glad this was able to work out well, it was pretty interesting to make a game in this way. To play this Download the files from the Github and either Boot in dolphin by opening the boot.dol in the same folder as the .elf OR Put the files in the apps folder in a usb/sdcard and launch from the homebrew channel on the wii. Controls: A/B/Shake to flap, 2 to quit", "repo": "https://github.com/PhantomPorter/flapperbird", "demo": "https://github.com/PhantomPorter/flapperbird/releases/tag/v1.0.0"}]...
|
[{"post_id": 14106, "ts": "202 [{"post_id": 14106, "ts": "2026-06-23T02:44:17Z", "hours": 1.1683, "text": "Today’s use of free will I added the ability to shake the Wii remote to flap. It was pretty weird to add since the SDL method wasn’t working so I did it the more hardware way. Overall pretty cursed but is a fun Wii way to play the game, and the buttons are still there so don’t worry."}, {"post_id": 13560, "ts": "2026-06-22T06:20:08Z", "hours": 2.6833, "text": "This use of free will consist of adding a collision to die, score, and a background song.The way I did it was to load a font from my system to use in the game (Which is a way I don’t fully like but It was the easiest for me I think). This had me messing with CMake again to compile the needed libraries for text and audio. Audio was a different beast since each method I was trying was giving out errors, working but it didn’t restart in game over, or loud static. In the end I switched to C++ to compile this audio madness correctly. Then it was just wrapping the game logic to a variable (is_playing) that when changed switches the game state to death and despair.Audio was so painful to get working I don’t know if it was worth it, but ill say it is!Overall it was time consuming but the game is getting finished and ready😁."}, {"post_id": 11733, "ts": "2026-06-19T03:20:15Z", "hours": 1.04, "text": "Added pipes that can randomly generate and a background image that was pretty annoying to get in (had to convert it to the rawest data ever)."}, {"post_id": 10922, "ts": "2026-06-17T21:59:16Z", "hours": 0.8111, "text": "Set up the building for this project and added the SDL boilerplate and some input functionality."}]...
|
Title: Flappy Bird for the final release of the Ni Title: Flappy Bird for the final release of the Nintendo Revolution by @PhantomPorter | Stardance
Devlogs:
Set up the building for this project and added the SDL boilerplate and some input functionality.
Added pipes that can randomly generate and a background image that was pretty annoying to get in (had to convert it to the rawest data ever).
This use of free will consist of adding a collision to die, score, and a background song.The way I did it was to load a font from my system to use in the game (Which is a way I don’t fully like but It was the easiest for me I think). This had me messing with CMake again to compile the needed libraries for text and audio. Audio was a different beast since each method I was trying was giving out errors, working but it didn’t restart in game over, or loud static. In the end I switched to C++ to compile this audio madness correctly. Then it was just wrapping the game logic to a variable (is_playing) that when changed switches the game state to death and despair.Audio was so painful to get working I don’t know if it was worth it, but ill say it is!Overall it was time consuming but the game is getting finished and ready😁.
Today’s use of free will I added the ability to shake the Wii remote to flap. It was pretty weird to add since the SDL method wasn’t working so I did it the more hardware way. Overall pretty cursed but is a fun Wii way to play the game, and the buttons are still there so don’t worry.
Ships:
I made a flappy bird clone for the Wii, which didn’t have a game engine that I could easily use. So I had to learn how to implement simple audio and video in code, but SDL was able to make that much easier. I’m really glad this was able to work out well, it was pretty interesting to make a game in this way. To play this Download the files from the Github and either Boot in dolphin by opening the boot.dol in the same folder as the .elf OR Put the files in the apps folder in a usb/sdcard and launch from the homebrew channel on the wii. Controls: A/B/Shake to flap, 2 to quit...
|
1793289190.766534
|
1793375590.766534
|
|
20436
|
My first slack bot! by @evie_creates | Stardance
|
evie_creates
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-30T00:29:26Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have finally finished My First Slack Bot. It’s not the best or perfect, but it still works, so that’s something. I had to spend 2/3 hours I worked on this debugging some random stuff in my code. I’m glad that I was able to finish this and will try working on a hardware project next in the future.", "repo": "https://github.com/evheraghty-hash/My-First-Slack-Bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354?skip_today=1"}]...
|
[{"post_id": 36729, "ts": "202 [{"post_id": 36729, "ts": "2026-07-28T23:52:16Z", "hours": 1.9939, "text": "After 2 hours of painstakingly long coding and debugging, I have finally finished My First Slack Bot. I named it Confusion because I was so confused while working on it. I might add a few more slash commands later, but for now I am done with it!"}, {"post_id": 23742, "ts": "2026-07-06T21:15:45Z", "hours": 1.2875, "text": "I am almost done with My first slack bot! I’ve added several slash commands that should do a multitude of things. I have started to figure out how to work in VS code and I’m understanding how a lot of things work to a better degree. I hope to be explore more slash commands and be finished with this project tomorrow."}]...
|
Title: My first slack bot! by @evie_creates | Star Title: My first slack bot! by @evie_creates | Stardance
Devlogs:
I am almost done with My first slack bot! I’ve added several slash commands that should do a multitude of things. I have started to figure out how to work in VS code and I’m understanding how a lot of things work to a better degree. I hope to be explore more slash commands and be finished with this project tomorrow.
After 2 hours of painstakingly long coding and debugging, I have finally finished My First Slack Bot. I named it Confusion because I was so confused while working on it. I might add a few more slash commands later, but for now I am done with it!
Ships:
I have finally finished My First Slack Bot. It’s not the best or perfect, but it still works, so that’s something. I had to spend 2/3 hours I worked on this debugging some random stuff in my code. I’m glad that I was able to finish this and will try working on a hardware project next in the future....
|
1793138258.9733138
|
1793224658.9733138
|
|
20462
|
FocusMate by @Ishanth | Stardance
|
Ishanth
|
1
|
4.7
|
36
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-19T20:54:31Z", "hours": 3.0, "multiplier": 10.69, "payout": 36, "blessing": "neutral", "text": "I created FocusMate, an AI-powered study assistant that uses computer vision and NLP to monitor focus, generate personalized quizzes, and improve study sessions. The most challenging part was integrating multiple AI technologies and designing accurate focus-tracking features while keeping the platform user-friendly. I am proud of building a system that combines real-time engagement analysis with personalized learning tools, and users can test it by exploring the quiz generation, study tracking, and productivity features on the platform.", "repo": "https://github.com/Ishanthr1/FocusMate", "demo": "https://focus-mate-gamma.vercel.app/"}]...
|
[{"post_id": 13043, "ts": "202 [{"post_id": 13043, "ts": "2026-06-21T10:19:50Z", "hours": 1.6956, "text": "Just made some edits.. the UI is fully upgraded and the music bar is easier to use. The site now also fully functions in most browsers (It was only chrome originally)."}, {"post_id": 12144, "ts": "2026-06-19T20:52:48Z", "hours": 3.3603, "text": "FocusMate FocusMate, an AI-powered study assistant designed to improve learning efficiency through computer vision and natural language processing. Built features that analyze webcam input to track user focus, posture, and study engagement in real time. Implemented AI-driven study tools that generate personalized quizzes and summaries based on learning materials. Designed functionality to support both individual and group study sessions with progress tracking and performance insights. Integrated multiple technologies, including machine learning, computer vision, and web development frameworks, to create a comprehensive educational platform."}]...
|
Title: FocusMate by @Ishanth | Stardance
Devlogs: Title: FocusMate by @Ishanth | Stardance
Devlogs:
FocusMate FocusMate, an AI-powered study assistant designed to improve learning efficiency through computer vision and natural language processing. Built features that analyze webcam input to track user focus, posture, and study engagement in real time. Implemented AI-driven study tools that generate personalized quizzes and summaries based on learning materials. Designed functionality to support both individual and group study sessions with progress tracking and performance insights. Integrated multiple technologies, including machine learning, computer vision, and web development frameworks, to create a comprehensive educational platform.
Just made some edits.. the UI is fully upgraded and the music bar is easier to use. The site now also fully functions in most browsers (It was only chrome originally).
Ships:
I created FocusMate, an AI-powered study assistant that uses computer vision and NLP to monitor focus, generate personalized quizzes, and improve study sessions. The most challenging part was integrating multiple AI technologies and designing accurate focus-tracking features while keeping the platform user-friendly. I am proud of building a system that combines real-time engagement analysis with personalized learning tools, and users can test it by exploring the quiz generation, study tracking, and productivity features on the platform....
|
1793299668.3222575
|
1793386068.3222575
|
|
20490
|
Phoenix - Web Game Framework by @openchanter | Sta Phoenix - Web Game Framework by @openchanter | Stardance...
|
openchanter
|
1
|
29.37
|
325
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-13T06:20:18Z", "hours": 25.0, "multiplier": 12.89, "payout": 325, "blessing": "neutral", "text": "I made Phoenix, a web-based game framework using TypeScript! It is designed to be easy to use and quick to make projects with. I used THREE.js for rendering and Planck.js for the physics engine. The features available in the engine vary from simple rendering components to rigidbodies, UI systems and particle systems! The engine also supports a proper scene hierarchy with objects being able to have children that inherit their translation and rotation. The most challenging part of this was just trying to iron out all of the small bugs that kept popping up in different areas of the engine while I was trying to add a new feature somewhere. Just a note about the demo though, it is meant to just show off the features of the engine, and the demo is not the product of this project but rather the actual engine and it’s API that can be used to make games! I also plan to make an actual game using this engine as my next project for Stardance!", "repo": "https://github.com/OpEnchanter/phoenix", "demo": "https://openchanter.github.io/phoenix"}]...
|
[{"post_id": 31045, "ts": "202 [{"post_id": 31045, "ts": "2026-07-19T03:58:27Z", "hours": 3.1128, "text": "Another devlog as I continue to work on my other project that uses this engine as a dependency. Since I’ve been actually using this engine for making something real, I’ve noticed that it has quite a few flaws that I didn’t catch earlier on in the creation process. For example, when the window resized on the Y axis, the scale of the content within the window would also scale. This actually ended up causing a big issue with my new project as I had to convert screen-space mouse coordinates to positions in the world for placing objects in the editor. Fixing this was pretty simple and I just swapped out the old render resolution for a render scalar that gets multiplied by the window resolution to calculate the render resolution. Over the time of creating my new project there have also been some other small issues with things such as the button hitboxes and the engine not having the ability to resize objects in real time that I have since fixed. For the real time object resizing issue though, it was especially annoying because I had to resize the THREE.js Mesh object directly using the .scale.set() method on it which cannot be simply supplied with the size in pixels you want the object to be and is separate from the size of the geometry. To solve this I had to calculate how much I would have to multiply the scale of the geometry by to get the new scale. This ends up being the math equation, newScale / originalScale . Attached to this devlog are images, showing the window scaling fix in action as well as the scaling fix as it is used in my game. Now the scale of pixels stays exactly the same regardless of the scale of the window, and the 2nd block shown in the image with the Tiles picker is being scaled and rotated when the player hovers it. Overall, this project is becoming quite a bit larger than I originally intended as I work on it more while actually using it to make a real game. Thanks for reading this devlog!"}, {"post_id": 27962, "ts": "2026-07-13T22:18:53Z", "hours": 1.255, "text": "Another quick devlog as I’ve been adding features while trying to make an actual game with the engine! I realized that I hadn’t added offsets for colliders, trigger colliders or collision callbacks, so I added all of those and that works now, and I also realized I needed a special renderer that could draw using THREE.js’ InstancedMesh so I created the InstancedRenderer component that allows for that InstancedMesh to be used, this should afford a decent performance boost for any games that have the ground made up of tiles (if used correctly). The image attached is an image of the game I’ve started working on!"}, {"post_id": 27541, "ts": "2026-07-13T06:08:25Z", "hours": 1.1381, "text": "Another short devlog, again about UI! I got around to adding a proper button component to the engine that supports both a hover and click state! Currently I am using it in one of the demos for a button that slows down time to 1/10 speed when clicked. When I was trying to get this working, I realized I had a pretty major bug with how the scale of the window worked, which was causing issues with mouse inputs not lining up correctly with the engine’s visual output, but after fixing that it works great! The implementation for usage is also pretty simple with the Phoenix.Button() component just having two optional fields, one for onHoverCallback and one for onClickCallback. Here is an example of an onClickCallback being supplied to a button component: new Phoenix . Button (() => { app . args . timescale = ( app . args . timescale == 1 ) ? 0.1 : 1 }) Thanks for reading my boring UI yap again!!"}, {"post_id": 27482, "ts": "2026-07-13T02:51:20Z", "hours": 1.4086, "text": "Very small devlog this time! I’ve now added support for screen-space rendering of objects (rendering of objects relative to the screen rather than the world). This will be very important for adding proper UI components such as buttons, switches, sliders and text boxes to the engine later! With the addition of screen space rendering I also added a new component specifically for it, being the UIRenderer component. It behaves exactly like the standard Renderer component, but it renders to the THREE.js scene that the output of the main scene is rendered to for applying screen-space shaders. This also has the side effect of UI elements being able to ignore the current screen-space shader, so they don’t get distorted or become unreadable in any other way. Here’s a little code example for how the screen-space rendering works when creating an object: app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 64 , 96 ), 0 , new Phoenix . Vector2 ( 16 , 16 )), new Phoenix . Sprite ( \" assets/brick.png \" ), new Phoenix . UIRenderer ( 1 ) ) This little bit of code would create an object at coordinates (64, 96) but it would follow the camera rather than staying put in the world! In my next devlog I plan to actually add components for proper interactivity with UI components! Thanks for reading my yap!! Byeeee!"}, {"post_id": 26985, "ts": "2026-07-12T03:38:26Z", "hours": 1.4139, "text": "Hiya there! Another devlog on this project!! This time I added an actual particle system to the engine that can be used to spawn a bunch of little particles. It’s still missing a bit of customization such as turning off gravity for particles or the ability to change particle’s initial velocity, but so far it isn’t causing any lag and seems to work well! I had to figure out THREE.js’ InstancedMesh system to get this working without making the game run horribly, but I got it and it works now! The docs are also updated to reflect this new feature. And the ParticleSystem is used like any other component by just adding it to an object like the following: app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , 0 ), 0 , new Phoenix . Vector2 ( 32 , 32 )), new Phoenix . ParticleSystem ( \" assets/brick.png \" , 10 , new Phoenix . Vector2 ( 24 , 24 )) ) ) The entire system for particles is self contained and doesn’t rely on any other components like the Renderer and Sprite because I felt it would be better to separate it due to the fact that the particles using an InstancedMesh, and the user might want to have particles have a different texture than their emitter. As shown in the images, the ParticleSystem can support a lot of particles and from some testing it is able to handle 10, 1000 and 10000 particles with no lag, but 100000 particles is stretching it a bit. I mean who would put over 10000 particles on screen at a time though, right?"}, {"post_id": 26131, "ts": "2026-07-10T19:01:01Z", "hours": 3.8183, "text": "Yay! Another devlog and even more hours poured into this project! This time I finally got around to reworking how the engine works to actually allow for objects to have children! In the past all objects were stored in a flat array which didn’t allow for any object parenting of any kind, but now the root of the scene is just another GameObject, so it can have children and those children can have children and so on forever. As you can see in the example photos, the brick object on the left has a smaller checkerboard-pattern object as a child of it that moves relative to it’s parent’s rotation and position. On the development side of things, adding objects to the scene as a whole remains exactly the same with the way the addition of objects simply being changed to having them be children of the scene root, but now all objects have a new method, GameObject.addChild(object: GameObject) . This allows any object have a child added to it, for example: player . addChild ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , 0 ), 0 , new Phoenix . Vector2 ( 16 , 16 )), new Phoenix . Sprite ( \" assets/null.png \" ), new Phoenix . Renderer ( 1 ) )); This would just add a new smaller object to the player object with the null.png sprite, and this is exactly what is happening in the screenshots attached to this."}, {"post_id": 25126, "ts": "2026-07-09T04:22:25Z", "hours": 2.8756, "text": "I decided to use the feature I added to the engine a while ago that allows for custom screen space shaders to create a lighting shader for the game based on some simple raymarching! I’m going to work on getting it more polished and then implement it as a variable exposed by the main engine as something that can be used in any project. The usage of the shader isn’t too complicated, it just requires data about the lights to be supplied to the shader via uniforms. let lightPositions = [ new THREE . Vector2 ( - 128 , 128 ), new THREE . Vector2 ( 64 , 128 ) ] let lightScales = [ new THREE . Vector2 ( 512 , 512 ), new THREE . Vector2 ( 512 , 512 ) ] let lightColors = [ new THREE . Vector3 ( 1 , 0.3 , 0 ), new THREE . Vector3 ( 0 , 1 , 0.3 ) ] This would be supplied to the App’s options to override the shader. shaderOverride : { vertexShader : Phoenix . DefaultVertexShader , fragmentShader : LitShader , uniforms : { uLightPositions : { value : lightPositions }, uLightScales : { value : lightScales }, uLightColors : { value : lightColors } } } And then positions should be updated every frame to keep them in world space. app . addFrameIntervalCallback (() => { let lps = [] for ( const lightPos of lightPositions ) { const p = new THREE . Vector3 ( lightPos . x , lightPos . y , 0 ); p . project ( app . camera ); const x = ( p . x + 1 ) / 2 const y = ( p . y + 1 ) / 2 lps . push ( new THREE . Vector2 ( x , y )) } app . screenSpaceShader . uniforms . uLightPositions ! . value = lps let scls = [] for ( const lightScale of lightScales ) { const x = lightScale . x ! / rScale.x const y = lightScale . y ! / rScale.y scls . push ( new THREE . Vector2 ( x , y )) } app . screenSpaceShader . uniforms . uLightScales ! . value = scls }) Edit: I completely forgot about this but at some point I added support for animated sprites using the AnimatedSprite class which can be supplied an array of strings representing the paths to the image for each frame as well as a animation rate (number of game frames each animation frame is shown for)"}, {"post_id": 24576, "ts": "2026-07-08T08:10:21Z", "hours": 2.9547, "text": "I did a bunch of backend stuff, adding features and making the engine overall better. My most recent addition to this is the use of a unified renderer component, where rather than having separate components handling the rendering of text, canvas sprites and normal sprites individually and with duplicate code, the main renderer component automatically finds any sprite type and renders it! For example, in the scenes below: the text in past versions would have been rendered with a TextRenderer component, whereas now there is a TextSprite component that feeds a texture to a Renderer component on the object. New Version const text = new Phoenix . TextSprite ( \" Hello world! \" , { fontSize : 32 , backgroundColor : \" #7fefcf \" , padding : 8 }); app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , - 83 ), 0 , new Phoenix . Vector2 ( text . texture ! . width , text . texture ! . height )), text , new Phoenix . Renderer ( 1 ) )); Old Version app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , - 83 ), 0 , new Phoenix . Vector2 ( 0 , 0 )), new Phoenix . TextRenderer ( \" Hello world! \" , { fontSize : 32 , backgroundColor : \" #7fefcf \" , padding : 8 }, 1 )"}, {"post_id": 15461, "ts": "2026-06-25T04:17:31Z", "hours": 2.4086, "text": "Big update! I finally actually got around to making the demo scenes built with this engine publish on GitHub pages ( here ). I also added a circle collider component and a text renderer which in turn relies on a HTML Canvas Renderer so there’s also now an easier way to create procedural assets for games."}, {"post_id": 14176, "ts": "2026-06-23T05:13:33Z", "hours": 1.6892, "text": "I finally added support for getting inputs within a component without using a web API to register an event listener and then having to deal with destroying that when the object get unloaded! I then updated the test scene to reflect that with a new component added to each object in a tower that adds an impulse when the W key is pressed. The scene can also be switched with the H key."}, {"post_id": 10659, "ts": "2026-06-17T14:54:58Z", "hours": 3.1258, "text": "I added screen-space shader support for now, the shader can’t be overridden but I’ll change that as well as allowing for the shaders attached to individual objects to be overridden."}, {"post_id": 10375, "ts": "2026-06-17T01:44:28Z", "hours": 4.535, "text": "So far I’ve added all the basics, scenes, objects, physics implementation and rendering. The rendering is currently using a basic HTML canvas method, but I am planning to update it to THREE.js for faster rendering and support for complex shader effects. This will probably be a relatively short project and I probably wont make many devlogs for this. It’s kind of hard to show off an engine with images, and without showing the code, so I don’t know how much visual progress I’ll be able to show, but I’ll definately be able to show a lot more for the game I’m planning on making that will use this engine!"}]...
|
Title: Phoenix - Web Game Framework by @openchante Title: Phoenix - Web Game Framework by @openchanter | Stardance
Devlogs:
So far I’ve added all the basics, scenes, objects, physics implementation and rendering. The rendering is currently using a basic HTML canvas method, but I am planning to update it to THREE.js for faster rendering and support for complex shader effects. This will probably be a relatively short project and I probably wont make many devlogs for this. It’s kind of hard to show off an engine with images, and without showing the code, so I don’t know how much visual progress I’ll be able to show, but I’ll definately be able to show a lot more for the game I’m planning on making that will use this engine!
I added screen-space shader support for now, the shader can’t be overridden but I’ll change that as well as allowing for the shaders attached to individual objects to be overridden.
I finally added support for getting inputs within a component without using a web API to register an event listener and then having to deal with destroying that when the object get unloaded! I then updated the test scene to reflect that with a new component added to each object in a tower that adds an impulse when the W key is pressed. The scene can also be switched with the H key.
Big update! I finally actually got around to making the demo scenes built with this engine publish on GitHub pages ( here ). I also added a circle collider component and a text renderer which in turn relies on a HTML Canvas Renderer so there’s also now an easier way to create procedural assets for games.
I did a bunch of backend stuff, adding features and making the engine overall better. My most recent addition to this is the use of a unified renderer component, where rather than having separate components handling the rendering of text, canvas sprites and normal sprites individually and with duplicate code, the main renderer component automatically finds any sprite type and renders it! For example, in the scenes below: the text in past versions would have been rendered with a TextRenderer component, whereas now there is a TextSprite component that feeds a texture to a Renderer component on the object. New Version const text = new Phoenix . TextSprite ( " Hello world! " , { fontSize : 32 , backgroundColor : " #7fefcf " , padding : 8 }); app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , - 83 ), 0 , new Phoenix . Vector2 ( text . texture ! . width , text . texture ! . height )), text , new Phoenix . Renderer ( 1 ) )); Old Version app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , - 83 ), 0 , new Phoenix . Vector2 ( 0 , 0 )), new Phoenix . TextRenderer ( " Hello world! " , { fontSize : 32 , backgroundColor : " #7fefcf " , padding : 8 }, 1 )
I decided to use the feature I added to the engine a while ago that allows for custom screen space shaders to create a lighting shader for the game based on some simple raymarching! I’m going to work on getting it more polished and then implement it as a variable exposed by the main engine as something that can be used in any project. The usage of the shader isn’t too complicated, it just requires data about the lights to be supplied to the shader via uniforms. let lightPositions = [ new THREE . Vector2 ( - 128 , 128 ), new THREE . Vector2 ( 64 , 128 ) ] let lightScales = [ new THREE . Vector2 ( 512 , 512 ), new THREE . Vector2 ( 512 , 512 ) ] let lightColors = [ new THREE . Vector3 ( 1 , 0.3 , 0 ), new THREE . Vector3 ( 0 , 1 , 0.3 ) ] This would be supplied to the App’s options to override the shader. shaderOverride : { vertexShader : Phoenix . DefaultVertexShader , fragmentShader : LitShader , uniforms : { uLightPositions : { value : lightPositions }, uLightScales : { value : lightScales }, uLightColors : { value : lightColors } } } And then positions should be updated every frame to keep them in world space. app . addFrameIntervalCallback (() => { let lps = [] for ( const lightPos of lightPositions ) { const p = new THREE . Vector3 ( lightPos . x , lightPos . y , 0 ); p . project ( app . camera ); const x = ( p . x + 1 ) / 2 const y = ( p . y + 1 ) / 2 lps . push ( new THREE . Vector2 ( x , y )) } app . screenSpaceShader . uniforms . uLightPositions ! . value = lps let scls = [] for ( const lightScale of lightScales ) { const x = lightScale . x ! / rScale.x const y = lightScale . y ! / rScale.y scls . push ( new THREE . Vector2 ( x , y )) } app . screenSpaceShader . uniforms . uLightScales ! . value = scls }) Edit: I completely forgot about this but at some point I added support for animated sprites using the AnimatedSprite class which can be supplied an array of strings representing the paths to the image for each frame as well as a animation rate (number of game frames each animation frame is shown for)
Yay! Another devlog and even more hours poured into this project! This time I finally got around to reworking how the engine works to actually allow for objects to have children! In the past all objects were stored in a flat array which didn’t allow for any object parenting of any kind, but now the root of the scene is just another GameObject, so it can have children and those children can have children and so on forever. As you can see in the example photos, the brick object on the left has a smaller checkerboard-pattern object as a child of it that moves relative to it’s parent’s rotation and position. On the development side of things, adding objects to the scene as a whole remains exactly the same with the way the addition of objects simply being changed to having them be children of the scene root, but now all objects have a new method, GameObject.addChild(object: GameObject) . This allows any object have a child added to it, for example: player . addChild ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , 0 ), 0 , new Phoenix . Vector2 ( 16 , 16 )), new Phoenix . Sprite ( " assets/null.png " ), new Phoenix . Renderer ( 1 ) )); This would just add a new smaller object to the player object with the null.png sprite, and this is exactly what is happening in the screenshots attached to this.
Hiya there! Another devlog on this project!! This time I added an actual particle system to the engine that can be used to spawn a bunch of little particles. It’s still missing a bit of customization such as turning off gravity for particles or the ability to change particle’s initial velocity, but so far it isn’t causing any lag and seems to work well! I had to figure out THREE.js’ InstancedMesh system to get this working without making the game run horribly, but I got it and it works now! The docs are also updated to reflect this new feature. And the ParticleSystem is used like any other component by just adding it to an object like the following: app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , 0 ), 0 , new Phoenix . Vector2 ( 32 , 32 )), new Phoenix . ParticleSystem ( " assets/brick.png " , 10 , new Phoenix . Vector2 ( 24 , 24 )) ) ) The entire system for particles is self contained and doesn’t rely on any other components like the Renderer and Sprite because I felt it would be better to separate it due to the fact that the particles using an InstancedMesh, and the user might want to have particles have a different texture than their emitter. As shown in the images, the ParticleSystem can support a lot of particles and from some testing it is able to handle 10, 1000 and 10000 particles with no lag, but 100000 particles is stretching it a bit. I mean who would put over 10000 particles on screen at a time though, right?
Very small devlog this time! I’ve now added support for screen-space rendering of objects (rendering of objects relative to the screen rather than the world). This will be very important for adding proper UI components such as buttons, switches, sliders and text boxes to the engine later! With the addition of screen space rendering I also added a new component specifically for it, being the UIRenderer component. It behaves exactly like the standard Renderer component, but it renders to the THREE.js scene that the output of the main scene is rendered to for applying screen-space shaders. This also has the side effect of UI elements being able to ignore the current screen-space shader, so they don’t get distorted or become unreadable in any other way. Here’s a little code example for how the screen-space rendering works when creating an object: app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 64 , 96 ), 0 , new Phoenix . Vector2 ( 16 , 16 )), new Phoenix . Sprite ( " assets/brick.png " ), new Phoenix . UIRenderer ( 1 ) ) This little bit of code would create an object at coordinates (64, 96) but it would follow the camera rather than staying put in the world! In my next devlog I plan to actually add components for proper interactivity with UI components! Thanks for reading my yap!! Byeeee!
Another short devlog, again about UI! I got around to adding a proper button component to the engine that supports both a hover and click state! Currently I am using it in one of the demos for a button that slows down time to 1/10 speed when clicked. When I was trying to get this working, I realized I had a pretty major bug with how the scale of the window worked, which was causing issues with mouse inputs not lining up correctly with the engine’s visual output, but after fixing that it works great! The implementation for usage is also pretty simple with the Phoenix.Button() component just having two optional fields, one for onHoverCallback and one for onClickCallback. Here is an example of an onClickCallback being supplied to a button component: new Phoenix . Button (() => { app . args . timescale = ( app . args . timescale == 1 ) ? 0.1 : 1 }) Thanks for reading my boring UI yap again!!
Another quick devlog as I’ve been adding features while trying to make an actual game with the engine! I realized that I hadn’t added offsets for colliders, trigger colliders or collision callbacks, so I added all of those and that works now, and I also realized I needed a special renderer that could draw using THREE.js’ InstancedMesh so I created the InstancedRenderer component that allows for that InstancedMesh to be used, this should afford a decent performance boost for any games that have the ground made up of tiles (if used correctly). The image attached is an image of the game I’ve started working on!
Another devlog as I continue to work on my other project that uses this engine as a dependency. Since I’ve been actually using this engine for making something real, I’ve noticed that it has quite a few flaws that I didn’t catch earlier on in the creation process. For example, when the window resized on the Y axis, the scale of the content within the window would also scale. This actually ended up causing a big issue with my new project as I had to convert screen-space mouse coordinates to positions in the world for placing objects in the editor. Fixing this was pretty simple and I just swapped out the old render resolution for a render scalar that gets multiplied by the window resolution to calculate the render resolution. Over the time of creating my new project there have also been some other small issues with things such as the button hitboxes and the engine not having the ability to resize objects in real time that I have since fixed. For the real time object resizing issue though, it was especially annoying because I had to resize the THREE.js Mesh object directly using the .scale.set() method on it which cannot be simply supplied with the size in pixels you want the object to be and is separate from the size of the geometry. To solve this I had to calculate how much I would have to multiply the scale of the geometry by to get the new scale. This ends up being the math equation, newScale / originalScale . Attached to this devlog are images, showing the window scaling fix in action as well as the scaling fix as it is used in my game. Now the scale of pixels stays exactly the same regardless of the scale of the window, and the 2nd block shown in the image with the Tiles picker is being scaled and rotated when the player hovers it. Overall, this project is becoming quite a bit larger than I originally intended as I work on it more while actually using it to make a real game. Thanks for reading this devlog!
Ships:
I made Phoenix, a web-based game framework using TypeScript! It is designed to be easy to use and quick to make projects with. I used THREE.js for rendering and Planck.js for the physics engine. The features available in the engine vary from simple rendering components to rigidbodies, UI systems and particle systems! The engine also supports a proper scene hierarchy with objects being able to have children that inherit their translation and rotation. The most challenging part of this was just trying to iron out all of the small bugs that kept popping up in different areas of the engine while I was trying to add a new feature somewhere. Just a note about the demo though, it is meant to just show off the features of the engine, and the demo is not the product of this project but rather the actual engine and it’s API that can be used to make games! I also plan to make an actual game using this engine as my next project for Stardance!...
|
1793123302.2251883
|
1793209702.2251883
|
|
20495
|
Hangman by @thanEay | Stardance
|
thanEay
|
1
|
17.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T20:49:03Z", "hours": 17.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Ready to ship my project! Try it at https://hangman.epin.to This is my hangman project. I put a lot of time into this project, written in Python. While it may look simple, there is a lot of nuance and thought put into it. For example, you can guess single letters, guess entire words, choose a random word to guess, or enter one yourself for a friend to guess. I have been learning Python for a few months and decided that a project like this had just enough complexity that I would learn but not enough that I would give up. Although this project has been completed for months, I procrastinated shipping it until now. I hope that you like it!", "repo": "https://github.com/thanEay/hackclub-hangman", "demo": "https://hangman.epin.to"}]...
|
[{"post_id": 16461, "ts": "202 [{"post_id": 16461, "ts": "2026-06-26T19:59:09Z", "hours": 2.4122, "text": "After much work, it is time to ship my project! Updated demo at hangman.epin.to . This project has taught me a lot about making working projects in Python. I only started learning Python at the beginning of this year, and this is the largest coding project that I have completed so far. It may not seem like a lot, but I put many hours into this code. Much of that time was fun, spent coding the main flow of the code. But eventually, the last few hours of this project went into debugging, trying to catch edge cases, and improved user messaging. So what have I worked on since my last devlog? Mostly implementing a way to disable the counter to play just for fun with infinite guesses. It is accessed by putting an exclamation mark before the mode input (like !m for manual or !r for random). Because no counter is going up, no hangman is displayed. I also changed some player messaging to make things clearer. When a correct letter is guessed, the 1-based location(s) in the word is printed rather than the 0-based indexes that Python uses for its lists. Finally, ‘!’ by itself is rejected as a guess. If it is input, the user will get a message saying that ‘!’ alone is not an acceptable input."}, {"post_id": 15443, "ts": "2026-06-25T03:07:41Z", "hours": 4.1822, "text": "Live demo hosted on Nest at hangman.epin.to . I made lots of progress, as you can probably tell with the amount of time it took. I added functionality for guessing entire words, which took about half of my four logged hours. Also, when the word is guessed correctly, the sprite changes to the man falling off of the gallows and saying ‘thanks’. To guess entire words, you put an exclamation mark at the beginning of your answer. Otherwise, only single letters are accepted. For example, to guess ‘stardance’ all at once rather than one letter at a time, you would enter ‘!stardance’. If a word guess is incorrect, the counter for tries left goes down one, just like it would for guessing an incorrect letter. I also updated some of the user prompts to make them more clear, as well as printing out all already guessed answers (letters and words) after any letter input (correct or incorrect) or incorrect word guesses so that the player can better guess correct words/letters. The reason that this project, despite its apparent simplicity is taking so long is the little features. For example, I added different messages based on different conditions (Have letters and/or words been guessed? If only one has, change the already guessed printed message to match.) TODO: Add the ability to turn off the counter so that the game can be played without a guess limit."}, {"post_id": 13768, "ts": "2026-06-22T15:52:50Z", "hours": 2.8817, "text": "Sprites added. Sprites are saved as a list of multi-line strings in ascii_sprites.py. As the name implies, the sprites are completely ascii and printable to the terminal. Additionally, now if the word has spaces, the printed characters will contain a space in the given spot. For example, ‘hack club’ will be ____ ____ instead of nine unbroken underscores. Letters that have been guessed already are printed out when an incorrect answer is chosen. I might change it to always tell you regardless of an incorrect answer to make it easier to guess. TODO: I need to add the ability to guess an entire word. I would also like to add a sprite change if the player guesses correctly. Maybe the guy would be released from the gallows or something."}, {"post_id": 11730, "ts": "2026-06-19T03:14:35Z", "hours": 1.6522, "text": "Working prototype completed! At this point, all text-related functionality is present. You can enter characters that show up more than once in a word, and it won’t throw errors. I spent the better part of a half hour trying to find out why most times I would enter a letter, it would say that there were none of that letter in the word. This was clearly a bug, as it happened even when entering a letter for a manually chosen word (showing that I wasn’t just an abysmal letter guesser). It turned out that the lack of two characters caused my problem. In my check_letter() function, it creates different letter location lists depending on whether there is one or more instances of that letter in the word. The code is like this. def check_letter(word: str, letter: str) -> list: if isinstance(letter, str) and len(letter) == 1: locations = [] if word.count(letter) == 1: locations = [word.find(letter)] elif word.count(letter) > 1: # BUG found here! elif was an if statement for index, character in enumerate(word): if character == letter: locations.append(index) else: locations = [-1] return locations # If letter is not in the word, will result in index of -1 The comment that starts with ‘BUG’ shows where the problem originated from. Any word with a single instance of a letter returned [-1] because if word.count(letter) > 1 would always override an intended single element list. Now, I need to add hangman sprites that will progress as you choose correct or incorrect answers, probably using ASCII characters."}, {"post_id": 11272, "ts": "2026-06-18T13:07:08Z", "hours": 2.6856, "text": "Last day of school, and even more coding! I have a mostly working prototype that can be seen below. There is no hangman sprite yet, but most of the functionality is here. Main.py has been expanded greatly. Now you can choose the game mode and enter characters. It also displays blank, unknown characters as ‘_’ and shows known characters as their letters, printing again after every input. A major bug that remains is that if a word has two identical letters (like ‘a’ in Stardance), only one can be input and uncovered. This is due to code that was meant to prevent people from doing the same wrong answer twice, but it also prevents entering the same right answer twice. This is the culprit code. In the looping code (counter does not go up in the current version, it is mostly a placeholder): while counter < 10: user_input = input(\"Enter another letter: \") if user_input.strip().lower() in already_guessed: print(\"You already guessed that letter.\") continue # Goes to next loop In the ask_for_letter() function, only a single instance of a letter is uncovered, even if the letter appears more than once. index = check_letter(word, letter) if index != -1: already_guessed.append(letter) message = f\"{letter} is in the word at index {index}.\" uncovered_indicies.append(index) return index, message check_letter() only returns a single index, which then only uncovers a single letter in the word. I need to fix this by giving the functions the ability to take and return multiple indexes. The image below shows an example of the current code. The word is ‘cryptic’, but the last ‘c’ cannot be selected. Assuming the word doesn’t have two of the same letter, when the word is guessed the following message is printed: You guessed the word: {secret_word}. Congratulations! 🎉"}, {"post_id": 10869, "ts": "2026-06-17T20:30:12Z", "hours": 1.5619, "text": "It is the second to last day of school, and that means a lot of free time to code! I worked on more functions that I will use, and I added docstrings for everything. I have an ask_for_letter() function that will do the heavy lifting for the hangman logic to keep a clean main.py. So far in main.py, I have logic to choose the word. I will expand main.py, but most of the logic will be kept in functions."}, {"post_id": 10414, "ts": "2026-06-17T03:21:09Z", "hours": 1.2764, "text": "I got a great start to this project. I wrote some functions that I will need to call in main.py, specifically one to ask the user for manual or random word choice, one to check the location of a letter in a word, and to choose a random word. I am trying to follow some best practices for Python, like functions in a separate file, docstrings, return type annotations, and descriptive errors. Next, I will finish up some of the major functions and start on main.py."}]...
|
Title: Hangman by @thanEay | Stardance
Devlogs:
I Title: Hangman by @thanEay | Stardance
Devlogs:
I got a great start to this project. I wrote some functions that I will need to call in main.py, specifically one to ask the user for manual or random word choice, one to check the location of a letter in a word, and to choose a random word. I am trying to follow some best practices for Python, like functions in a separate file, docstrings, return type annotations, and descriptive errors. Next, I will finish up some of the major functions and start on main.py.
It is the second to last day of school, and that means a lot of free time to code! I worked on more functions that I will use, and I added docstrings for everything. I have an ask_for_letter() function that will do the heavy lifting for the hangman logic to keep a clean main.py. So far in main.py, I have logic to choose the word. I will expand main.py, but most of the logic will be kept in functions.
Last day of school, and even more coding! I have a mostly working prototype that can be seen below. There is no hangman sprite yet, but most of the functionality is here. Main.py has been expanded greatly. Now you can choose the game mode and enter characters. It also displays blank, unknown characters as ‘_’ and shows known characters as their letters, printing again after every input. A major bug that remains is that if a word has two identical letters (like ‘a’ in Stardance), only one can be input and uncovered. This is due to code that was meant to prevent people from doing the same wrong answer twice, but it also prevents entering the same right answer twice. This is the culprit code. In the looping code (counter does not go up in the current version, it is mostly a placeholder): while counter < 10: user_input = input("Enter another letter: ") if user_input.strip().lower() in already_guessed: print("You already guessed that letter.") continue # Goes to next loop In the ask_for_letter() function, only a single instance of a letter is uncovered, even if the letter appears more than once. index = check_letter(word, letter) if index != -1: already_guessed.append(letter) message = f"{letter} is in the word at index {index}." uncovered_indicies.append(index) return index, message check_letter() only returns a single index, which then only uncovers a single letter in the word. I need to fix this by giving the functions the ability to take and return multiple indexes. The image below shows an example of the current code. The word is ‘cryptic’, but the last ‘c’ cannot be selected. Assuming the word doesn’t have two of the same letter, when the word is guessed the following message is printed: You guessed the word: {secret_word}. Congratulations! 🎉
Working prototype completed! At this point, all text-related functionality is present. You can enter characters that show up more than once in a word, and it won’t throw errors. I spent the better part of a half hour trying to find out why most times I would enter a letter, it would say that there were none of that letter in the word. This was clearly a bug, as it happened even when entering a letter for a manually chosen word (showing that I wasn’t just an abysmal letter guesser). It turned out that the lack of two characters caused my problem. In my check_letter() function, it creates different letter location lists depending on whether there is one or more instances of that letter in the word. The code is like this. def check_letter(word: str, letter: str) -> list: if isinstance(letter, str) and len(letter) == 1: locations = [] if word.count(letter) == 1: locations = [word.find(letter)] elif word.count(letter) > 1: # BUG found here! elif was an if statement for index, character in enumerate(word): if character == letter: locations.append(index) else: locations = [-1] return locations # If letter is not in the word, will result in index of -1 The comment that starts with ‘BUG’ shows where the problem originated from. Any word with a single instance of a letter returned [-1] because if word.count(letter) > 1 would always override an intended single element list. Now, I need to add hangman sprites that will progress as you choose correct or incorrect answers, probably using ASCII characters.
Sprites added. Sprites are saved as a list of multi-line strings in ascii_sprites.py. As the name implies, the sprites are completely ascii and printable to the terminal. Additionally, now if the word has spaces, the printed characters will contain a space in the given spot. For example, ‘hack club’ will be ____ ____ instead of nine unbroken underscores. Letters that have been guessed already are printed out when an incorrect answer is chosen. I might change it to always tell you regardless of an incorrect answer to make it easier to guess. TODO: I need to add the ability to guess an entire word. I would also like to add a sprite change if the player guesses correctly. Maybe the guy would be released from the gallows or something.
Live demo hosted on Nest at hangman.epin.to . I made lots of progress, as you can probably tell with the amount of time it took. I added functionality for guessing entire words, which took about half of my four logged hours. Also, when the word is guessed correctly, the sprite changes to the man falling off of the gallows and saying ‘thanks’. To guess entire words, you put an exclamation mark at the beginning of your answer. Otherwise, only single letters are accepted. For example, to guess ‘stardance’ all at once rather than one letter at a time, you would enter ‘!stardance’. If a word guess is incorrect, the counter for tries left goes down one, just like it would for guessing an incorrect letter. I also updated some of the user prompts to make them more clear, as well as printing out all already guessed answers (letters and words) after any letter input (correct or incorrect) or incorrect word guesses so that the player can better guess correct words/letters. The reason that this project, despite its apparent simplicity is taking so long is the little features. For example, I added different messages based on different conditions (Have letters and/or words been guessed? If only one has, change the already guessed printed message to match.) TODO: Add the ability to turn off the counter so that the game can be played without a guess limit.
After much work, it is time to ship my project! Updated demo at hangman.epin.to . This project has taught me a lot about making working projects in Python. I only started learning Python at the beginning of this year, and this is the largest coding project that I have completed so far. It may not seem like a lot, but I put many hours into this code. Much of that time was fun, spent coding the main flow of the code. But eventually, the last few hours of this project went into debugging, trying to catch edge cases, and improved user messaging. So what have I worked on since my last devlog? Mostly implementing a way to disable the counter to play just for fun with infinite guesses. It is accessed by putting an exclamation mark before the mode input (like !m for manual or !r for random). Because no counter is going up, no hangman is displayed. I also changed some player messaging to make things clearer. When a correct letter is guessed, the 1-based location(s) in the word is printed rather than the 0-based indexes that Python uses for its lists. Finally, ‘!’ by itself is rejected as a guess. If it is input, the user will get a message saying that ‘!’ alone is not an acceptable input.
Ships:
Ready to ship my project! Try it at https://hangman.epin.to This is my hangman project. I put a lot of time into this project, written in Python. While it may look simple, there is a lot of nuance and thought put into it. For example, you can guess single letters, guess entire words, choose a random word to guess, or enter one yourself for a friend to guess. I have been learning Python for a few months and decided that a project like this had just enough complexity that I would learn but not enough that I would give up. Although this project has been completed for months, I procrastinated shipping it until now. I hope that you like it!...
|
1793152325.4764805
|
1793238725.4764805
|
|
20497
|
ScreenExtend by @epiccodewizard | Stardance
|
epiccodewizard
|
1
|
129.27
|
158
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T23:47:06Z", "hours": 55.0, "multiplier": 15.76, "payout": 158, "blessing": "neutral", "text": "Initial release for ScreenExtend! Please give feedback and read the initial devlog (shorter one here, longer one at https://github.com/ScreenExtend/ScreenExtend/blob/main/DEVLOG.md ) for detailed information.", "repo": "https://github.com/ScreenExtend/ScreenExtend", "demo": "https://screenextend.app/"}]...
|
[{"post_id": 60703, "ts": "202 [{"post_id": 60703, "ts": "2026-09-03T08:05:38Z", "hours": 9.5622, "text": "One step closer to finally shipping…or so I hope. I speedran shipping this next feature, so it took a lot of time. This feature is mainly for myself. I have an old Mac (running 10.13 from 2017, really old I get itttt). I want my app to run on there, but it currently only supports 10.15+. Hence, I went down a funny rabbit hole in an attempt to add support. 33. Cleaning up dylib signature lookups at run time One of the key challenges I faced throughout development was how to have a unified codebase for multiple API versions. I decided that instead of version-gating APIs and guessing which beta/normal versions they would be accessible on, I’d test for APIs at run time. I changed VideoToolbox to use this logic: it would attempt to set/use APIs and variables available at higher runtimes, but would work fine without them and have fallbacks. This ensured both legacy and modern systems functioned well. 34. Airplay automations…? As I was doing competitor research, I noticed many of the other apps supported Mac 10.13-10.15 as well as 10.15+, while mainly only supported 10.15+. Essentially, they started a fake Airplay server, had the Mac connect it, and set the display mode to “Use as separate display”. This would create a virtual display that the app would then use for its own functions. As ScreenExtend requires its own display on older machines, similar to this, where CGVirtualDisplay isn’t an option, I decided to use this method. I had my app automate opening the Airplay menu and connecting as well, in addition to running the fake server. Most of the process was straightforward, especially due to the abundance of fake Airplay server implementations online and my own experience with apps like LonelyScreen. The one issue of this approach is that only one display can be connected at a time, so any tertiary devices wanting to connect have to wait their turn. I guess the only option is to by a new mac then… 35. Client UI update cleanliness fixes Due to the one device restriction, I implemented a separate page that would be served if the display slot was being used up. It would be coupled with a short message explaining the consequences of the older Mac version. There were also bugs related to session teardown (keyboard still being locked, video stream still active in the background, etc) that I quickly squashed after finding them. Soooo in hindsight, I prolly should’ve bumped this up to 0.6.0, but I left it at 0.5.4. Oh well, I’ll increment the version by next release. Only a few more features to go on the feature list before hitting v1 and shipping!!!"}, {"post_id": 58576, "ts": "2026-08-31T01:22:07Z", "hours": 12.0222, "text": "Oh my lord, I keep forgetting to write devlogs every 10 hours and am losing hours on each one. Nevertheless, I finally finished audio work! Plus some other things like running claude security agents on the code base and patching stupid vulnerabilities. Here’s how the week went: 28. HiDPI and Mac Issues Whenever I use my Mac with ScreenExtend, the stream looks blurry due to Macs having HiDPI screens. I fixed this by adding basic HiDPI scaling on Windows. The UI has a DPR slider based on autodetected values. This DPR is multiplied by the screen resolution for a shaper display. One issue that arose with the new displays was the fact that the display would randomly not scale properly, so the task bar and apps would appear tiny. To mitigate this, I reapplied all display settings after resolution changes and a timeout. 29. AUDIO WORKS!!!! For the longest time, I tried getting audio to work. On Windows, the process was straightforward: a WASAPI loopback system audio capture session. I wanted to build my own custom driver to capture audio faster, but this would be too expensive to deploy. I read other Rust implementations and quickly wrote the code. On the other hand, Mac was a whole different issue. On older versions of Mac, system audio recording is not supported. Hence, for Macs below 13.0, I wrote a custom audio driver. I didn’t have a clue about implementing an AudioServerPlugIn on Mac, but worked out the specifics by looking at the Blackhole audio driver. I did have to proxy physical volume buttons to work (i.e. I listen for taps and change the audio level within the driver). For older Macs, I used ScreenCaptureKit with an extra audio flag. This was a simple fix to capture audio. On even newer Macs, there’s a Process Tap API to record system audio with low latency. Once again, I didn’t have much difficulties implementing these due to the abundance of documentation. 30. Streaming Audio over WebRTC (with A/V sync) When sending video and audio separately, the two are prone to fall out of sync, so watching movies or videos is difficult. To mitigate these issues, I wrote an A/V sync host clock. This packages the time on the host clock to audio samples and video frames, such that they can be reconstructed and coupled on the receiving end. On the browser side, I began by implementing a basic audio streamer with an audio element. However, similar to video, there’s always a faster method possible. I used the AudioDecoder class from WebCodecs to implement a worklet class and jitterbuffer. In simple terms, this would decode audio on a separate thread, like WebCodecs prefers, and send the audio back to be played to the user. 31. Windows Video Encoding Speedups I made a few encoding speedups on Windows targets: The NVENC capture encode system uses a texture ring implementation: a pool of 3-5 encoder instances paired with a frame queue, allowing multiple frames to be encoded concurrently BGRA encoding is done directly in the library instead of using a third-party implementation Unchanged frames in DXGI capture are not encoded again, reducing CPU load 32. Mac Video Encoding Speedups I made a few encoding speedups on Mac targets: Request LatencyCritical activity for the session to ensure App Nap and other sleep measures don’t affect the thread Analogous to DXGI, skip encoding when CGDisplayStream reports no dirty rects Not an encoding speedup, but preferring 5 GHz for Mac hosted networks to ensure higher speeds Lotta stuff done this week, am I right? I made lots of progress and finished the bulk of my features, although Linux support is still in the works. I’ll make the 1.0.0 release soon and start a Stardance ship as well. I’ll likely add Linux support after 1.0.0, as I need to research EVDI and the WSL display compositor, as well as other minor tweaks for Windows/Mac. See y’all in the next devlog!"}, {"post_id": 54119, "ts": "2026-08-24T22:53:29Z", "hours": 12.6531, "text": "I speedran shipping a buncha features…in the span of a few days. I logged a copious amount of hours on Hackatime building random stuff. I tried some things with recording system audio and building a driver…those didn’t go the best, but I’ll cover that in the next devlog. Here are the main changes this week: 24. Even more quality of life changes Compared to last time, I wanted the user experience to improve even more. Specifically, for the Windows client, a custom display driver is required. On Macs, the functionality I need is built in, so none is required. However, uninstalling this display driver used to be a pain for users. Now, I bundled it as part of the uninstall script. I wasn’t sure how to do this, but Tauri has many useful guides and issues opened regarding custom WiX/NSIS code. When the window isn’t focused, join and leave notifications are toasted. This allows the user to stay informed even when the app isn’t open. Basic feature but very useful. I’d often get annoyed that I needed to keep re-entering the password to log in to a previously connected device. Hence, I added auto-join for devices based on their IP. This ensures that commonly connected devices can save time when reconnecting. 25. Onboarding screens The app is intuitive to use…or so I thought? Some of my beta testers were confused as to the various features and how to use the interface. Hence, I used NextStepjs to add onboarding components. This would dim the UI and only highlight the component being displayed, along with a message next to it. I liked the styles of NextStepjs a lot, so I chose it. There were some issues regarding window resize, so I made the onboarding exit and reopen to the last step when the window is resized. This way, the positioning of elements was forcefully recalculated. 26. Random security fixes My app had various vulnerabilities scattered throughout, so I ran a vulnerability Claude skill and patched some holes. The main issues fixed were: Checksums of bundled DLLs and resources are checked before being pushed to GitHub Actions Tauri CSP and allow list are actually enforced instead of being set to allow all TLS cert used for hosting the HTTPS domain has more secure file system permissions to reduce unwanted tampering of files Devices are trusted by a uniquely generated token, not by IP, to decrease the chance of impersonators 27. Command-line interface A majority of the time on this devlog was spent on the CLI. It wasn’t that hard (from a technical perspective), mainly just translating a lot of the UI code into Tauri CLI commands and mapping them correctly in the generated JSON file. One of the harder things to figure out was setting up cross-thread AppState, when the app wasn’t exactly running…turned out I just had to move the initialization command to before the window is created, so it would run inside both CLI and GUI modes. To present the QR codes better. I used qr2term to display the QR codes. By default, all logging is hidden. This turns ScreenExtend into a clean CLI mimicking the GUI. Hoorah! That’s it for this devlog. Not much to conclude, but plenty more features coming. Stay tuned!"}, {"post_id": 51902, "ts": "2026-08-21T20:12:46Z", "hours": 10.3639, "text": "Oh my lord…I crammed a lot of features into this week. I have yet to do proper audits of the codebase as a whole, specifically related to latency optimizations. I added a lot more code that affects the WebRTC pipeline, but I at least got the core features working. 20. Automatic updates For a while, the app relied on manual updating. It would check the latest version on Github, but users would have to go to the website, download the installer, uninstall the current version, and reinstall the newer version. This also messed up config and was a huge pain. Hence, I generated my own signing keys and used the Tauri updater plugin to automatically update apps. When the app is first launched and if an update is available, it automatically downloads and installs it without any user action. To make this more robust, I added a progress bar while downloading the update. On Windows specifically, the app must be shut down and restarted, so a blocking modal prevents devices from joining till this is done. I originally made this modal manually, but switched to using AlertDialog from ShadCN. Another issue I faced was the latest.json manifest. As I used custom filenames when downloading and installing updates, I had to manually patch the JSON. I learned a lot about the Tauri updater Github action through this, as I had to figure out how Tauri generated build filenames and how I could safely update them. 21. Quality of life for client devices I finished QOL fixes on the client side: Remember past devices to quickly import preferences or ban devices (all config saving is IP-based) Warn if the user is attempting to connect from the same device (this app is a remote control tool, but you can’t exactly remote control yourself) If the screen orientation changes, the virtual display is updated accordingly using CSS media queries to ensure a seamless experience A no fullscreen mode was added so users could quickly switch apps and maintain productivity 22. Quality of life for host devices I converted all in-app modals and error messages to JSON. This allowed me to add i18n language support, so I could easily translate my app to other languages. To detect and ensure only a single instance of the app was running, I previously used a file lock. However, there was an issue with MSI builds falsely detecting a file lock and not opening. I switched to a basic TCP model for IPC so that multiple processes running can figure out which was there first and shut down the others. 23. More more more Mac features! I’ve always felt a bit sad for my Mac users. I don’t have a Mac to test on, so I keep borrowing my dad’s Mac, which results in insanely slow development times. Nevertheless, I made some serious progress this week. The biggest thing was a simpler installation process. Many users would complain that they didn’t remember if they’re on Intel or Apple Silicon, so I now distribute a universal DMG. In terms of the app itself, I added a permissions check for screen recording and input injection. It would run a live test of screen capture or key input to see if the app actually had permissions; therefore, down the road it wouldn’t cause issues. I initially tried to do a soft check without an actual test (i.e., read the settings app), but this didn’t work. The only foolproof way was to call the API itself. The biggest feature by far was adding Mac input injection. Using accessibility APIs and a charmap similar to Windows, it would inject input onto the Mac screen. I could remotely log in from my Chromebook and get a lot of work done. I mirrored the structure and code on the Windows input injection pipeline, so no major difficulties here. That’s it for this week! Lotta stuff added, especially for the Mac users. I have a long list of features to continue building, specifically regarding easier Windows uninstall processes, onboarding, and an overall better UX. See you soon!"}, {"post_id": 39065, "ts": "2026-08-01T19:07:47Z", "hours": 9.8208, "text": "I had so much fun at the conference in San Francisco! I met a lot of cool people who gave me advice on the app, although I didn’t see the downloads spike 😭. I primarily began working on a SW encoder and other miscellaneous changes: 17. Remote control toggle Sometimes, the user doesn’t want a client to have remote control access. Although the purpose of the app is to have remote control, it is useful to disable this feature. On the frontend, I added a toggle switch that enables or disables the remote control backend. I was debating whether WebRTC negotiation was required as well, but decided to do so in the end. The remote control used data channels, so an unused data channel would result in slightly lower latency. Renegotiation ensured the stream stayed as efficient as possible without sending redundant data. 18. Update checking In order for current users to access newer versions, I wanted to add an update functionality. I’m not using Tauri’s update plugin just yet, so I run a simple check. The app, on startup, checks the latest release tag on GitHub. If it’s not equal to the current version (rollback or higher version), the user is prompted to download the newer version. Automatic updates will come next. 19. The big boy: software encoding This one’s been a long time coming. A lot of machines like VMs or computers with a weird setup just don’t have a working hardware encoder (Intel/AMD/Nvidia), and until now that meant the app straight up didn’t work there. So I built a full CPU-only x264 fallback. For the pipeline, the frames come as raw BGRA bytes that the other supporters already encoded. They must be converted to I420 before going to libx264, whose build I pulled from OBS. As a side note, the DLL is bundled with the app at runtime to ensure no missing dependencies. As with any encoder, the rate control is ABR with a tight VBV, as well as an infinite GOP. Besides the technical jargon, this just means latency is the north star and nothing else matters. The whole software variant is added to the encoder vendor enum, and wired into the fallback chain: if NVENC fails, try Intel; if Intel fails, fall back to software before giving up entirely. There’s also a manual override if someone really prefers software encoding, but this is not the default. There’s a big CPU cost compared to hardware encoding, so it’s very much a last resort and only kicks in if absolutely no GPU encoders are available. But “last resort that works” beats “doesn’t work at all.” That’s it for this week! I plan to have some smaller quality-of-life changes and better updates coming soon…"}, {"post_id": 34237, "ts": "2026-07-24T19:29:18Z", "hours": 9.1139, "text": "Sooooo this devlog is mostly comprised of website changes. I have a conference in San Francisco and wanted to polish up the app before publishing. Here are the main changes I made: 13. Random chores and updating the website I absolutely love shadcn-ui, but so do AI models. In past reviews by stardance raters, as well as family and friends, they pointed out the website looked AI-generated. Hence, I decreased the number of gradients and added basic animations to make the site feel more alive. This was a first for me to implement animations, but the Tailwind docs made it quite simple. I used a specific code-like font instead of the generic fonts I had and tidied up CSS classes. The biggest change was adding a blurred-geometric background for a nicer feel. 14. Redesigning the website completely I felt it was better to update the website as a whole, so I changed up the user interface. When I tested the app with real users, they complained that they didn’t know how to actually use the app. I changed the hero design to have clearer text and added an SVG-animation component showing how the site actually works. The feature section stayed the same, but there was a highlights grid (inspo https://cider.sh/ ) to highlight the main features. The FAQ was shortened to my liking, and I pulled some utilities from Tailwind for animations. In terms of images, I updated the images of the app featured on the website and cleaned up some of the dimensions related to that CSS. The old homepage still lives inside OldHome() but isn’t used anymore. 15. Tidying up the README and build workflows I edited the README to remove redundant information and make it more developer-focused. I also updated some information regarding GPU builds. For the build workflow, I ensured it would only run if the commit ended in “rebuild”. This ensures unnecessary build minutes are not spent on small changes not requiring a full rebuild. 16. Wake lock API fallback This app aims to support all devices, but older devices have…funny APIs to say the least. For WebRTC, I implemented the legacy encoded streams API. However, the device would still turn off for seemingly no reason while the video was playing. On older devices, the wake lock API is not supported. However, there’s a unique workaround for this: any video element playing on the webpage will keep the screen from dimming. Hence, I used the NoSleep library to create an off-screen 1-second video element that keeps looping, ensuring the display doesn’t go dark. Some very fun stuff with browsers. That’s it for this devlog! Mostly minor changes, but the next one will have better SW encoding support among other changes. Stay tuned…"}, {"post_id": 28772, "ts": "2026-07-15T08:02:33Z", "hours": 10.7358, "text": "I met with some friends to discuss my app…and realized I gotta lock in with the features. Among the various topics we discussed like the difficult UI or lack of automatic updates, they really wanted remote control features. So, I set out to make the remote display something I can actually touch, click, and type into. And patching some other bugs along the way. 9. Remote input This is the main headline feature. Streaming pixels one way was solved; now the client had to send input back up the wire and have the host replay it as if it came from real hardware. Host side (Windows). A new input backend injects events through a synthetic pointer device , so mouse, touch, and pen all seem real as opposed to faked mouse moves. The synthetic device can execute touch or mouse movements from the tablet client. macOS and Linux backends are stubbed and will come later (trust me bro). The wire. This side had to be optimized for dead-low latency like the rest of the project. Instead of passing strings or using some wrapper library, I made my own binary protocol (a dedicated protocol module) serialized over WebRTC data channels , not the media path. Client-side input.js captures keyboard, mouse, pointer (touch/pen), wheel, clipboard, and drag-drop and ships them across. The code basically catches every single frontend input event and forwards all those events (20+)! The routing is latency-first, same as everything else, with three different paths. fast-path events (pointer moves, wheel) take an unreliable channel , where a dropped packet is cheaper than a late one, while clicks, keys, and clipboard take the reliable channel where every event must land exactly once. It’s not that big of a deal if one small mouse delta doesn’t go through, but it definitely is a big deal if a click doesn’t go through. 10. Browser compatibility detections Not every browser can do WebCodecs, secure contexts, or the input paths above. Rather than fail silently, I added a compatibility check on both the browser and client up front. It shows compatibility modals with per-feature lists to ensure the user knows what’s going on. 11. Some more small fixes I added two quality-of-life additions: avatars (upload custom profile pictures) and zoom controls (ctrl/cmd +/-). 12. Encoders that don’t explode when funny stuff happens Oh my god…one of the biggest issues by far. When I ran the NVIDIA encoder at high FPS, it didn’t crash. However, the Intel Quick Sync encoder would arbitrarily crash at high FPS and wouldn’t give a reason why. I audited a buncha different parts of my code and eventually found that FPS was the issue, not resolution or low-latency flags. Hence, I added a binary search that probes the hardware for its true maximum supported fps and clamps to it before the encoder can choke. Essentially, I ask the encoder “can you do 1920x1080 at 240 fps?” –> “no” –> “what about 120 fps?” –> “yes” –> “what about 180 fps?”. This keeps repeating till the max FPS is found and streamed to the client. Rounding out the release, I made a variety of different UI fixes like the modal fixes , backdrop overlap, a stray uninstall-modal backdrop, and cloud reconfig errors . More progress to come!"}, {"post_id": 20389, "ts": "2026-07-01T23:35:58Z", "hours": 54.7942, "text": "ScreenExtend Devlog: Building the Rust Engine Under a Wireless Second Monitor TL;DR ScreenExtend turns any device with a browser into a real, wireless extended monitor for a Windows host, no client app and no cables (it began so my brother could use his iPad for notes at debate tournaments). Scan a QR code and the host spins up a real virtual display, streamed over WebRTC with hardware H.264. The React/TS control UI existed before; everything else (Rust core, GPU pipeline, WebCodecs client, cloud relay) was built from scratch , always latency-first, quality-second. 1. The spine: Tauri + a typed Rust↔TS bridge tauri-specta exports a fully-typed src/lib/bindings.ts for commands (TS→Rust) plus typed events (Rust→TS): devices, network, cloud status, logs. A code-generated bridge beats maintaining one by hand. Let the code write itself! 2. Virtual displays: faking a real monitor Each client gets its own virtual display the OS treats as real hardware, a true second screen, not mirroring. On join the host creates one sized to the client , forces extend topology, then captures it once attached. On Windows a signed IDD driver installs at runtime (via nefconc + certutil ), and it tears down cleanly on leave. 3. First light: WebRTC + WHEP + H.264 The media path is WebRTC (real-time, in every browser). Signaling is WHEP : the client POSTs an SDP offer, the host answers in-response, no signaling server. Codec is H.264 , universal hardware decode on clients and encode (NVENC/QSV/AMF) on hosts. The first release streamed NVENC to a plain <video> ; it worked but was laggy. It binds HTTP + HTTPS (self-signed via rcgen ) , since WebCodecs needs a secure context. 4. The pipeline: capture → encode → broadcast Capture is Windows Graphics Capture (later a custom fork; DXGI Desktop Duplication fallback), with a repeater thread for idle keepalive/IDRs and transient-stall tolerance. 5. Going vendor-specific: the part that made it fast Generic capture→CPU-copy→encode is slow everywhere; the win: keep the frame on the GPU from capture to bitstream. Per vendor: NVENC (NVIDIA): no SDK linked (API dynamically loaded ); zero-copy writes capture into a shared D3D11 texture behind a keyed mutex, else a CPU bridge. Intel QSV/oneVPL: same-adapter capture+encode fuses the downscale into the VPP pass (BGRA→NV12 + resize in one shot). macOS (VideoToolbox): ScreenCaptureKit (12.3+, CGDisplayStream fallback) via objc2 runtime interop only , so one binary loads on every macOS version, same IOSurface zero-copy. 6. The client: WebCodecs over <video> Fast path: an RTCRtpScriptTransform feeds a worker VideoDecoder ( optimizeForLatency: true ) onto an OffscreenCanvas , latency hints zeroed. A <video> fallback covers missing WebCodecs or stalls. It also feels like a monitor: fullscreen + input/wake locks, /leave beacon on exit. 7. Adaptive bitrate, sessions & security A BWE driver reads getStats every 250ms, pushing a smoothed bitrate into the encoder. Changing settings triggers in-place renegotiation (a reconfig/kick epoch the client polls) with no display teardown. Each host is gated by a session ID + 6-digit OTP ( OtpLimiter lockout); every device is isolated, over HTTPS + DTLS/SRTP. 8. Networking + status (v0.2.3) Same-network is direct, no servers. Offline mode stands up an ad-hoc hosted network , no infrastructure needed. Cross-network adds a cloud relay (WebSocket to session.screenextend.app ) tunneling signaling while media stays P2P; a self-hosted TURN server covers hard NATs. A logbus feeds an in-app terminal. Working today: Windows/macOS hosts, per-vendor GPU encode, per-device displays, adaptive bitrate, OTP sessions, offline mode, and cloud relay."}]...
|
Title: ScreenExtend by @epiccodewizard | Stardance Title: ScreenExtend by @epiccodewizard | Stardance
Devlogs:
ScreenExtend Devlog: Building the Rust Engine Under a Wireless Second Monitor TL;DR ScreenExtend turns any device with a browser into a real, wireless extended monitor for a Windows host, no client app and no cables (it began so my brother could use his iPad for notes at debate tournaments). Scan a QR code and the host spins up a real virtual display, streamed over WebRTC with hardware H.264. The React/TS control UI existed before; everything else (Rust core, GPU pipeline, WebCodecs client, cloud relay) was built from scratch , always latency-first, quality-second. 1. The spine: Tauri + a typed Rust↔TS bridge tauri-specta exports a fully-typed src/lib/bindings.ts for commands (TS→Rust) plus typed events (Rust→TS): devices, network, cloud status, logs. A code-generated bridge beats maintaining one by hand. Let the code write itself! 2. Virtual displays: faking a real monitor Each client gets its own virtual display the OS treats as real hardware, a true second screen, not mirroring. On join the host creates one sized to the client , forces extend topology, then captures it once attached. On Windows a signed IDD driver installs at runtime (via nefconc + certutil ), and it tears down cleanly on leave. 3. First light: WebRTC + WHEP + H.264 The media path is WebRTC (real-time, in every browser). Signaling is WHEP : the client POSTs an SDP offer, the host answers in-response, no signaling server. Codec is H.264 , universal hardware decode on clients and encode (NVENC/QSV/AMF) on hosts. The first release streamed NVENC to a plain <video> ; it worked but was laggy. It binds HTTP + HTTPS (self-signed via rcgen ) , since WebCodecs needs a secure context. 4. The pipeline: capture → encode → broadcast Capture is Windows Graphics Capture (later a custom fork; DXGI Desktop Duplication fallback), with a repeater thread for idle keepalive/IDRs and transient-stall tolerance. 5. Going vendor-specific: the part that made it fast Generic capture→CPU-copy→encode is slow everywhere; the win: keep the frame on the GPU from capture to bitstream. Per vendor: NVENC (NVIDIA): no SDK linked (API dynamically loaded ); zero-copy writes capture into a shared D3D11 texture behind a keyed mutex, else a CPU bridge. Intel QSV/oneVPL: same-adapter capture+encode fuses the downscale into the VPP pass (BGRA→NV12 + resize in one shot). macOS (VideoToolbox): ScreenCaptureKit (12.3+, CGDisplayStream fallback) via objc2 runtime interop only , so one binary loads on every macOS version, same IOSurface zero-copy. 6. The client: WebCodecs over <video> Fast path: an RTCRtpScriptTransform feeds a worker VideoDecoder ( optimizeForLatency: true ) onto an OffscreenCanvas , latency hints zeroed. A <video> fallback covers missing WebCodecs or stalls. It also feels like a monitor: fullscreen + input/wake locks, /leave beacon on exit. 7. Adaptive bitrate, sessions & security A BWE driver reads getStats every 250ms, pushing a smoothed bitrate into the encoder. Changing settings triggers in-place renegotiation (a reconfig/kick epoch the client polls) with no display teardown. Each host is gated by a session ID + 6-digit OTP ( OtpLimiter lockout); every device is isolated, over HTTPS + DTLS/SRTP. 8. Networking + status (v0.2.3) Same-network is direct, no servers. Offline mode stands up an ad-hoc hosted network , no infrastructure needed. Cross-network adds a cloud relay (WebSocket to session.screenextend.app ) tunneling signaling while media stays P2P; a self-hosted TURN server covers hard NATs. A logbus feeds an in-app terminal. Working today: Windows/macOS hosts, per-vendor GPU encode, per-device displays, adaptive bitrate, OTP sessions, offline mode, and cloud relay.
I met with some friends to discuss my app…and realized I gotta lock in with the features. Among the various topics we discussed like the difficult UI or lack of automatic updates, they really wanted remote control features. So, I set out to make the remote display something I can actually touch, click, and type into. And patching some other bugs along the way. 9. Remote input This is the main headline feature. Streaming pixels one way was solved; now the client had to send input back up the wire and have the host replay it as if it came from real hardware. Host side (Windows). A new input backend injects events through a synthetic pointer device , so mouse, touch, and pen all seem real as opposed to faked mouse moves. The synthetic device can execute touch or mouse movements from the tablet client. macOS and Linux backends are stubbed and will come later (trust me bro). The wire. This side had to be optimized for dead-low latency like the rest of the project. Instead of passing strings or using some wrapper library, I made my own binary protocol (a dedicated protocol module) serialized over WebRTC data channels , not the media path. Client-side input.js captures keyboard, mouse, pointer (touch/pen), wheel, clipboard, and drag-drop and ships them across. The code basically catches every single frontend input event and forwards all those events (20+)! The routing is latency-first, same as everything else, with three different paths. fast-path events (pointer moves, wheel) take an unreliable channel , where a dropped packet is cheaper than a late one, while clicks, keys, and clipboard take the reliable channel where every event must land exactly once. It’s not that big of a deal if one small mouse delta doesn’t go through, but it definitely is a big deal if a click doesn’t go through. 10. Browser compatibility detections Not every browser can do WebCodecs, secure contexts, or the input paths above. Rather than fail silently, I added a compatibility check on both the browser and client up front. It shows compatibility modals with per-feature lists to ensure the user knows what’s going on. 11. Some more small fixes I added two quality-of-life additions: avatars (upload custom profile pictures) and zoom controls (ctrl/cmd +/-). 12. Encoders that don’t explode when funny stuff happens Oh my god…one of the biggest issues by far. When I ran the NVIDIA encoder at high FPS, it didn’t crash. However, the Intel Quick Sync encoder would arbitrarily crash at high FPS and wouldn’t give a reason why. I audited a buncha different parts of my code and eventually found that FPS was the issue, not resolution or low-latency flags. Hence, I added a binary search that probes the hardware for its true maximum supported fps and clamps to it before the encoder can choke. Essentially, I ask the encoder “can you do 1920x1080 at 240 fps?” –> “no” –> “what about 120 fps?” –> “yes” –> “what about 180 fps?”. This keeps repeating till the max FPS is found and streamed to the client. Rounding out the release, I made a variety of different UI fixes like the modal fixes , backdrop overlap, a stray uninstall-modal backdrop, and cloud reconfig errors . More progress to come!
Sooooo this devlog is mostly comprised of website changes. I have a conference in San Francisco and wanted to polish up the app before publishing. Here are the main changes I made: 13. Random chores and updating the website I absolutely love shadcn-ui, but so do AI models. In past reviews by stardance raters, as well as family and friends, they pointed out the website looked AI-generated. Hence, I decreased the number of gradients and added basic animations to make the site feel more alive. This was a first for me to implement animations, but the Tailwind docs made it quite simple. I used a specific code-like font instead of the generic fonts I had and tidied up CSS classes. The biggest change was adding a blurred-geometric background for a nicer feel. 14. Redesigning the website completely I felt it was better to update the website as a whole, so I changed up the user interface. When I tested the app with real users, they complained that they didn’t know how to actually use the app. I changed the hero design to have clearer text and added an SVG-animation component showing how the site actually works. The feature section stayed the same, but there was a highlights grid (inspo https://cider.sh/ ) to highlight the main features. The FAQ was shortened to my liking, and I pulled some utilities from Tailwind for animations. In terms of images, I updated the images of the app featured on the website and cleaned up some of the dimensions related to that CSS. The old homepage still lives inside OldHome() but isn’t used anymore. 15. Tidying up the README and build workflows I edited the README to remove redundant information and make it more developer-focused. I also updated some information regarding GPU builds. For the build workflow, I ensured it would only run if the commit ended in “rebuild”. This ensures unnecessary build minutes are not spent on small changes not requiring a full rebuild. 16. Wake lock API fallback This app aims to support all devices, but older devices have…funny APIs to say the least. For WebRTC, I implemented the legacy encoded streams API. However, the device would still turn off for seemingly no reason while the video was playing. On older devices, the wake lock API is not supported. However, there’s a unique workaround for this: any video element playing on the webpage will keep the screen from dimming. Hence, I used the NoSleep library to create an off-screen 1-second video element that keeps looping, ensuring the display doesn’t go dark. Some very fun stuff with browsers. That’s it for this devlog! Mostly minor changes, but the next one will have better SW encoding support among other changes. Stay tuned…
I had so much fun at the conference in San Francisco! I met a lot of cool people who gave me advice on the app, although I didn’t see the downloads spike 😭. I primarily began working on a SW encoder and other miscellaneous changes: 17. Remote control toggle Sometimes, the user doesn’t want a client to have remote control access. Although the purpose of the app is to have remote control, it is useful to disable this feature. On the frontend, I added a toggle switch that enables or disables the remote control backend. I was debating whether WebRTC negotiation was required as well, but decided to do so in the end. The remote control used data channels, so an unused data channel would result in slightly lower latency. Renegotiation ensured the stream stayed as efficient as possible without sending redundant data. 18. Update checking In order for current users to access newer versions, I wanted to add an update functionality. I’m not using Tauri’s update plugin just yet, so I run a simple check. The app, on startup, checks the latest release tag on GitHub. If it’s not equal to the current version (rollback or higher version), the user is prompted to download the newer version. Automatic updates will come next. 19. The big boy: software encoding This one’s been a long time coming. A lot of machines like VMs or computers with a weird setup just don’t have a working hardware encoder (Intel/AMD/Nvidia), and until now that meant the app straight up didn’t work there. So I built a full CPU-only x264 fallback. For the pipeline, the frames come as raw BGRA bytes that the other supporters already encoded. They must be converted to I420 before going to libx264, whose build I pulled from OBS. As a side note, the DLL is bundled with the app at runtime to ensure no missing dependencies. As with any encoder, the rate control is ABR with a tight VBV, as well as an infinite GOP. Besides the technical jargon, this just means latency is the north star and nothing else matters. The whole software variant is added to the encoder vendor enum, and wired into the fallback chain: if NVENC fails, try Intel; if Intel fails, fall back to software before giving up entirely. There’s also a manual override if someone really prefers software encoding, but this is not the default. There’s a big CPU cost compared to hardware encoding, so it’s very much a last resort and only kicks in if absolutely no GPU encoders are available. But “last resort that works” beats “doesn’t work at all.” That’s it for this week! I plan to have some smaller quality-of-life changes and better updates coming soon…
Oh my lord…I crammed a lot of features into this week. I have yet to do proper audits of the codebase as a whole, specifically related to latency optimizations. I added a lot more code that affects the WebRTC pipeline, but I at least got the core features working. 20. Automatic updates For a while, the app relied on manual updating. It would check the latest version on Github, but users would have to go to the website, download the installer, uninstall the current version, and reinstall the newer version. This also messed up config and was a huge pain. Hence, I generated my own signing keys and used the Tauri updater plugin to automatically update apps. When the app is first launched and if an update is available, it automatically downloads and installs it without any user action. To make this more robust, I added a progress bar while downloading the update. On Windows specifically, the app must be shut down and restarted, so a blocking modal prevents devices from joining till this is done. I originally made this modal manually, but switched to using AlertDialog from ShadCN. Another issue I faced was the latest.json manifest. As I used custom filenames when downloading and installing updates, I had to manually patch the JSON. I learned a lot about the Tauri updater Github action through this, as I had to figure out how Tauri generated build filenames and how I could safely update them. 21. Quality of life for client devices I finished QOL fixes on the client side: Remember past devices to quickly import preferences or ban devices (all config saving is IP-based) Warn if the user is attempting to connect from the same device (this app is a remote control tool, but you can’t exactly remote control yourself) If the screen orientation changes, the virtual display is updated accordingly using CSS media queries to ensure a seamless experience A no fullscreen mode was added so users could quickly switch apps and maintain productivity 22. Quality of life for host devices I converted all in-app modals and error messages to JSON. This allowed me to add i18n language support, so I could easily translate my app to other languages. To detect and ensure only a single instance of the app was running, I previously used a file lock. However, there was an issue with MSI builds falsely detecting a file lock and not opening. I switched to a basic TCP model for IPC so that multiple processes running can figure out which was there first and shut down the others. 23. More more more Mac features! I’ve always felt a bit sad for my Mac users. I don’t have a Mac to test on, so I keep borrowing my dad’s Mac, which results in insanely slow development times. Nevertheless, I made some serious progress this week. The biggest thing was a simpler installation process. Many users would complain that they didn’t remember if they’re on Intel or Apple Silicon, so I now distribute a universal DMG. In terms of the app itself, I added a permissions check for screen recording and input injection. It would run a live test of screen capture or key input to see if the app actually had permissions; therefore, down the road it wouldn’t cause issues. I initially tried to do a soft check without an actual test (i.e., read the settings app), but this didn’t work. The only foolproof way was to call the API itself. The biggest feature by far was adding Mac input injection. Using accessibility APIs and a charmap similar to Windows, it would inject input onto the Mac screen. I could remotely log in from my Chromebook and get a lot of work done. I mirrored the structure and code on the Windows input injection pipeline, so no major difficulties here. That’s it for this week! Lotta stuff added, especially for the Mac users. I have a long list of features to continue building, specifically regarding easier Windows uninstall processes, onboarding, and an overall better UX. See you soon!
I speedran shipping a buncha features…in the span of a few days. I logged a copious amount of hours on Hackatime building random stuff. I tried some things with recording system audio and building a driver…those didn’t go the best, but I’ll cover that in the next devlog. Here are the main changes this week: 24. Even more quality of life changes Compared to last time, I wanted the user experience to improve even more. Specifically, for the Windows client, a custom display driver is required. On Macs, the functionality I need is built in, so none is required. However, uninstalling this display driver used to be a pain for users. Now, I bundled it as part of the uninstall script. I wasn’t sure how to do this, but Tauri has many useful guides and issues opened regarding custom WiX/NSIS code. When the window isn’t focused, join and leave notifications are toasted. This allows the user to stay informed even when the app isn’t open. Basic feature but very useful. I’d often get annoyed that I needed to keep re-entering the password to log in to a previously connected device. Hence, I added auto-join for devices based on their IP. This ensures that commonly connected devices can save time when reconnecting. 25. Onboarding screens The app is intuitive to use…or so I thought? Some of my beta testers were confused as to the various features and how to use the interface. Hence, I used NextStepjs to add onboarding components. This would dim the UI and only highlight the component being displayed, along with a message next to it. I liked the styles of NextStepjs a lot, so I chose it. There were some issues regarding window resize, so I made the onboarding exit and reopen to the last step when the window is resized. This way, the positioning of elements was forcefully recalculated. 26. Random security fixes My app had various vulnerabilities scattered throughout, so I ran a vulnerability Claude skill and patched some holes. The main issues fixed were: Checksums of bundled DLLs and resources are checked before being pushed to GitHub Actions Tauri CSP and allow list are actually enforced instead of being set to allow all TLS cert used for hosting the HTTPS domain has more secure file system permissions to reduce unwanted tampering of files Devices are trusted by a uniquely generated token, not by IP, to decrease the chance of impersonators 27. Command-line interface A majority of the time on this devlog was spent on the CLI. It wasn’t that hard (from a technical perspective), mainly just translating a lot of the UI code into Tauri CLI commands and mapping them correctly in the generated JSON file. One of the harder things to figure out was setting up cross-thread AppState, when the app wasn’t exactly running…turned out I just had to move the initialization command to before the window is created, so it would run inside both CLI and GUI modes. To present the QR codes better. I used qr2term to display the QR codes. By default, all logging is hidden. This turns ScreenExtend into a clean CLI mimicking the GUI. Hoorah! That’s it for this devlog. Not much to conclude, but plenty more features coming. Stay tuned!
Oh my lord, I keep forgetting to write devlogs every 10 hours and am losing hours on each one. Nevertheless, I finally finished audio work! Plus some other things like running claude security agents on the code base and patching stupid vulnerabilities. Here’s how the week went: 28. HiDPI and Mac Issues Whenever I use my Mac with ScreenExtend, the stream looks blurry due to Macs having HiDPI screens. I fixed this by adding basic HiDPI scaling on Windows. The UI has a DPR slider based on autodetected values. This DPR is multiplied by the screen resolution for a shaper display. One issue that arose with the new displays was the fact that the display would randomly not scale properly, so the task bar and apps would appear tiny. To mitigate this, I reapplied all display settings after resolution changes and a timeout. 29. AUDIO WORKS!!!! For the longest time, I tried getting audio to work. On Windows, the process was straightforward: a WASAPI loopback system audio capture session. I wanted to build my own custom driver to capture audio faster, but this would be too expensive to deploy. I read other Rust implementations and quickly wrote the code. On the other hand, Mac was a whole different issue. On older versions of Mac, system audio recording is not supported. Hence, for Macs below 13.0, I wrote a custom audio driver. I didn’t have a clue about implementing an AudioServerPlugIn on Mac, but worked out the specifics by looking at the Blackhole audio driver. I did have to proxy physical volume buttons to work (i.e. I listen for taps and change the audio level within the driver). For older Macs, I used ScreenCaptureKit with an extra audio flag. This was a simple fix to capture audio. On even newer Macs, there’s a Process Tap API to record system audio with low latency. Once again, I didn’t have much difficulties implementing these due to the abundance of documentation. 30. Streaming Audio over WebRTC (with A/V sync) When sending video and audio separately, the two are prone to fall out of sync, so watching movies or videos is difficult. To mitigate these issues, I wrote an A/V sync host clock. This packages the time on the host clock to audio samples and video frames, such that they can be reconstructed and coupled on the receiving end. On the browser side, I began by implementing a basic audio streamer with an audio element. However, similar to video, there’s always a faster method possible. I used the AudioDecoder class from WebCodecs to implement a worklet class and jitterbuffer. In simple terms, this would decode audio on a separate thread, like WebCodecs prefers, and send the audio back to be played to the user. 31. Windows Video Encoding Speedups I made a few encoding speedups on Windows targets: The NVENC capture encode system uses a texture ring implementation: a pool of 3-5 encoder instances paired with a frame queue, allowing multiple frames to be encoded concurrently BGRA encoding is done directly in the library instead of using a third-party implementation Unchanged frames in DXGI capture are not encoded again, reducing CPU load 32. Mac Video Encoding Speedups I made a few encoding speedups on Mac targets: Request LatencyCritical activity for the session to ensure App Nap and other sleep measures don’t affect the thread Analogous to DXGI, skip encoding when CGDisplayStream reports no dirty rects Not an encoding speedup, but preferring 5 GHz for Mac hosted networks to ensure higher speeds Lotta stuff done this week, am I right? I made lots of progress and finished the bulk of my features, although Linux support is still in the works. I’ll make the 1.0.0 release soon and start a Stardance ship as well. I’ll likely add Linux support after 1.0.0, as I need to research EVDI and the WSL display compositor, as well as other minor tweaks for Windows/Mac. See y’all in the next devlog!
One step closer to finally shipping…or so I hope. I speedran shipping this next feature, so it took a lot of time. This feature is mainly for myself. I have an old Mac (running 10.13 from 2017, really old I get itttt). I want my app to run on there, but it currently only supports 10.15+. Hence, I went down a funny rabbit hole in an attempt to add support. 33. Cleaning up dylib signature lookups at run time One of the key challenges I faced throughout development was how to have a unified codebase for multiple API versions. I decided that instead of version-gating APIs and guessing which beta/normal versions they would be accessible on, I’d test for APIs at run time. I changed VideoToolbox to use this logic: it would attempt to set/use APIs and variables available at higher runtimes, but would work fine without them and have fallbacks. This ensured both legacy and modern systems functioned well. 34. Airplay automations…? As I was doing competitor research, I noticed many of the other apps supported Mac 10.13-10.15 as well as 10.15+, while mainly only supported 10.15+. Essentially, they started a fake Airplay server, had the Mac connect it, and set the display mode to “Use as separate display”. This would create a virtual display that the app would then use for its own functions. As ScreenExtend requires its own display on older machines, similar to this, where CGVirtualDisplay isn’t an option, I decided to use this method. I had my app automate opening the Airplay menu and connecting as well, in addition to running the fake server. Most of the process was straightforward, especially due to the abundance of fake Airplay server implementations online and my own experience with apps like LonelyScreen. The one issue of this approach is that only one display can be connected at a time, so any tertiary devices wanting to connect have to wait their turn. I guess the only option is to by a new mac then… 35. Client UI update cleanliness fixes Due to the one device restriction, I implemented a separate page that would be served if the display slot was being used up. It would be coupled with a short message explaining the consequences of the older Mac version. There were also bugs related to session teardown (keyboard still being locked, video stream still active in the background, etc) that I quickly squashed after finding them. Soooo in hindsight, I prolly should’ve bumped this up to 0.6.0, but I left it at 0.5.4. Oh well, I’ll increment the version by next release. Only a few more features to go on the feature list before hitting v1 and shipping!!!
Ships:
Initial release for ScreenExtend! Please give feedback and read the initial devlog (shorter one here, longer one at https://github.com/ScreenExtend/ScreenExtend/blob/main/DEVLOG.md ) for detailed information....
|
1793127274.2323256
|
1793213674.2323256
|
|
20499
|
ArduinoMarsAirlockSystem by @bobjoe | Stardance
|
bobjoe
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T18:13:43Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made an Airlock system that opens the door, slowly closes the door, and locks the door. Originally I had a few problems with the project. I actually wanted to give it two more sensors, an Ultrasonic sensor and DHT11 sensor. Unfortunately the DHT11 sensor wasn’t working and the Ultrasonic Sensor was broken. I decided to add LEDs to distinguish all 3 systems. Then I realized my LCD1602 wasn’t working, so I tried rewriting that portion of code but it still didn’t work. I downloaded some installations on Arduino IDE and it still didn’t work. Then I realized I needed a potentiometer, and when I added it, it worked. I also ran into a problem with my servo motor not being calibrated to the same amount of degrees each time, I fixed it by rewriting the code to calibrate it to 0 degrees everytime the code runs. Now that I’ve ran into these problems, hopefully it will be easier to make hardware next time.", "repo": "https://github.com/bobjoe2009/ArduinoMarsAirlock", "demo": ""}]...
|
[{"post_id": 11411, "ts": "202 [{"post_id": 11411, "ts": "2026-06-18T17:53:33Z", "hours": 0.6833, "text": "I am working on a small Arduino system involving servo motors an LCD1602 and LEDs. This project mimcs airlock systems used in space shuttles. Right now the project has three different systems, Safe, Caution, and Airlock. Things that I’m thinking about adding to this project : DHT11 (to analyze temperature and airlock during dangerous temperatures), Ultrasonic (Detecting any threats), IR sensor module (useful for detection too)."}]...
|
Title: ArduinoMarsAirlockSystem by @bobjoe | Stard Title: ArduinoMarsAirlockSystem by @bobjoe | Stardance
Devlogs:
I am working on a small Arduino system involving servo motors an LCD1602 and LEDs. This project mimcs airlock systems used in space shuttles. Right now the project has three different systems, Safe, Caution, and Airlock. Things that I’m thinking about adding to this project : DHT11 (to analyze temperature and airlock during dangerous temperatures), Ultrasonic (Detecting any threats), IR sensor module (useful for detection too).
Ships:
I made an Airlock system that opens the door, slowly closes the door, and locks the door. Originally I had a few problems with the project. I actually wanted to give it two more sensors, an Ultrasonic sensor and DHT11 sensor. Unfortunately the DHT11 sensor wasn’t working and the Ultrasonic Sensor was broken. I decided to add LEDs to distinguish all 3 systems. Then I realized my LCD1602 wasn’t working, so I tried rewriting that portion of code but it still didn’t work. I downloaded some installations on Arduino IDE and it still didn’t work. Then I realized I needed a potentiometer, and when I added it, it worked. I also ran into a problem with my servo motor not being calibrated to the same amount of degrees each time, I fixed it by rewriting the code to calibrate it to 0 degrees everytime the code runs. Now that I’ve ran into these problems, hopefully it will be easier to make hardware next time....
|
1793282054.9561958
|
1793368454.9561958
|
|
20504
|
i'm making a macropad yay! by @dylpickle | Sta i'm making a macropad yay! by @dylpickle | Stardance...
|
dylpickle
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-24T04:13:42Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is my project for the “Hackpad” mission! This was my first time using KiCAD, uploading a repository, and coding using python. I also had very little CAD experience before pursuing this project, so I kinda went in blind (it all worked out in the end!). I made this hackpad with the intent of having buttons that could be modified to open some of my most used apps such as youtube music. I had a lot of fun messing around and making my first hack club project. I’m looking forward to assembly, and I’m super excited to start my next project!", "repo": "https://github.com/orbittheworldd/building-a-macropad", "demo": ""}]...
|
[{"post_id": 14864, "ts": "202 [{"post_id": 14864, "ts": "2026-06-24T04:09:43Z", "hours": 1.0444, "text": "Ready for shipment yay! I finally finished my repository (I struggled) and should have all the correct files for submission! This was such a fun project and definitely learned a lot. Hopefully assembly isn’t too difficult…"}, {"post_id": 14177, "ts": "2026-06-23T05:14:29Z", "hours": 5.7397, "text": "Finally finished everything but my repository! It’s been a while since I’ve written a devlog (oops), and a LOT has changed. I finally finished the CAD and polished it off, and then moved on to writing the code!! I really struggled with coding because I know basically nothing about python, but I was able to figure it out! Attached below are screenshots of the case and the full render of the macropad!"}, {"post_id": 10447, "ts": "2026-06-17T05:34:49Z", "hours": 1.4392, "text": "Micropad Log #1 Making progress on my micropad! This was my first time every designing a PCB, and it surprisingly didn’t take that long (yay!). I also began CADing the 3dprinted shell of the macropad, and will probably finish that in my second devlog (I’m very bad at CAD so please excuse my horrific design). On the macropad itself, there will be a small display that will show whatever song I’m listening to. The four keys will be tied to some commonly used apps of mine (discord, youtube music, etc.) I haven’t fully decided if I also want to make some custom keycaps, but it would be cool. Please give any suggestions or any feedback if you see major errors. Thank you!"}]...
|
Title: i'm making a macropad yay! by @dylpickl Title: i'm making a macropad yay! by @dylpickle | Stardance
Devlogs:
Micropad Log #1 Making progress on my micropad! This was my first time every designing a PCB, and it surprisingly didn’t take that long (yay!). I also began CADing the 3dprinted shell of the macropad, and will probably finish that in my second devlog (I’m very bad at CAD so please excuse my horrific design). On the macropad itself, there will be a small display that will show whatever song I’m listening to. The four keys will be tied to some commonly used apps of mine (discord, youtube music, etc.) I haven’t fully decided if I also want to make some custom keycaps, but it would be cool. Please give any suggestions or any feedback if you see major errors. Thank you!
Finally finished everything but my repository! It’s been a while since I’ve written a devlog (oops), and a LOT has changed. I finally finished the CAD and polished it off, and then moved on to writing the code!! I really struggled with coding because I know basically nothing about python, but I was able to figure it out! Attached below are screenshots of the case and the full render of the macropad!
Ready for shipment yay! I finally finished my repository (I struggled) and should have all the correct files for submission! This was such a fun project and definitely learned a lot. Hopefully assembly isn’t too difficult…
Ships:
This is my project for the “Hackpad” mission! This was my first time using KiCAD, uploading a repository, and coding using python. I also had very little CAD experience before pursuing this project, so I kinda went in blind (it all worked out in the end!). I made this hackpad with the intent of having buttons that could be modified to open some of my most used apps such as youtube music. I had a lot of fun messing around and making my first hack club project. I’m looking forward to assembly, and I’m super excited to start my next project!...
|
1793138111.922316
|
1793224511.922316
|
|
20534
|
Sideline by @IshanS | Stardance
|
IshanS
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-12T19:39:04Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Sideline is an AI-powered coaching assistant that helps sports coaches capture voice observations during games without taking their eyes off the action. Coaches can quickly voice-record notes, which are transcribed and organized into actionable insights for film review and time-outs. The biggest challenge was designing a workflow that coaches could actually use in the middle of a match while integrating speech recognition and AI summarization. I’m most proud that our app has already been tested by our school’s varsity volleyball team during live playoff matches, and their feedback has already changed how we’re improving the product. If you’d like to test it, create a game session, record a few coaching observations, and explore the AI-generated summaries. We’d love to hear your feedback!", "repo": "https://github.com/IshanTheCoder/sideline", "demo": "https://sideline-ai.pages.dev/"}]...
|
[{"post_id": 26900, "ts": "202 [{"post_id": 26900, "ts": "2026-07-11T23:01:47Z", "hours": 1.4336, "text": "Over the past few months, my friend Sid and I have been building Sideline, an AI-powered coaching assistant for sports teams. The idea came from a simple question: How do coaches remember everything they notice during a game? During every volleyball rally, there are dozens of tiny observations (ie blocking timing, serve receive, positioning, communication) but once the match ends, many of those details disappear. We wondered if there was a faster way than clipboards or typing notes. So we built Sideline. During a match, coaches can quickly record voice observations. After the game, those recordings are automatically transcribed (using Whisper) and organized into summaries (using Groq) they can review or share with their team. The coolest part is that we’ve already had our school’s volleyball coaching staff test it during real playoff matches. One surprising thing we learned is that they used it less for player feedback and more for tracking opponent weaknesses, which we didn’t expect. We’re joining Hack Club Stardance to keep improving the app and continue learning modern web development. Looking forward to sharing our progress over the next few weeks. Note: we just made our landing page! Find it at: https://sideline-ai.pages.dev/ ."}]...
|
Title: Sideline by @IshanS | Stardance
Devlogs:
O Title: Sideline by @IshanS | Stardance
Devlogs:
Over the past few months, my friend Sid and I have been building Sideline, an AI-powered coaching assistant for sports teams. The idea came from a simple question: How do coaches remember everything they notice during a game? During every volleyball rally, there are dozens of tiny observations (ie blocking timing, serve receive, positioning, communication) but once the match ends, many of those details disappear. We wondered if there was a faster way than clipboards or typing notes. So we built Sideline. During a match, coaches can quickly record voice observations. After the game, those recordings are automatically transcribed (using Whisper) and organized into summaries (using Groq) they can review or share with their team. The coolest part is that we’ve already had our school’s volleyball coaching staff test it during real playoff matches. One surprising thing we learned is that they used it less for player feedback and more for tracking opponent weaknesses, which we didn’t expect. We’re joining Hack Club Stardance to keep improving the app and continue learning modern web development. Looking forward to sharing our progress over the next few weeks. Note: we just made our landing page! Find it at: https://sideline-ai.pages.dev/ .
Ships:
Sideline is an AI-powered coaching assistant that helps sports coaches capture voice observations during games without taking their eyes off the action. Coaches can quickly voice-record notes, which are transcribed and organized into actionable insights for film review and time-outs. The biggest challenge was designing a workflow that coaches could actually use in the middle of a match while integrating speech recognition and AI summarization. I’m most proud that our app has already been tested by our school’s varsity volleyball team during live playoff matches, and their feedback has already changed how we’re improving the product. If you’d like to test it, create a game session, record a few coaching observations, and explore the AI-generated summaries. We’d love to hear your feedback!...
|
1793300129.190712
|
1793386529.190712
|
|
20590
|
Macropad by @Sealflux | Stardance
|
Sealflux
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T14:00:15Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "8-key macropad with OLED, rotary encoder, and RGB LEDs. The most challenging part was routing traces efficiently without getting fried by the DRC. I just need the kit now.", "repo": "", "demo": ""}]...
|
[{"post_id": 23920, "ts": "202 [{"post_id": 23920, "ts": "2026-07-07T03:56:18Z", "hours": 3.15, "text": "Finished everything"}, {"post_id": 14952, "ts": "2026-06-24T09:06:43Z", "hours": 2.3003, "text": "Basically started the macropad. Added a switch matrix, OLED along with RGB LEDs. The 3 am motivation is real. I will finish the routing/clean it up later. I also need to model the case in fusion360."}]...
|
Title: Macropad by @Sealflux | Stardance
Devlogs: Title: Macropad by @Sealflux | Stardance
Devlogs:
Basically started the macropad. Added a switch matrix, OLED along with RGB LEDs. The 3 am motivation is real. I will finish the routing/clean it up later. I also need to model the case in fusion360.
Finished everything
Ships:
8-key macropad with OLED, rotary encoder, and RGB LEDs. The most challenging part was routing traces efficiently without getting fried by the DRC. I just need the kit now....
|
1793292767.9410286
|
1793379167.9410286
|
|
20618
|
Haptic Drift by @anuththara | Stardance
|
anuththara
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T13:38:06Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Haptic Drift - Shipping Update A new update is live. This update focuses on improving the overall driving feel with better physics tuning, smoother performance, and more responsive haptic feedback. I’ve also made a number of small improvements behind the scenes to make the experience feel more polished. There’s still plenty more planned, so if you try it out, I’d love to hear what you think and what you’d like to see next.", "repo": "https://github.com/anuththara2007-W/Haptic-Drift", "demo": "https://awdsa.netlify.app/"}]...
|
[{"post_id": 16904, "ts": "202 [{"post_id": 16904, "ts": "2026-06-27T13:36:02Z", "hours": 0.7942, "text": "Haptic Drift - Devlog 2 The past few days have mostly been about making the game feel better rather than adding flashy features. One of the biggest changes is that the haptic system is no longer just individual vibration events. It’s starting to behave more like a layer of feedback that reacts to what’s happening while you drive. Instead of only vibrating during crashes, different driving situations now have their own distinct feel. High speed, drifting, braking, and impacts each produce different patterns, making the car feel more connected to the road. I’ve also been tuning the driving physics. Small adjustments to steering, grip, and drift transitions have made the car much more predictable without removing the challenge. It’s surprising how much difference tiny changes can make. Performance has been another focus. Since the game runs entirely in the browser, keeping everything smooth on mobile devices is just as important as adding new mechanics. I’ve been cleaning up the update loop and reducing unnecessary work each frame. I’m still collecting feedback from different devices because browser support for haptics is anything but consistent. Android has been working well, but I’m especially interested in hearing from iPhone users to see how the experience compares. What’s Next More road variety and environments Better visual effects while drifting Improved UI for mobile More satisfying sound design Additional gameplay mechanics beyond endless driving The project is slowly becoming the racing experience I originally imagined. There are still plenty of rough edges, but each update makes the game feel less like a prototype and more like an actual game. Devlog 3 will probably be where the visuals start catching up with the gameplay."}, {"post_id": 11978, "ts": "2026-06-19T15:36:04Z", "hours": 3.3011, "text": "Haptic Drift - Devlog 1 I wanted to experiment with something different: a browser racing game that uses haptics to make the gameplay physically feel alive on your phone. The entire game is currently built using HTML, CSS, and JavaScript . So far it includes: Procedural endless roads Car physics, drifting, and collisions Dynamic sound generation Mobile and desktop controls Haptic feedback integration The interesting part is the haptics. On Android devices , vibrations are currently working and are triggered by gameplay events like crashes, drifting, braking, nitro boosts, and speed changes. I haven’t properly tested iOS yet, so feedback from iPhone users would be really helpful since browser haptic support behaves differently across devices. This is also my first time building a game around haptics instead of treating vibration as an afterthought. The goal isn’t to make another simple browser game, but to see how immersive a racing experience can become using only code. It’s still early and there’s still a lot to improve, but the foundation is finally there. If you test it, I’d love some feedback: Does the haptic feedback feel good? Is it too strong or too weak? Does the driving feel responsive? Is the UI comfortable on mobile? Does it actually feel fun? This is only Devlog 1 . There’s still a long road ahead."}]...
|
Title: Haptic Drift by @anuththara | Stardance
De Title: Haptic Drift by @anuththara | Stardance
Devlogs:
Haptic Drift - Devlog 1 I wanted to experiment with something different: a browser racing game that uses haptics to make the gameplay physically feel alive on your phone. The entire game is currently built using HTML, CSS, and JavaScript . So far it includes: Procedural endless roads Car physics, drifting, and collisions Dynamic sound generation Mobile and desktop controls Haptic feedback integration The interesting part is the haptics. On Android devices , vibrations are currently working and are triggered by gameplay events like crashes, drifting, braking, nitro boosts, and speed changes. I haven’t properly tested iOS yet, so feedback from iPhone users would be really helpful since browser haptic support behaves differently across devices. This is also my first time building a game around haptics instead of treating vibration as an afterthought. The goal isn’t to make another simple browser game, but to see how immersive a racing experience can become using only code. It’s still early and there’s still a lot to improve, but the foundation is finally there. If you test it, I’d love some feedback: Does the haptic feedback feel good? Is it too strong or too weak? Does the driving feel responsive? Is the UI comfortable on mobile? Does it actually feel fun? This is only Devlog 1 . There’s still a long road ahead.
Haptic Drift - Devlog 2 The past few days have mostly been about making the game feel better rather than adding flashy features. One of the biggest changes is that the haptic system is no longer just individual vibration events. It’s starting to behave more like a layer of feedback that reacts to what’s happening while you drive. Instead of only vibrating during crashes, different driving situations now have their own distinct feel. High speed, drifting, braking, and impacts each produce different patterns, making the car feel more connected to the road. I’ve also been tuning the driving physics. Small adjustments to steering, grip, and drift transitions have made the car much more predictable without removing the challenge. It’s surprising how much difference tiny changes can make. Performance has been another focus. Since the game runs entirely in the browser, keeping everything smooth on mobile devices is just as important as adding new mechanics. I’ve been cleaning up the update loop and reducing unnecessary work each frame. I’m still collecting feedback from different devices because browser support for haptics is anything but consistent. Android has been working well, but I’m especially interested in hearing from iPhone users to see how the experience compares. What’s Next More road variety and environments Better visual effects while drifting Improved UI for mobile More satisfying sound design Additional gameplay mechanics beyond endless driving The project is slowly becoming the racing experience I originally imagined. There are still plenty of rough edges, but each update makes the game feel less like a prototype and more like an actual game. Devlog 3 will probably be where the visuals start catching up with the gameplay.
Ships:
Haptic Drift - Shipping Update A new update is live. This update focuses on improving the overall driving feel with better physics tuning, smoother performance, and more responsive haptic feedback. I’ve also made a number of small improvements behind the scenes to make the experience feel more polished. There’s still plenty more planned, so if you try it out, I’d love to hear what you think and what you’d like to see next....
|
1793220973.0791297
|
1793307373.0791297
|
|
20627
|
noctOS by @Kaorii | Stardance
|
Kaorii
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T07:16:31Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "An OS that has the iOS aesthetics and works inside the web browser!", "repo": "https://github.com/kaorii-ako/noctOS", "demo": "https://noct-os.vercel.app/os"}]...
|
[{"post_id": 11146, "ts": "202 [{"post_id": 11146, "ts": "2026-06-18T07:14:45Z", "hours": 0.34, "text": "v3 and final. https://noct-os.vercel.app/os made safari work (kinda) and improved terminal and main vibes"}, {"post_id": 11127, "ts": "2026-06-18T06:25:20Z", "hours": 0.2758, "text": "v2 with bug fixes and stuff added"}, {"post_id": 10618, "ts": "2026-06-17T13:46:21Z", "hours": 0.3408, "text": "This is the first variation of the OS"}]...
|
Title: noctOS by @Kaorii | Stardance
Devlogs:
Thi Title: noctOS by @Kaorii | Stardance
Devlogs:
This is the first variation of the OS
v2 with bug fixes and stuff added
v3 and final. https://noct-os.vercel.app/os made safari work (kinda) and improved terminal and main vibes
Ships:
An OS that has the iOS aesthetics and works inside the web browser!...
|
1793224379.4418485
|
1793310779.4418485
|
|
20643
|
Peek by @Shiladitya | Stardance
|
Shiladitya
|
1
|
12.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T06:58:51Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Peek Move files between devices through nothing but a browser tab. Peek is a zero-install, no-account file transfer tool built for the messiest setups — library PCs, lab machines, kiosks, a friend’s laptop, a locked-down work computer. If it has a browser, it can send and receive. Open a tab, scan a code, transfer, walk away. Nothing is left behind. Why Peek You know the moment: you need to get a file onto (or off of) a computer that isn’t yours. No USB stick. No login to your cloud drive. No permission to install anything. Emailing it to yourself feels wrong, and that USB port might be disabled anyway. Peek is the answer to “I just need to move this one file, right now, safely.” What it does 📲 Pair in seconds with a QR code One device opens Peek and picks files. The other device scans the QR — that’s the whole handshake. No usernames, no passwords, no setup. 🔒 Encrypted end-to-end Files are encrypted in your browser before they ever leave. The decryption key lives in the link itself (the part after #) and is never sent to any server. Even the people running Peek can’t see your files. ⚡ Direct when possible, relayed when not When both devices can talk directly, your files take the fast lane — peer to peer. When a network blocks that, Peek falls back to a relay that only ever carries scrambled data. Either way it just works. ↔️ Two-way in one session It’s not one-and-done. Once two devices are paired, files flow both directions — send some over, get some back, all in the same room. ⏳ Temporary by design Sessions expire automatically (60 minutes) and either side can end them instantly. Nothing lingers on the shared computer afterward — no history, no leftover files, no trace. 👀 Peek links — share a file with anyone Generate a short-lived link to a single file. Send it over chat, email, anywhere. PDFs and images preview right in the browser; everything else (zips, notebooks, archives, any file type up to 50MB) downloads securely. Optional “burn after viewing” deletes it the moment it’s opened. 📋 Clipboard sync Need to move a chunk of text, a password, a snippet? Sync the clipboard between the two devices without touching a file at all. Built for risky places ┌──────────────────┬────────────────────────────────────────────────────────────┐ │ │ │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No install │ The receiving side is just a web page. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No account │ Nothing to sign up for, nothing to log into. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No trace │ Sessions self-destruct; nothing saved on the host machine. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ Encrypted always │ Your key stays in your browser, never on a server. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ Short-lived │ Everything expires on a timer, or kill it on demand. │ └──────────────────┴────────────────────────────────────────────────────────────┘ The 3-step flow Pick your files on the sending device. Scan the QR on the receiving device. Transfer, then close. Send, receive, end the session. Done. Peek is for the in-between moments — the borrowed computer, the public terminal, the quick handoff — where every other option is too slow, too permanent, or too risky.", "repo": "https://github.com/Bappaditya-kuilya/Peek", "demo": "https://peekapp.vercel.app"}]...
|
[{"post_id": 10477, "ts": "202 [{"post_id": 10477, "ts": "2026-06-17T06:58:12Z", "hours": 12.1914, "text": "Peek Move files between devices through nothing but a browser tab. Peek is a zero-install, no-account file transfer tool built for the messiest setups — library PCs, lab machines, kiosks, a friend’s laptop, a locked-down work computer. If it has a browser, it can send and receive. Open a tab, scan a code, transfer, walk away. Nothing is left behind. Why Peek You know the moment: you need to get a file onto (or off of) a computer that isn’t yours. No USB stick. No login to your cloud drive. No permission to install anything. Emailing it to yourself feels wrong, and that USB port might be disabled anyway. Peek is the answer to “I just need to move this one file, right now, safely.” What it does 📲 Pair in seconds with a QR code One device opens Peek and picks files. The other device scans the QR — that’s the whole handshake. No usernames, no passwords, no setup. 🔒 Encrypted end-to-end Files are encrypted in your browser before they ever leave. The decryption key lives in the link itself (the part after #) and is never sent to any server. Even the people running Peek can’t see your files. ⚡ Direct when possible, relayed when not When both devices can talk directly, your files take the fast lane — peer to peer. When a network blocks that, Peek falls back to a relay that only ever carries scrambled data. Either way it just works. ↔️ Two-way in one session It’s not one-and-done. Once two devices are paired, files flow both directions — send some over, get some back, all in the same room. ⏳ Temporary by design Sessions expire automatically (60 minutes) and either side can end them instantly. Nothing lingers on the shared computer afterward — no history, no leftover files, no trace. 👀 Peek links — share a file with anyone Generate a short-lived link to a single file. Send it over chat, email, anywhere. PDFs and images preview right in the browser; everything else (zips, notebooks, archives, any file type up to 50MB) downloads securely. Optional “burn after viewing” deletes it the moment it’s opened. 📋 Clipboard sync Need to move a chunk of text, a password, a snippet? Sync the clipboard between the two devices without touching a file at all. Built for risky places ┌──────────────────┬────────────────────────────────────────────────────────────┐ │ │ │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No install │ The receiving side is just a web page. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No account │ Nothing to sign up for, nothing to log into. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No trace │ Sessions self-destruct; nothing saved on the host machine. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ Encrypted always │ Your key stays in your browser, never on a server. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ Short-lived │ Everything expires on a timer, or kill it on demand. │ └──────────────────┴────────────────────────────────────────────────────────────┘ The 3-step flow Pick your files on the sending device. Scan the QR on the receiving device. Transfer, then close. Send, receive, end the session. Done. Peek is for the in-between moments — the borrowed computer, the public terminal, the quick handoff — where every other option is too slow, too permanent, or too risky."}]...
|
Title: Peek by @Shiladitya | Stardance
Devlogs:
P Title: Peek by @Shiladitya | Stardance
Devlogs:
Peek Move files between devices through nothing but a browser tab. Peek is a zero-install, no-account file transfer tool built for the messiest setups — library PCs, lab machines, kiosks, a friend’s laptop, a locked-down work computer. If it has a browser, it can send and receive. Open a tab, scan a code, transfer, walk away. Nothing is left behind. Why Peek You know the moment: you need to get a file onto (or off of) a computer that isn’t yours. No USB stick. No login to your cloud drive. No permission to install anything. Emailing it to yourself feels wrong, and that USB port might be disabled anyway. Peek is the answer to “I just need to move this one file, right now, safely.” What it does 📲 Pair in seconds with a QR code One device opens Peek and picks files. The other device scans the QR — that’s the whole handshake. No usernames, no passwords, no setup. 🔒 Encrypted end-to-end Files are encrypted in your browser before they ever leave. The decryption key lives in the link itself (the part after #) and is never sent to any server. Even the people running Peek can’t see your files. ⚡ Direct when possible, relayed when not When both devices can talk directly, your files take the fast lane — peer to peer. When a network blocks that, Peek falls back to a relay that only ever carries scrambled data. Either way it just works. ↔️ Two-way in one session It’s not one-and-done. Once two devices are paired, files flow both directions — send some over, get some back, all in the same room. ⏳ Temporary by design Sessions expire automatically (60 minutes) and either side can end them instantly. Nothing lingers on the shared computer afterward — no history, no leftover files, no trace. 👀 Peek links — share a file with anyone Generate a short-lived link to a single file. Send it over chat, email, anywhere. PDFs and images preview right in the browser; everything else (zips, notebooks, archives, any file type up to 50MB) downloads securely. Optional “burn after viewing” deletes it the moment it’s opened. 📋 Clipboard sync Need to move a chunk of text, a password, a snippet? Sync the clipboard between the two devices without touching a file at all. Built for risky places ┌──────────────────┬────────────────────────────────────────────────────────────┐ │ │ │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No install │ The receiving side is just a web page. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No account │ Nothing to sign up for, nothing to log into. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No trace │ Sessions self-destruct; nothing saved on the host machine. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ Encrypted always │ Your key stays in your browser, never on a server. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ Short-lived │ Everything expires on a timer, or kill it on demand. │ └──────────────────┴────────────────────────────────────────────────────────────┘ The 3-step flow Pick your files on the sending device. Scan the QR on the receiving device. Transfer, then close. Send, receive, end the session. Done. Peek is for the in-between moments — the borrowed computer, the public terminal, the quick handoff — where every other option is too slow, too permanent, or too risky.
Ships:
Peek Move files between devices through nothing but a browser tab. Peek is a zero-install, no-account file transfer tool built for the messiest setups — library PCs, lab machines, kiosks, a friend’s laptop, a locked-down work computer. If it has a browser, it can send and receive. Open a tab, scan a code, transfer, walk away. Nothing is left behind. Why Peek You know the moment: you need to get a file onto (or off of) a computer that isn’t yours. No USB stick. No login to your cloud drive. No permission to install anything. Emailing it to yourself feels wrong, and that USB port might be disabled anyway. Peek is the answer to “I just need to move this one file, right now, safely.” What it does 📲 Pair in seconds with a QR code One device opens Peek and picks files. The other device scans the QR — that’s the whole handshake. No usernames, no passwords, no setup. 🔒 Encrypted end-to-end Files are encrypted in your browser before they ever leave. The decryption key lives in the link itself (the part after #) and is never sent to any server. Even the people running Peek can’t see your files. ⚡ Direct when possible, relayed when not When both devices can talk directly, your files take the fast lane — peer to peer. When a network blocks that, Peek falls back to a relay that only ever carries scrambled data. Either way it just works. ↔️ Two-way in one session It’s not one-and-done. Once two devices are paired, files flow both directions — send some over, get some back, all in the same room. ⏳ Temporary by design Sessions expire automatically (60 minutes) and either side can end them instantly. Nothing lingers on the shared computer afterward — no history, no leftover files, no trace. 👀 Peek links — share a file with anyone Generate a short-lived link to a single file. Send it over chat, email, anywhere. PDFs and images preview right in the browser; everything else (zips, notebooks, archives, any file type up to 50MB) downloads securely. Optional “burn after viewing” deletes it the moment it’s opened. 📋 Clipboard sync Need to move a chunk of text, a password, a snippet? Sync the clipboard between the two devices without touching a file at all. Built for risky places ┌──────────────────┬────────────────────────────────────────────────────────────┐ │ │ │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No install │ The receiving side is just a web page. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No account │ Nothing to sign up for, nothing to log into. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ No trace │ Sessions self-destruct; nothing saved on the host machine. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ Encrypted always │ Your key stays in your browser, never on a server. │ ├──────────────────┼────────────────────────────────────────────────────────────┤ │ Short-lived │ Everything expires on a timer, or kill it on demand. │ └──────────────────┴────────────────────────────────────────────────────────────┘ The 3-step flow Pick your files on the sending device. Scan the QR on the receiving device. Transfer, then close. Send, receive, end the session. Done. Peek is for the in-between moments — the borrowed computer, the public terminal, the quick handoff — where every other option is too slow, too permanent, or too risky....
|
1793227757.7683728
|
1793314157.7683728
|
|
20676
|
LibrePods by @kavish | Stardance
|
kavish
|
1
|
72.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-08T10:39:14Z", "hours": 72.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "LibrePods is a project that aims to liberate AirPods from Apple’s ecosystem by reverse-engineering and implementing xOS-specific features like ear-detection, conversational awareness, etc. on Android and Linux. This update is about adding a new design system for users who don’t like the iOS look with liquid glass. I have added a design based on Material 3 Expressive, with new typography, and dynamic colors, which feels a lot more native to Android. I also reverse-engineered and added the new Equalizer feature that was announced at WWDC26. I highly suggest anyone looking at this project to have a look at the v1.0.0-rc1 release on GitHub for more screenshots!", "repo": "https://github.com/kavishdevar/librepods", "demo": "https://github.com/kavishdevar/librepods/releases/latest?include_prereleases=true"}]...
|
[{"post_id": 24617, "ts": "202 [{"post_id": 24617, "ts": "2026-07-08T10:22:32Z", "hours": 72.4894, "text": "Instructions to enter demo mode: Install the APK Scroll down and click on Bypass compatibliity check if shown Not supported Close the app and clear from Recents, and re-open the app. Complete the onboarding Long press anywhere outside the reconnect button to enter demo mode Material 3 Expressive I worked on adding a new design system, based on Material 3 for the users who don’t like Apple’s design system/Liquid Glass. High quality audio recording I also added a Recorder which uses AAC-ELD (received over AACP* ). This is of much higher quality than the mSBC or CVSD codecs available over Headset/Handsfree Profile where both directions of streams are of poor quality. This also allows users to use A2DP while recording, meaning high quality playback as well. I also spent a lot of time digging through AOSP code to understand how the audio system works, so that I can make the AAC-ELD microphone stream available to all apps and calls, and not just for recording from the app. Equalizer (WWDC 2026) I also reverse-engineered and implemented the Equalizer that was announced in WWDC26 *Advanced Accessory Control Profile"}]...
|
Title: LibrePods by @kavish | Stardance
Devlogs:
Title: LibrePods by @kavish | Stardance
Devlogs:
Instructions to enter demo mode: Install the APK Scroll down and click on Bypass compatibliity check if shown Not supported Close the app and clear from Recents, and re-open the app. Complete the onboarding Long press anywhere outside the reconnect button to enter demo mode Material 3 Expressive I worked on adding a new design system, based on Material 3 for the users who don’t like Apple’s design system/Liquid Glass. High quality audio recording I also added a Recorder which uses AAC-ELD (received over AACP* ). This is of much higher quality than the mSBC or CVSD codecs available over Headset/Handsfree Profile where both directions of streams are of poor quality. This also allows users to use A2DP while recording, meaning high quality playback as well. I also spent a lot of time digging through AOSP code to understand how the audio system works, so that I can make the AAC-ELD microphone stream available to all apps and calls, and not just for recording from the app. Equalizer (WWDC 2026) I also reverse-engineered and implemented the Equalizer that was announced in WWDC26 *Advanced Accessory Control Profile
Ships:
LibrePods is a project that aims to liberate AirPods from Apple’s ecosystem by reverse-engineering and implementing xOS-specific features like ear-detection, conversational awareness, etc. on Android and Linux. This update is about adding a new design system for users who don’t like the iOS look with liquid glass. I have added a design based on Material 3 Expressive, with new typography, and dynamic colors, which feels a lot more native to Android. I also reverse-engineered and added the new Equalizer feature that was announced at WWDC26. I highly suggest anyone looking at this project to have a look at the v1.0.0-rc1 release on GitHub for more screenshots!...
|
1793138040.0127108
|
1793224440.0127108
|
|
20695
|
Deliverance by @CinnamonRoll | Stardance
|
CinnamonRoll
|
1
|
59.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-21T03:19:19Z", "hours": 59.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Minecraft mod based on stories. It was quite challenging to make it in 26.2, the most recent version. Lack of documentation at the start really made it harder. I hope you find this project fun and interesting. If you playtest this, please be aware of the following: This is not perfect. There may be bugs that I did not catch. Also, I do not have a video to showcase this project. Please refer to the project README. It is still in alpha, so some features are still missing. However, school is starting and I will not have time to work on it for a while so it is going on hiatus.", "repo": "https://github.com/giantruy/deliverance-26.2-v0.1/", "demo": "https://github.com/giantruy/deliverance-26.2-v0.1/releases/tag/alpha-release-v0.1.1"}]...
|
[{"post_id": 51412, "ts": "202 [{"post_id": 51412, "ts": "2026-08-21T03:14:04Z", "hours": 0.3117, "text": "Final touches, forgot some edits earlier"}, {"post_id": 51375, "ts": "2026-08-21T01:09:57Z", "hours": 1.1003, "text": "Added final touches before shipping in alpha development stage."}, {"post_id": 46736, "ts": "2026-08-14T06:25:50Z", "hours": 1.7017, "text": "Just a bit of work, added a new cursed lectern block. It gives all mobs in a surrounding area weakness or weakness II when activated with a runestone or polished runestone"}, {"post_id": 45665, "ts": "2026-08-12T09:21:05Z", "hours": 6.12, "text": "67!!! 6 hours and 7 minutes. I have successfully implemented a new dimension and biome, the Classic Dimension and Classic Biome. Currently halfway through implementing a new Rift Key (to jump dimensions) and Blood Dropper (Undead Summoner)"}, {"post_id": 45068, "ts": "2026-08-11T10:25:03Z", "hours": 10.3769, "text": "Took me 10 hours, but I did it. Custom construct Entity with custom model, and custom altar structure. The lore is coming along well."}, {"post_id": 41144, "ts": "2026-08-05T05:15:04Z", "hours": 0.3117, "text": "Continued working on my trident entity, it hates me so much. I did get it to become loyal though"}, {"post_id": 40508, "ts": "2026-08-04T02:58:51Z", "hours": 1.3147, "text": "The trident shows up as an entity now! Next steps: loyalty, item model"}, {"post_id": 39824, "ts": "2026-08-03T02:24:58Z", "hours": 0.4808, "text": "Continued working on my trident item. I honestly have no idea what I’m doing at this moment, nothing seems to be working."}, {"post_id": 38111, "ts": "2026-07-31T10:18:01Z", "hours": 2.7208, "text": "Part of me despises minecraft modding because of how much they’ve changed from 1.20 to 26.2 😭 Currently still stuck creating a trident."}, {"post_id": 37074, "ts": "2026-07-29T15:38:01Z", "hours": 0.5522, "text": "Working on a new trident item, in the works! Unfortunately not finished yet. It has the ‘bloodletting’ curse infused!"}, {"post_id": 35828, "ts": "2026-07-27T14:51:19Z", "hours": 0.3197, "text": "Did some housekeeping on my files, renamed the Notch Apple to the King’s Apple (it’s part of the lore trust)"}, {"post_id": 35162, "ts": "2026-07-26T12:39:18Z", "hours": 2.2278, "text": "Added a music disc with a song that I felt fitting for the mod: Downed by Ketsa. https://freemusicarchive.org/music/Ketsa/concrete-flowers/downed/"}, {"post_id": 34963, "ts": "2026-07-26T02:53:41Z", "hours": 0.2953, "text": "Successfully ported to 26.2!"}, {"post_id": 34407, "ts": "2026-07-25T02:54:37Z", "hours": 0.485, "text": "Currently updating my mod to 26.2, its so hard 😭. Why do they change so much every update 😭"}, {"post_id": 33930, "ts": "2026-07-24T07:43:15Z", "hours": 0.4269, "text": "Sorry for this short devlog, I didn’t get to implement much this time. I’m adding a wolf-inspired trident to the game now, so I’ve started by adding a fang item. I also created a spawn egg for the Savage zombie I made yesterday!"}, {"post_id": 33400, "ts": "2026-07-23T09:58:32Z", "hours": 4.3242, "text": "I added a cute ’lil zombie entity! Also a new holy sword that SMITES all undead mobs. I also removed some items I deemed useless."}, {"post_id": 32885, "ts": "2026-07-22T10:34:02Z", "hours": 1.5394, "text": "I added a rendering magic circle on my custom crafting table! I went through many rendering errors, but I finally got a small magic circle rotating on my custom crafting table."}, {"post_id": 32265, "ts": "2026-07-21T10:22:07Z", "hours": 2.4778, "text": "Implemented a new STACKED golden apple item: The NOTCH APPLE!! Also created a new particle effect and particle, which will be implemented in the future."}, {"post_id": 31645, "ts": "2026-07-20T06:49:10Z", "hours": 3.6636, "text": "ADDED A CRAFTING SYSTEM AFTER HOURS OF DEBUGGING!!!"}, {"post_id": 31233, "ts": "2026-07-19T14:01:39Z", "hours": 1.1986, "text": "added a menu! custom crafting screen is now added"}, {"post_id": 31072, "ts": "2026-07-19T05:23:47Z", "hours": 2.4139, "text": "Working on adding a menu for a custom crafting table"}, {"post_id": 30041, "ts": "2026-07-17T09:38:19Z", "hours": 2.6356, "text": "Added a lore book and an electrocution damage effect that scales depending of how submerged in water you are"}, {"post_id": 13331, "ts": "2026-06-21T20:50:53Z", "hours": 1.2708, "text": "tried implementing a gui again 😭 didn’t work"}, {"post_id": 12372, "ts": "2026-06-20T06:05:48Z", "hours": 1.9528, "text": "Attemped (and failed) to add a working GUI. I got it to show up but could not get it to be able to craft."}, {"post_id": 12252, "ts": "2026-06-20T00:33:34Z", "hours": 2.4289, "text": "I added new recipes and textures! You can now upgrade diamond tools to runestone tools, with a craftable runestone upgrade template."}, {"post_id": 11829, "ts": "2026-06-19T08:25:42Z", "hours": 1.5642, "text": "Added new recipes"}, {"post_id": 11797, "ts": "2026-06-19T06:11:44Z", "hours": 1.2781, "text": "added loot tables, tried figuring out ore gen"}, {"post_id": 11149, "ts": "2026-06-18T07:18:22Z", "hours": 0.7783, "text": "Attempted adding block drops, added basic block drops"}, {"post_id": 11001, "ts": "2026-06-18T00:52:16Z", "hours": 1.6517, "text": "worked on implementing new blocks, added some block textures"}, {"post_id": 10525, "ts": "2026-06-17T08:48:39Z", "hours": 0.7611, "text": "Added some first items to the mod!! Created a plan for the story"}]...
|
Title: Deliverance by @CinnamonRoll | Stardance
D Title: Deliverance by @CinnamonRoll | Stardance
Devlogs:
Added some first items to the mod!! Created a plan for the story
worked on implementing new blocks, added some block textures
Attempted adding block drops, added basic block drops
added loot tables, tried figuring out ore gen
Added new recipes
I added new recipes and textures! You can now upgrade diamond tools to runestone tools, with a craftable runestone upgrade template.
Attemped (and failed) to add a working GUI. I got it to show up but could not get it to be able to craft.
tried implementing a gui again 😭 didn’t work
Added a lore book and an electrocution damage effect that scales depending of how submerged in water you are
Working on adding a menu for a custom crafting table
added a menu! custom crafting screen is now added
ADDED A CRAFTING SYSTEM AFTER HOURS OF DEBUGGING!!!
Implemented a new STACKED golden apple item: The NOTCH APPLE!! Also created a new particle effect and particle, which will be implemented in the future.
I added a rendering magic circle on my custom crafting table! I went through many rendering errors, but I finally got a small magic circle rotating on my custom crafting table.
I added a cute ’lil zombie entity! Also a new holy sword that SMITES all undead mobs. I also removed some items I deemed useless.
Sorry for this short devlog, I didn’t get to implement much this time. I’m adding a wolf-inspired trident to the game now, so I’ve started by adding a fang item. I also created a spawn egg for the Savage zombie I made yesterday!
Currently updating my mod to 26.2, its so hard 😭. Why do they change so much every update 😭
Successfully ported to 26.2!
Added a music disc with a song that I felt fitting for the mod: Downed by Ketsa. https://freemusicarchive.org/music/Ketsa/concrete-flowers/downed/
Did some housekeeping on my files, renamed the Notch Apple to the King’s Apple (it’s part of the lore trust)
Working on a new trident item, in the works! Unfortunately not finished yet. It has the ‘bloodletting’ curse infused!
Part of me despises minecraft modding because of how much they’ve changed from 1.20 to 26.2 😭 Currently still stuck creating a trident.
Continued working on my trident item. I honestly have no idea what I’m doing at this moment, nothing seems to be working.
The trident shows up as an entity now! Next steps: loyalty, item model
Continued working on my trident entity, it hates me so much. I did get it to become loyal though
Took me 10 hours, but I did it. Custom construct Entity with custom model, and custom altar structure. The lore is coming along well.
67!!! 6 hours and 7 minutes. I have successfully implemented a new dimension and biome, the Classic Dimension and Classic Biome. Currently halfway through implementing a new Rift Key (to jump dimensions) and Blood Dropper (Undead Summoner)
Just a bit of work, added a new cursed lectern block. It gives all mobs in a surrounding area weakness or weakness II when activated with a runestone or polished runestone
Added final touches before shipping in alpha development stage.
Final touches, forgot some edits earlier
Ships:
I made a Minecraft mod based on stories. It was quite challenging to make it in 26.2, the most recent version. Lack of documentation at the start really made it harder. I hope you find this project fun and interesting. If you playtest this, please be aware of the following: This is not perfect. There may be bugs that I did not catch. Also, I do not have a video to showcase this project. Please refer to the project README. It is still in alpha, so some features are still missing. However, school is starting and I will not have time to work on it for a while so it is going on hiatus....
|
1793141767.9113986
|
1793228167.9113986
|
|
20724
|
CRM by @F3rro_32 | Stardance
|
F3rro_32
|
1
|
124.74
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-14T16:34:42Z", "hours": 115.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "CRM An open-source CRM for Italian small businesses: contacts, companies, leads, quotes, orders, invoices with VAT, tickets, email campaigns, NPS surveys, reports and a customer portal. It started as a way to manage clients for a friend’s startup and became a working and valuable project. TRY IT (no install) https://crm.alessio.hackclub.app email: [email protected] password: HackClub-Demo-2026! The demo has full access and realistic fake data, so feel free to click everything, create, edit and delete. The data resets occasionally. Outgoing email is switched off on the demo. HEADS UP: the interface is in Italian. Use the translate widget in the corner of the app (or your browser’s translator) to read it in English. Real i18n is on my roadmap, sorry! WHAT TO LOOK AT A quote with line items, discounts and VAT by rate, and the “Print PDF” button. PDFs come from HTML templates you can edit, with a live preview on your last real document. A customer accepting a quote from a signed link, without an account. Full-text search across every module (PostgreSQL). Italian e-invoicing: it builds the FatturaPA XML and validates it against the official government XSD before saving. Invoices lock once sent to the SDI. The MCP server: an AI assistant can use the CRM through an API key, with seven generic tools that work on all 34 modules and respect permissions. 2FA (TOTP) with recovery codes, secrets encrypted at rest, installable PWA. HOW IT WORKS There is no “contacts” or “companies” table. One generic Record entity stores its fields in a jsonb column, and an ObjectType + FieldDef describe each module (39 field types). Adding a module is a configuration record, not a migration or a new controller. Permissions are checked per module and action at runtime. You can have more info in the README, so please check it. I hope you appreciate this project :)", "repo": "https://github.com/AlessioFerrari8/crm", "demo": "https://crm.alessio.hackclub.app"}]...
|
[{"post_id": 81469, "ts": "202 [{"post_id": 81469, "ts": "2026-10-21T11:47:01Z", "hours": 9.7417, "text": "Hey guys, what’s up? I’m finally in the last phase of getting my driving license, so that’s taking up some of my time too. The CRM is now online at crm.alessio.hackclub.app . The VPS has very little RAM, so I build the Docker images locally and transfer them to the server using docker save over SSH. It’s not the fanciest deployment process, but it works with the resources I have, so I’ll stick to it for now. One of the main things I worked on was the customer portal . The backend from last week finally has a frontend: customers can log in, see their tickets and documents, open requests, reply to messages, download PDFs and accept quotes. I also made sure that internal notes stay internal. Notes now have a Visible to customer checkbox, which is disabled by default. The portal only shows notes explicitly marked as visible, so there’s less risk of accidentally exposing something that should stay private. Another feature I added is Google Calendar import . It’s read-only for now, so the CRM can import events without modifying anything in your Google account. Events are created through the same service as normal CRM records, meaning workflows and the audit log still work as expected. Sync runs every 15 minutes, and if something goes wrong with an account, it won’t stop the others from syncing. I also started replacing the Google Translate workaround with proper internationalization (i18n). The translation system is in place, including support for parameters and locale-aware dates and numbers. The dictionary is type-checked, too, so missing English translations can be caught at compile time. There’s still a lot of work here: around 1,200 strings need to be translated by hand. It’s not the most exciting task, but I’d rather have proper translations than rely on Google Translate forever. Obviously that’s my opionion. I also started working on public registration, but it’s not ready yet. There’s one important limitation: the CRM currently has a single shared workspace, so everyone who registers would see the same data. Registration will stay disabled unless explicitly enabled until I decide how to handle that properly. That’s because the idea is to have 1 single DB for each workspace, since the CRM should be self-hosted. There’s still work to do, but the CRM is getting closer to the version I wanted to ship. See you in the next devlog!"}, {"post_id": 79560, "ts": "2026-10-14T16:31:36Z", "hours": 2.4331, "text": "Hey guys, how’s going? This will be a short devlog, and it’s the one before the shipping. I decided to ship the CRM, even if it’s not completely finished. That’s because I still have to do lots of things, but now I have a working product, so, since the changes I have to make are complementary. Unfortunately, I have a big issue: the whole interface is in Italian. The app is made for Italian small businesses (FatturaPA, VAT, SDI…), but if you come from Stardance you can’t read a single menu. Real i18n is still on my list and it is a big job, so for now I added the Google Translate widget in the corner of the app. If your browser is in English it starts translating by itself, otherwise you pick English from the selector. It’s not pretty, but it makes the demo usable today instead of “someday”. I had to widen the CSP in nginx for it, and I loaded the script as an external file so I didn’t need a second hash. I also fixed the README and cleaned the repo. Now everything should work fine, or at least let’s hope so. I hope you enjoy the product."}, {"post_id": 78818, "ts": "2026-10-11T17:58:49Z", "hours": 8.3728, "text": "Hey guys, how’s everythings going? I’m doing pretty well. As always I have lots of things to do, but I still have plenty of time for coding. School is demanding, and preparing for my driving license is also tough, but I’m managing everything little by little. Last time I ended up with an app that wouldn’t even start. Luckily, I fixed all those errors, and all 258 tests are now green and passing on the PostgreSQL db. After that, I added new features. First of all I worked on NPS surveys and quote acceptance. Customers can now receive surveys and answer them through a public link. They can also accept quotes directly from a link, without needing an account. I also made sure these features work with the existing workflows, so automations can still do their job properly. Another interesting addition is the MCP server. AI agents can now interact with the CRM through an API key. Instead of creating a separate set of tools for every module, I went with seven generic tools that can work across all 34 modules. This should make it easier for AI models to understand which actions they can perform, while keeping the CRM’s existing permissions and security rules in place. I also improved search quite a bit. Before, it mostly looked at record titles. Now it uses PostgreSQL full-text search to find relevant information inside the actual record data and rank the results. The audit history is also much easier to read, with related record IDs replaced by their actual titles. I worked on a couple of smaller but important things, too. The trash can now properly handle related files and records when permanently deleting something, while protecting fiscal documents that must be kept for ten years. Finally, I started working on the customer portal. It now has its own backend authentication and permission system, separate from the employee login. Customers will only be able to access records they’re actually allowed to see. The backend is ready, but I still need to connect the frontend pages and routes. There’s still quite a bit to do, but I’m getting closer to the first complete version of the CRM. See you in the next devlog!"}, {"post_id": 77578, "ts": "2026-10-07T15:01:58Z", "hours": 9.0769, "text": "Hey guys, how’s going? I have plenty of things to do, but coding is still one of my favorite activities, so I always try to save some time for it.This time I worked again on FatturaPA, which is the Italian electronic invoice.What I did, is that now, first of all, the CRM can now generate the FatturaPa XML directly from an invoice and validate it against the official XSD, before saving it. I also added the whole invoice lifecycle, from draft, to setn, delivered, accepted or rejected. The CRM can read the recepits from the SDI and show ufseful information when something goes wrong.Another important change is that invoices now become locked once they’re sent to the SDI. If something needs to be changed, the correct way is to create a credit note instead. This is much efficient in my opinion.I also started working on the SDI integration itself. For now there’s only a manual transport, but the system is built so that adding an actual provider later shouldn’t require changing the rest of the CRM. I did it this way, so I can decide which provider use, and not have to change everything.Besides invoicing, I added time tracking. You can start a timer from the top bar and see your hours directly on records. Timers also automatically close after a maximum amount of time, so nobody ends up with a 80-hour ticket because they forgot to stop it.Finally, I worked on email campaigns. You can create a campaign from a saved filter, send emails through a queue and manage unsubscribes. I also added some protections against things like open redirects and accidental unsubscribes.And now, the honest part: before writing this devlog, I ran the tests and guess what, the app didn’t even start.I used claude for debugging, cause I wans’t finding the error. Silly me, it was just a typo."}, {"post_id": 75572, "ts": "2026-09-30T13:58:27Z", "hours": 10.0467, "text": "Hey guys, how’s everything going? I’m alright. I’m so glad hackclub postponed the end of stardance, I have still another month to 1. finish this project 2. do other projects I had on my mind for such a long time. Before doing this devlog, I had to use claude to debug my work, because I had some errors I didn’t understand (I was using a class created for a test in the normal “code”), so bad :( and also other small issues. Lately I worked on one of the most significat features for me, which is 2FA . As my network teacher says \"zero trust, because the world is a place full of bastards\" . 2FA is one of the techniques I use to follow this approach. Basically, now you can press “Enable” in your preferences, scan the QR code with any authenticator app (f.e google), or just type the secret by hand, because half the people can’t frame a QR code at the first time, lol. You also have to confirm with a code. At login, if 2FA is on, there’s a second step for the six digits. You also get ten recovery codes that you can copy or download, shown only once. Turning it off asks for your password, so a stolen open session can’t remove this precaution. You’re probably wondering: are the secrets encrypted? Yes, they are. I mostly use AES-GCM, because it’s pretty simple, but also secure, so it’s the better compromise. The TOTP secret and the mailbox passwords are stored encrypted with AES-GCM. The key lives in an env variable, not in the db, so a database dump alone isn’t enough to generate codes or read someone’s email. I also turned the crm in a PWA . You can install it on your phone or desktop, it has its own icon and window, and when I deploy a new verion, it tells you to reload, instead of silently serving you the old one from cache (it also checks every 6 hours, maybe I’m gonna change it to 10, idk, for the tab you leave open for days) Like in every other devlog, I made some tests and updated the docs. The report engine now has tests against a real Postgres started in docker, and the repo finally has a real README (it’s not finished, just with some basic information, claude, thanks for the suggestion of making it). Oh, I nearly forgot. I also worked on emails. Now I’m currently working on the Italian electronic invoice, which is called FatturaPA. The crm builds the XML from an invoice, and the first test I wrote checks it against the official government XSD: if it doesn’t pass, it isn’t saved. I think I’m gonna study a bit of english / american law, to allow people out of Italy to use this app as well. I hope you like my product, see you soon"}, {"post_id": 71912, "ts": "2026-09-21T19:15:14Z", "hours": 9.0044, "text": "Hey guys, how have you been doing lately? I’m alright. I’m still getting my driver license, so I don’t have much time to code. Last devlog was all about the PDF engine on the backend, and I closed it saying that the UI was next. Here it is: Print button : I added a print button Print PDF on quotes, orders, delivery notes and invoices. The file is downloaded with the document number as its name, so you get for example 2025-47.pdf and not just document.pdf Template editor : I also added to settings a new tab called “Print”. On the left there’s the list of templates, on the right the HTML, the page size and the margin. The preview renders the last real document of that module instead of a fake one, so what you can see is exactly what your customer receives. The default templates can’t be edited you duplicate them: the seeder rewrites them at every boot, so any change would silently disapper on the next restart. I preferred to say it in the interface rather than let someoune lose an afternoon of work. Company data : The company settings now hold also the legal name, VAT number, tax code, address and contact line. That’s what the PDF header prints, and without them the header comes out empty. VAT that adds up to the cent The header discount is spread across the VAT rates and every share gets rounded, so the sum of the shares could end up one or two cents away from the total. On a quote nobody would ever notice. On an electronic invoice it’s rejection 00423. Now the rounding leftover goes on the last rate, so taxable + VAT = total, always. Tests on a real db : The report engine builds SQL at runtime, and mocking a database proves nothing, so its tests now start a throwaway Postgres in Docker and run against it: filters, grouping, ordering and counting. Two bugs closed : Merging two records didn’t look at the bin, so a deleted record could be merged into a live one. And editing a saved report answered 405, because the frontend was sending PUT to an endpoint that only has POST. Right now I’m working on the 2FA (for those who don’t know, the 2 factor auth). I’m writing the TOTP myself instead of pulling in a library: it’s an HMAC-SHA1 of the 30 second counter, and the six digits come out of the dynamic truncation described in the RFC. The secret is encrypted in the database with AES-GCM, because someone who can read the db must not be able to generate the codes, otherwise a second factor is just a second password. There are ten recovery codes, stored hashed and usable once each, and the last accepted counter is saved, so the same code can’t be replayed during its 30 seconds. The tests are the official RFC 6238 vectors: a TOTP written at home always “works” until you compare it with a real auth app, and at that point it’s too late to find out. Two things I know are missing: the second factor has no interface yet, there’s no page to scan the QR code from, and the mailbox that turns incoming emails into tickets is only half written. See you soon, the end of this project is near."}, {"post_id": 67216, "ts": "2026-09-13T08:29:02Z", "hours": 8.6217, "text": "Hey guys, how’s it going? I hope you’re all doing well. School started here in Italy, so I have less time compared to August. I also have to get my driver’s license, so I’m studying for that too. Unfortunately, coding isn’t the first thing I do every day anymore. I’m still working on the PDF generator. Last time I mentioned that relation fields were showing raw IDs and that document totals weren’t formatted properly. I fixed both of those, but I’ll get back to them later. About the PDF The template is HTML, and it lives in the DB. I didn’t hardcode the layout in Java. I created a PdfTemplate entity that stores the HTML, page size and margins. There is one default template for each document type: quote, order, delivery note and invoice. Thymeleaf fills the template with the document data, and OpenHTMLToPDF + PDFBox generate the PDF. Since the HTML is provided by the user, I also had to think about security. A template could try to load something like file:///etc/passwd or access an internal URL. Because of this, external protocols are disabled and only data: URIs are allowed. Page sizes are also checked against a whitelist. I also had to deal with the fact that HTML isn’t always valid XML. OpenHTMLToPDF expects XML, so I use jsoup to normalize the HTML first. Otherwise, perfectly normal HTML can cause a SAXParseException . And finally, fonts have to be embedded in the PDF. Without including DejaVu Sans in the jar, the PDF doesn’t render correctly. VAT summary I also worked on the VAT summary. Lines are grouped by VAT rate, shipping is added to the highest rate, and the document discount is distributed across the rates instead of being applied at the end. VAT is then calculated on the discounted amounts, so everything adds up correctly: taxable + VAT = total This actually fixed a bug where VAT was calculated before applying the document discount. It wasn’t very obvious until I started testing it with real numbers. Three endpoints The PDF system now has three endpoints: print a document preview a template print a batch For the preview, instead of creating a fake document, I use the last real document of that module. This way there is only one PDF generation system to maintain. The batch endpoint combines multiple documents into one PDF, while checking permissions for every document. A few other fixes The two ugly things from last time are also gone. Relation titles are now resolved by a shared backend service, so instead of UUIDs you see things like the company name. The same service is used by the lists, detail pages and PDFs. Amounts in the PDF are also formatted using the user’s preferences. I also added tags to the record lists. Tags are resolved in bulk instead of doing a permission check for every single row, which makes a big difference on larger lists. The backend part is basically done for this cycle. The print button and template editor are already written, but they’re not wired up yet. Right now I’m still using the API to test the generator. So, UI is next. See you in the next devlog!"}, {"post_id": 63513, "ts": "2026-09-07T12:44:46Z", "hours": 6.7903, "text": "Hey guys, how’s going? Soon school is going to start for me, but luckily it’s my last year in high school, so I’m really happy about this. Lately I had much time to code, so I continued working on this project. Last devlog was all backend; I said the engine was there and the screens weren’t. This time it’s quite the opposite. I didn’t really touch the backend, I spent the last 5-6 hours writing the frontend. Here’s the details of what I did: Document lines the grid is finally in the record detail. You can add lines, set quantity, price, discount and VAT, additionaly with the subtotal / VAT / total block, that updates while you type. When you save, the whole set of lines is sent at once. Tags I added the tag picker on the record detail, so you can attach and remove tags from a record as you wish. I also made the page that shows every record with a given tag, from all the modules together. Duplicates The duplicate finder now has its own screen: you choose a module, you get the pairs it thinks are duplicates, and the you see the two records side by side and pick field by field which value to keep before merging them. Reports There’s a page to build a report with a wizard (rows, columns, metrics, filters) and a preview that shows you the result before saving it. Dashboard widgets This is the main thing of this cycle. I wrote all six widget types, which are: - KPI tile - split KPI tile - chart - table - pivot - record list A widget is just a saved report query plus the type of rendering you want, so it runs on the report engine. Dashboards with tabs You can create a dashboard, add tabs to it and put widgets inside, so you can keep for example sales and support separated from each other. Sidebar and topbar The sidebar now has the routes for all the new pages, and the topbar has a quick-create button to make a record from anywhere without opening its module first. Two things are still not nice and I’m aware: in some places the relation fields show the raw id instead of the name of the record, and the totals of the document lines are not formatted with the user preferences yet, so you read 9054.00 instead of 9.054,00 EUR. Both are small and both are on the list to be improved. Now I’m working on the PDF generator See you, I hope you enjoy this project"}, {"post_id": 59674, "ts": "2026-09-01T16:28:33Z", "hours": 8.095, "text": "Hey guys, how it’s going? These days I’ve got quite a lot of work to do, since we’re in the middle of harvest season here in Italy, so I don’t have much time to work on the project. Unfortunately, today it rains, so I’m home, and I can spend some time on the PC. Lately I’ve been working a lot on the backend. The first two things I did are documents and document numbering : I created the model for document rows ( DocumentLine ), with its engine to calculate totals, including subtotals, discounts and VAT. I also added unit tests for the calculator. I also implemented automatic document numbering, so documents like quotes, invoices and tickets are automatically assigned a number when they’re created. Then I worked on quote revisions, with a new QuoteRevisionService to keep track of different versions of the same quote. Another thing I started working on is document conversion. The idea is to be able to convert a quote into an invoice, but this part is still a work in progress. I also spent quite a bit of time on reports and dashboards: added the Report model and the ReportEngine / ’ReportService` added default reports through a ReportSeeder created the Dashboard model, with tabs and widgets added the related controllers, services and repositories On the frontend side I’ve scaffolded the pieces for dashboards and widgets — the widgets/ and dashboard-tabs/ components exist and the dashboard and report services are written — but the components themselves are still empty shells. The data layer is ready, the screens aren’t written yet. That’s what I’ll pick up next. Another big thing I worked on is tags and data quality. I added the tag model and APIs, together with the services and repositories. I also started working on a duplicate finder and record merging system, so duplicate contacts/companies can be detected and merged instead of leaving messy data around. For PostgreSQL, I also enabled pg_trgm to improve fuzzy searches for duplicate detection. Finally, I added user preferences for number and date formats, including a live preview so users can immediately see how their chosen formats will look in the app. I’ve also added icons for the new modules. As you can probably tell, this was a very backend-heavy cycle. Almost everything I built this time: document lines, numbering, quote revisions, reports, dashboards, tags and duplicate detection lives in the models and the services, and the UI for most of it isn’t there yet. So this time there isn’t much to show in screenshots: the engine is in place, the screens come next. I’d rather get the model right first and build the interface on top of something solid than the other way around. Hopefully I’ll be able to find some more time to work on it after harvest, so see you in a while."}, {"post_id": 45652, "ts": "2026-08-12T09:05:39Z", "hours": 4.9961, "text": "Hey guys, back on this project. Last time I said the next round was going to be document lines, my quote was “the only part of this CRM that doesn’t fit the dynamic JSON engine”. That’s what this round was, plus the report engine on top of it. Document Lines : One single table for all four documents: quote, sales order, delivery note, invoice. The line is exactly the samein all of them, the only thing that changes is the document holding it, and a document here is just a Record like any other, so there’s no type constraint on the line at all. A line can be a product line, a free text line (no amounts, just something to say in the middle of the document) or a subtotal. Two things get copied at save time: the description and the vat percentage. The math is its own class, DocumentLineCalculator, and it’s the one piece of this project I wanted testable completely on its own, because it’s the only place where a wrong rounding produces a wrong tax document. The order is fixed: gross = quantity × unit price discount = a percentage of the gross, or a flat amount net = gross - discount, rounded to 2 decimals here vat = net × rate, rounded line total = net + vat Rounding happens after the discount and after the vat, never on the unit price: round the unit price and the error gets multiplied by the quantity. Rounding mode is HALF_UP, which is the commercial rounding used here, not HALF_EVEN. And a flat discount bigger than the line itself gets clamped instead of producing a negative amount, since that’s a typo 100% of the time. Lines are always saved all together. The endpoint is a PUT that replaces the whole set. It deletes and rewrites instead of diffing row by row, because a document has a few dozen lines at most and the diff would cost more code than it’s worth. The reason for this rule is the totals: they depend on every line, so a partial save would leave the header and the lines disagreeing, even if only for a moment. The totals (subtotal, vatTotal, total) get written back into the document’s own JSON, plus the header level discount and shipping cost. They live there so they can be list columns you filter and sort on, which is the whole point of having them. Now I’m working on the dashboard graphs, widget and this kind of things.I hope you like the project. I’m sorry if I don’t have any screenshot of the working website, it’s because I focused only on the backend, the frontend of this part still needs to be written."}, {"post_id": 42597, "ts": "2026-08-07T12:41:14Z", "hours": 6.4236, "text": "Hey guys, still on this project. This round was all about the stuff that sits on top of the modules, instead of new modules. Per-user formatting preferences . There’s a new “My preferences” page in the user menu. Every user picks how they want to see numbers and dates: thousands separator, decimal separator, currency (any ISO code, the symbol gets resolved automatically), how many decimals, whether the symbol goes before or after the number, and whether to cut trailing zeros. Same thing for the date format. There’s a live preview box that updates while you touch the selects, so you see 1.234,50 € turn into $ 1,234.5 as you change this. The setting applies everywhere, lists, record details and so on. Tags . These are cross-module, which is the whole point; a tag can sit on a lead and on a ticket. There are two kinds: shared ones, visible to the whole workspace, and private ones, which only you see. Each one has a color. You can attach and detach them from any record, and there’s a “all records with this tag” view that goes across modules, filtered by your permissions, so if you can see tickets but not opportunities, you only get the tickets.I did not build this as a field type, even though I already have a TAGS one. That one belongs to a single ObjectType with its own fixed options, so it gives you neither the shared catalog nor the cross-module search. Duplicate merge . You pick a module and it gives you back the candidate pairs, ranked by how similar their titles are (there’s a threshold you can move, default 0.6). Then you get the two records side by side and choose, field by field, which value survives. When you confirm: the winner keeps everything you picked, every relation that pointed at the loser now points at the winner, ids of the loser mentioned inside other records get rewritten too, including the ones stored in lists, notes and tags move over (and if the winner already had that tag, the duplicate link is dropped), the loser goes to the trash, not deleted. A wrong merge has to be recoverable, and I already have a bin, so I used it. Document numbering . Documents now number themselves. It’s configurable per module: prefix, whether to include the year, padding, separator. Right now it’s on for three of them: - quotes → 2025-47 - invoices → FT2025-0001 - tickets → TT643 The counter is per module and per year, and it’s locked while it’s being read, so two people creating a quote at the same time can’t get the same number. If you type a number by hand, yours wins, that matters when you’re entering an old document with its original number. On top of that, quotes have revisions. Revising 2025-13 gives you 2025-13_2 , a brand new document that links back to its parent, while the parent moves to the “revised” stage. And you can revise a revision, so 2025-13_2_2 works too, the counter is progressive per parent, not global, which took a bit more care than I expected. Next up is the big one: document lines. Quote → order → delivery note → invoice, with quantities, discounts and VAT per line. It’s the only part of this CRM that doesn’t fit the dynamic JSON engine everything else is built on, so it gets its own real tables. See ya in the next devlog, I hope you like the project. P.S. you’ll see the tag in the next devlog, I still have to implement the frontend"}, {"post_id": 40187, "ts": "2026-08-03T16:19:02Z", "hours": 5.575, "text": "Hey guys, I’m still working on this project, cause there are lots of things to do.Lately I focused on improving and adding things to the ObjectTypes. As you can see in the two images of the sidebar, I added like 10 fields. Among them, the most important are goals , basically contains the possibility of creating a goal, setting an owner, which is responsible for this goal (clearly depends on the situation), the actual goal and the period. Along with that you can set a metric, so if the goal is revenue , opportunities , leads , custom project_task , basically it contains the instruction for each member, on a certain project service_contract , the support, it contains the subject, the company which is referred to, start and end date, the actual status, so active , expiring , expired , terminated , hours spent and so on. Along with these and the other I didn’t cite here, I added 3 object for the sales, where this two are the most important: The first one is the supplier , it contains all the specs, so name, vat, email, phone, website, address, and eventual notes. The second one, the most important, is sales_order , which contains the subject, the number of the order, a relation with the company, and a relation with the contact, a relation with the quote (I don’t know if it’s right, in italian it’s called preventivo), the possibility of setting a status, so created , confirmed , shipped , closed , cancelled , the order date, a relation with the payment Method object, and all the financial part, so the subtotal, with maybe the discount, vat, the total and the infos for the shipping, billing and shipping address. I hope to finish this project asap, since it’s taking me so looong.See ya in the next devlogs"}, {"post_id": 38868, "ts": "2026-08-01T13:05:15Z", "hours": 5.2586, "text": "Hey guys, I have stopped this project for a bit, but here I am again. I’m currently improving the CRM, mostly the security, which, for me, is one of the most important parts, and adding functionalities. Lately I focused on the mails. I added my smtp server, and in the backend, I managed all mails. Here is an example, with the invitation email. It’s in italian, but don’t worry, basically it invites you to the CRM, and then you can create your own account, with password. As you can see in the third screenshot, I can manage the invitation link, whether I want to invite an admin, or a simple employee."}, {"post_id": 26409, "ts": "2026-07-11T05:54:20Z", "hours": 10.4239, "text": "Hey guys, this week was also about making the CRM feel more complete. Alongside several new features, I also spent a good amount of time improving security and fixing one particularly deceptive bug. First of all, I added a new global Calendar page that shows every record with a date in one monthly view. Events, tasks, reminders and subscription renewals are all displayed together, each with its own color. Before this, the calendar only existed inside each record type, so there wasn’t a way to see everything happening at once. I also integrated Cal.com. The booking page can now be embedded directly inside the CRM, and when someone books a meeting, a webhook automatically creates an Event record. If the meeting is rescheduled, the existing record is updated instead of creating a duplicate, and if it’s cancelled, the event is removed. To keep the integration secure, the webhook signature is verified using the raw request body instead of reserializing the JSON. I spent some time looking at features from Pipedrive, HubSpot and Attio, then implemented a few that I really liked. The Kanban board now shows the total value of each column, making it easy to see how much every stage of the pipeline is worth. I also added rotting, which highlights cards that haven’t been updated for more than two weeks so forgotten leads are easier to spot. Another big addition is public forms. Every record type can now expose a public form that can be shared with a link or embedded into any website. When someone submits it, a new record is created automatically and any related workflows are triggered. The feature also includes a honeypot for bots and per-IP rate limiting. Finally, I added a Trash Bin, allowing users to restore accidentally deleted records with a single click. I also added the ability to assign an owner directly from the record page. Passwords now follow the same rules everywhere in the application: at least 8 characters one uppercase letter one lowercase letter one number one special character. The backend enforces the policy, while the frontend shows a live checklist as the user types. I also added a Change Password page. When a password is changed, every other active session is logged out while the current one stays active. At one point login stopped working and always returned “Invalid credentials”. It turned out the password wasn’t the problem at all, the backend was stuck in a crash loop. A new database column was added as “not null” without a default value, so Hibernate couldn’t apply the change to an existing table. The application never finished starting, and the frontend showed a generic login error. I fixed the database manually, added a default value to the migration, and made a note for the future: every new “not null” column should always have a default value. After adding all these features, I went through another security pass. The rate limiter now also protects password changes and the Cal.com webhook. I also added a scheduled cleanup job that removes old expired sessions from the database. Finally, I configured proper security headers, including a CSP. Public forms can still be embedded on external websites, while the rest of the CRM remains protected from being embedded elsewhere. Stay tuned, cause I still have lots to do :)"}, {"post_id": 14329, "ts": "2026-06-23T12:44:44Z", "hours": 5.6103, "text": "I continued working on this wonderful project. The first thing I implemented was the sidebar, designed as a reusable component. You can expand and collapse it to switch between icons only and icons with text. I also added a top bar, which contains the company name (top left), a search bar that will allow users to scan the entire database and quickly find what they’re looking for. I also added translations (2 languages for now), light and dark mode, notifications, and a profile section with the user’s name. Additionally, I implemented a simple dashboard with fake data to start shaping the overall user experience. Stay tuned."}, {"post_id": 13650, "ts": "2026-06-22T12:28:12Z", "hours": 8.3619, "text": "Still working on my project. It’s been really tough so far, I’m still on the backend, which is very hard. I feel lucky to have AI helping me; it would be really difficult without it. Honestly, it’s hard even with AI, so I lean on it a lot. I don’t think using AI is a negative: as long as you understand the code it writes and can modify, fix, and improve it, you’re fine. On the backend I’m currently working on the engine underneath, mainly the database relations. For example, the record table stores its fields generically (as JSON), so users can define whatever fields they want. The catch is that validating the data is on me, since the fields are dynamic, the database can’t enforce their shape, so it all has to be checked in code, mostly in the frontend. I’ve also started on the frontend: first by dockerizing it, then by adding the login form that exercises my backend."}, {"post_id": 11904, "ts": "2026-06-19T12:16:33Z", "hours": 5.9808, "text": "Started working on a very big project, called CRM. I hope you know what a CRM is, but for who doesn’t, a crm is basically an app, or maybe a dashboard, used by companies to keep track of their clients, employees and all this kind of things. It helps growing a company, with integrated tickets and so on. This app will be built in the following tech stack: Angular for the frontend, with daisyUI and tailwindCSS as graphical libraries Java Spring for the backend, able to manage correctly users, types and endpoints. I chose this over nestJS with prisma, because I want to have more control on the db. db, I have still to choose what I want and should use, because now I’m focusing on other things, like JWT auth, creation of users and entities and so on. My idea is to use this as a base, and then for maybe companies who needs it, I could like improve this, add requested features, and optimize everything. My current situation: I started the angular project, but I still have to install all libraries and update determined packages I created backend, and I’m currently focusing on auth (as you can see from the pic), with jwt sessions, users, entities, permissions and this kind of things. db, still in progress The application will be dockerized for best practice."}]...
|
Title: CRM by @F3rro_32 | Stardance
Devlogs:
Star Title: CRM by @F3rro_32 | Stardance
Devlogs:
Started working on a very big project, called CRM. I hope you know what a CRM is, but for who doesn’t, a crm is basically an app, or maybe a dashboard, used by companies to keep track of their clients, employees and all this kind of things. It helps growing a company, with integrated tickets and so on. This app will be built in the following tech stack: Angular for the frontend, with daisyUI and tailwindCSS as graphical libraries Java Spring for the backend, able to manage correctly users, types and endpoints. I chose this over nestJS with prisma, because I want to have more control on the db. db, I have still to choose what I want and should use, because now I’m focusing on other things, like JWT auth, creation of users and entities and so on. My idea is to use this as a base, and then for maybe companies who needs it, I could like improve this, add requested features, and optimize everything. My current situation: I started the angular project, but I still have to install all libraries and update determined packages I created backend, and I’m currently focusing on auth (as you can see from the pic), with jwt sessions, users, entities, permissions and this kind of things. db, still in progress The application will be dockerized for best practice.
Still working on my project. It’s been really tough so far, I’m still on the backend, which is very hard. I feel lucky to have AI helping me; it would be really difficult without it. Honestly, it’s hard even with AI, so I lean on it a lot. I don’t think using AI is a negative: as long as you understand the code it writes and can modify, fix, and improve it, you’re fine. On the backend I’m currently working on the engine underneath, mainly the database relations. For example, the record table stores its fields generically (as JSON), so users can define whatever fields they want. The catch is that validating the data is on me, since the fields are dynamic, the database can’t enforce their shape, so it all has to be checked in code, mostly in the frontend. I’ve also started on the frontend: first by dockerizing it, then by adding the login form that exercises my backend.
I continued working on this wonderful project. The first thing I implemented was the sidebar, designed as a reusable component. You can expand and collapse it to switch between icons only and icons with text. I also added a top bar, which contains the company name (top left), a search bar that will allow users to scan the entire database and quickly find what they’re looking for. I also added translations (2 languages for now), light and dark mode, notifications, and a profile section with the user’s name. Additionally, I implemented a simple dashboard with fake data to start shaping the overall user experience. Stay tuned.
Hey guys, this week was also about making the CRM feel more complete. Alongside several new features, I also spent a good amount of time improving security and fixing one particularly deceptive bug. First of all, I added a new global Calendar page that shows every record with a date in one monthly view. Events, tasks, reminders and subscription renewals are all displayed together, each with its own color. Before this, the calendar only existed inside each record type, so there wasn’t a way to see everything happening at once. I also integrated Cal.com. The booking page can now be embedded directly inside the CRM, and when someone books a meeting, a webhook automatically creates an Event record. If the meeting is rescheduled, the existing record is updated instead of creating a duplicate, and if it’s cancelled, the event is removed. To keep the integration secure, the webhook signature is verified using the raw request body instead of reserializing the JSON. I spent some time looking at features from Pipedrive, HubSpot and Attio, then implemented a few that I really liked. The Kanban board now shows the total value of each column, making it easy to see how much every stage of the pipeline is worth. I also added rotting, which highlights cards that haven’t been updated for more than two weeks so forgotten leads are easier to spot. Another big addition is public forms. Every record type can now expose a public form that can be shared with a link or embedded into any website. When someone submits it, a new record is created automatically and any related workflows are triggered. The feature also includes a honeypot for bots and per-IP rate limiting. Finally, I added a Trash Bin, allowing users to restore accidentally deleted records with a single click. I also added the ability to assign an owner directly from the record page. Passwords now follow the same rules everywhere in the application: at least 8 characters one uppercase letter one lowercase letter one number one special character. The backend enforces the policy, while the frontend shows a live checklist as the user types. I also added a Change Password page. When a password is changed, every other active session is logged out while the current one stays active. At one point login stopped working and always returned “Invalid credentials”. It turned out the password wasn’t the problem at all, the backend was stuck in a crash loop. A new database column was added as “not null” without a default value, so Hibernate couldn’t apply the change to an existing table. The application never finished starting, and the frontend showed a generic login error. I fixed the database manually, added a default value to the migration, and made a note for the future: every new “not null” column should always have a default value. After adding all these features, I went through another security pass. The rate limiter now also protects password changes and the Cal.com webhook. I also added a scheduled cleanup job that removes old expired sessions from the database. Finally, I configured proper security headers, including a CSP. Public forms can still be embedded on external websites, while the rest of the CRM remains protected from being embedded elsewhere. Stay tuned, cause I still have lots to do :)
Hey guys, I have stopped this project for a bit, but here I am again. I’m currently improving the CRM, mostly the security, which, for me, is one of the most important parts, and adding functionalities. Lately I focused on the mails. I added my smtp server, and in the backend, I managed all mails. Here is an example, with the invitation email. It’s in italian, but don’t worry, basically it invites you to the CRM, and then you can create your own account, with password. As you can see in the third screenshot, I can manage the invitation link, whether I want to invite an admin, or a simple employee.
Hey guys, I’m still working on this project, cause there are lots of things to do.Lately I focused on improving and adding things to the ObjectTypes. As you can see in the two images of the sidebar, I added like 10 fields. Among them, the most important are goals , basically contains the possibility of creating a goal, setting an owner, which is responsible for this goal (clearly depends on the situation), the actual goal and the period. Along with that you can set a metric, so if the goal is revenue , opportunities , leads , custom project_task , basically it contains the instruction for each member, on a certain project service_contract , the support, it contains the subject, the company which is referred to, start and end date, the actual status, so active , expiring , expired , terminated , hours spent and so on. Along with these and the other I didn’t cite here, I added 3 object for the sales, where this two are the most important: The first one is the supplier , it contains all the specs, so name, vat, email, phone, website, address, and eventual notes. The second one, the most important, is sales_order , which contains the subject, the number of the order, a relation with the company, and a relation with the contact, a relation with the quote (I don’t know if it’s right, in italian it’s called preventivo), the possibility of setting a status, so created , confirmed , shipped , closed , cancelled , the order date, a relation with the payment Method object, and all the financial part, so the subtotal, with maybe the discount, vat, the total and the infos for the shipping, billing and shipping address. I hope to finish this project asap, since it’s taking me so looong.See ya in the next devlogs
Hey guys, still on this project. This round was all about the stuff that sits on top of the modules, instead of new modules. Per-user formatting preferences . There’s a new “My preferences” page in the user menu. Every user picks how they want to see numbers and dates: thousands separator, decimal separator, currency (any ISO code, the symbol gets resolved automatically), how many decimals, whether the symbol goes before or after the number, and whether to cut trailing zeros. Same thing for the date format. There’s a live preview box that updates while you touch the selects, so you see 1.234,50 € turn into $ 1,234.5 as you change this. The setting applies everywhere, lists, record details and so on. Tags . These are cross-module, which is the whole point; a tag can sit on a lead and on a ticket. There are two kinds: shared ones, visible to the whole workspace, and private ones, which only you see. Each one has a color. You can attach and detach them from any record, and there’s a “all records with this tag” view that goes across modules, filtered by your permissions, so if you can see tickets but not opportunities, you only get the tickets.I did not build this as a field type, even though I already have a TAGS one. That one belongs to a single ObjectType with its own fixed options, so it gives you neither the shared catalog nor the cross-module search. Duplicate merge . You pick a module and it gives you back the candidate pairs, ranked by how similar their titles are (there’s a threshold you can move, default 0.6). Then you get the two records side by side and choose, field by field, which value survives. When you confirm: the winner keeps everything you picked, every relation that pointed at the loser now points at the winner, ids of the loser mentioned inside other records get rewritten too, including the ones stored in lists, notes and tags move over (and if the winner already had that tag, the duplicate link is dropped), the loser goes to the trash, not deleted. A wrong merge has to be recoverable, and I already have a bin, so I used it. Document numbering . Documents now number themselves. It’s configurable per module: prefix, whether to include the year, padding, separator. Right now it’s on for three of them: - quotes → 2025-47 - invoices → FT2025-0001 - tickets → TT643 The counter is per module and per year, and it’s locked while it’s being read, so two people creating a quote at the same time can’t get the same number. If you type a number by hand, yours wins, that matters when you’re entering an old document with its original number. On top of that, quotes have revisions. Revising 2025-13 gives you 2025-13_2 , a brand new document that links back to its parent, while the parent moves to the “revised” stage. And you can revise a revision, so 2025-13_2_2 works too, the counter is progressive per parent, not global, which took a bit more care than I expected. Next up is the big one: document lines. Quote → order → delivery note → invoice, with quantities, discounts and VAT per line. It’s the only part of this CRM that doesn’t fit the dynamic JSON engine everything else is built on, so it gets its own real tables. See ya in the next devlog, I hope you like the project. P.S. you’ll see the tag in the next devlog, I still have to implement the frontend
Hey guys, back on this project. Last time I said the next round was going to be document lines, my quote was “the only part of this CRM that doesn’t fit the dynamic JSON engine”. That’s what this round was, plus the report engine on top of it. Document Lines : One single table for all four documents: quote, sales order, delivery note, invoice. The line is exactly the samein all of them, the only thing that changes is the document holding it, and a document here is just a Record like any other, so there’s no type constraint on the line at all. A line can be a product line, a free text line (no amounts, just something to say in the middle of the document) or a subtotal. Two things get copied at save time: the description and the vat percentage. The math is its own class, DocumentLineCalculator, and it’s the one piece of this project I wanted testable completely on its own, because it’s the only place where a wrong rounding produces a wrong tax document. The order is fixed: gross = quantity × unit price discount = a percentage of the gross, or a flat amount net = gross - discount, rounded to 2 decimals here vat = net × rate, rounded line total = net + vat Rounding happens after the discount and after the vat, never on the unit price: round the unit price and the error gets multiplied by the quantity. Rounding mode is HALF_UP, which is the commercial rounding used here, not HALF_EVEN. And a flat discount bigger than the line itself gets clamped instead of producing a negative amount, since that’s a typo 100% of the time. Lines are always saved all together. The endpoint is a PUT that replaces the whole set. It deletes and rewrites instead of diffing row by row, because a document has a few dozen lines at most and the diff would cost more code than it’s worth. The reason for this rule is the totals: they depend on every line, so a partial save would leave the header and the lines disagreeing, even if only for a moment. The totals (subtotal, vatTotal, total) get written back into the document’s own JSON, plus the header level discount and shipping cost. They live there so they can be list columns you filter and sort on, which is the whole point of having them. Now I’m working on the dashboard graphs, widget and this kind of things.I hope you like the project. I’m sorry if I don’t have any screenshot of the working website, it’s because I focused only on the backend, the frontend of this part still needs to be written.
Hey guys, how it’s going? These days I’ve got quite a lot of work to do, since we’re in the middle of harvest season here in Italy, so I don’t have much time to work on the project. Unfortunately, today it rains, so I’m home, and I can spend some time on the PC. Lately I’ve been working a lot on the backend. The first two things I did are documents and document numbering : I created the model for document rows ( DocumentLine ), with its engine to calculate totals, including subtotals, discounts and VAT. I also added unit tests for the calculator. I also implemented automatic document numbering, so documents like quotes, invoices and tickets are automatically assigned a number when they’re created. Then I worked on quote revisions, with a new QuoteRevisionService to keep track of different versions of the same quote. Another thing I started working on is document conversion. The idea is to be able to convert a quote into an invoice, but this part is still a work in progress. I also spent quite a bit of time on reports and dashboards: added the Report model and the ReportEngine / ’ReportService` added default reports through a ReportSeeder created the Dashboard model, with tabs and widgets added the related controllers, services and repositories On the frontend side I’ve scaffolded the pieces for dashboards and widgets — the widgets/ and dashboard-tabs/ components exist and the dashboard and report services are written — but the components themselves are still empty shells. The data layer is ready, the screens aren’t written yet. That’s what I’ll pick up next. Another big thing I worked on is tags and data quality. I added the tag model and APIs, together with the services and repositories. I also started working on a duplicate finder and record merging system, so duplicate contacts/companies can be detected and merged instead of leaving messy data around. For PostgreSQL, I also enabled pg_trgm to improve fuzzy searches for duplicate detection. Finally, I added user preferences for number and date formats, including a live preview so users can immediately see how their chosen formats will look in the app. I’ve also added icons for the new modules. As you can probably tell, this was a very backend-heavy cycle. Almost everything I built this time: document lines, numbering, quote revisions, reports, dashboards, tags and duplicate detection lives in the models and the services, and the UI for most of it isn’t there yet. So this time there isn’t much to show in screenshots: the engine is in place, the screens come next. I’d rather get the model right first and build the interface on top of something solid than the other way around. Hopefully I’ll be able to find some more time to work on it after harvest, so see you in a while.
Hey guys, how’s going? Soon school is going to start for me, but luckily it’s my last year in high school, so I’m really happy about this. Lately I had much time to code, so I continued working on this project. Last devlog was all backend; I said the engine was there and the screens weren’t. This time it’s quite the opposite. I didn’t really touch the backend, I spent the last 5-6 hours writing the frontend. Here’s the details of what I did: Document lines the grid is finally in the record detail. You can add lines, set quantity, price, discount and VAT, additionaly with the subtotal / VAT / total block, that updates while you type. When you save, the whole set of lines is sent at once. Tags I added the tag picker on the record detail, so you can attach and remove tags from a record as you wish. I also made the page that shows every record with a given tag, from all the modules together. Duplicates The duplicate finder now has its own screen: you choose a module, you get the pairs it thinks are duplicates, and the you see the two records side by side and pick field by field which value to keep before merging them. Reports There’s a page to build a report with a wizard (rows, columns, metrics, filters) and a preview that shows you the result before saving it. Dashboard widgets This is the main thing of this cycle. I wrote all six widget types, which are: - KPI tile - split KPI tile - chart - table - pivot - record list A widget is just a saved report query plus the type of rendering you want, so it runs on the report engine. Dashboards with tabs You can create a dashboard, add tabs to it and put widgets inside, so you can keep for example sales and support separated from each other. Sidebar and topbar The sidebar now has the routes for all the new pages, and the topbar has a quick-create button to make a record from anywhere without opening its module first. Two things are still not nice and I’m aware: in some places the relation fields show the raw id instead of the name of the record, and the totals of the document lines are not formatted with the user preferences yet, so you read 9054.00 instead of 9.054,00 EUR. Both are small and both are on the list to be improved. Now I’m working on the PDF generator See you, I hope you enjoy this project
Hey guys, how’s it going? I hope you’re all doing well. School started here in Italy, so I have less time compared to August. I also have to get my driver’s license, so I’m studying for that too. Unfortunately, coding isn’t the first thing I do every day anymore. I’m still working on the PDF generator. Last time I mentioned that relation fields were showing raw IDs and that document totals weren’t formatted properly. I fixed both of those, but I’ll get back to them later. About the PDF The template is HTML, and it lives in the DB. I didn’t hardcode the layout in Java. I created a PdfTemplate entity that stores the HTML, page size and margins. There is one default template for each document type: quote, order, delivery note and invoice. Thymeleaf fills the template with the document data, and OpenHTMLToPDF + PDFBox generate the PDF. Since the HTML is provided by the user, I also had to think about security. A template could try to load something like file:///etc/passwd or access an internal URL. Because of this, external protocols are disabled and only data: URIs are allowed. Page sizes are also checked against a whitelist. I also had to deal with the fact that HTML isn’t always valid XML. OpenHTMLToPDF expects XML, so I use jsoup to normalize the HTML first. Otherwise, perfectly normal HTML can cause a SAXParseException . And finally, fonts have to be embedded in the PDF. Without including DejaVu Sans in the jar, the PDF doesn’t render correctly. VAT summary I also worked on the VAT summary. Lines are grouped by VAT rate, shipping is added to the highest rate, and the document discount is distributed across the rates instead of being applied at the end. VAT is then calculated on the discounted amounts, so everything adds up correctly: taxable + VAT = total This actually fixed a bug where VAT was calculated before applying the document discount. It wasn’t very obvious until I started testing it with real numbers. Three endpoints The PDF system now has three endpoints: print a document preview a template print a batch For the preview, instead of creating a fake document, I use the last real document of that module. This way there is only one PDF generation system to maintain. The batch endpoint combines multiple documents into one PDF, while checking permissions for every document. A few other fixes The two ugly things from last time are also gone. Relation titles are now resolved by a shared backend service, so instead of UUIDs you see things like the company name. The same service is used by the lists, detail pages and PDFs. Amounts in the PDF are also formatted using the user’s preferences. I also added tags to the record lists. Tags are resolved in bulk instead of doing a permission check for every single row, which makes a big difference on larger lists. The backend part is basically done for this cycle. The print button and template editor are already written, but they’re not wired up yet. Right now I’m still using the API to test the generator. So, UI is next. See you in the next devlog!
Hey guys, how have you been doing lately? I’m alright. I’m still getting my driver license, so I don’t have much time to code. Last devlog was all about the PDF engine on the backend, and I closed it saying that the UI was next. Here it is: Print button : I added a print button Print PDF on quotes, orders, delivery notes and invoices. The file is downloaded with the document number as its name, so you get for example 2025-47.pdf and not just document.pdf Template editor : I also added to settings a new tab called “Print”. On the left there’s the list of templates, on the right the HTML, the page size and the margin. The preview renders the last real document of that module instead of a fake one, so what you can see is exactly what your customer receives. The default templates can’t be edited you duplicate them: the seeder rewrites them at every boot, so any change would silently disapper on the next restart. I preferred to say it in the interface rather than let someoune lose an afternoon of work. Company data : The company settings now hold also the legal name, VAT number, tax code, address and contact line. That’s what the PDF header prints, and without them the header comes out empty. VAT that adds up to the cent The header discount is spread across the VAT rates and every share gets rounded, so the sum of the shares could end up one or two cents away from the total. On a quote nobody would ever notice. On an electronic invoice it’s rejection 00423. Now the rounding leftover goes on the last rate, so taxable + VAT = total, always. Tests on a real db : The report engine builds SQL at runtime, and mocking a database proves nothing, so its tests now start a throwaway Postgres in Docker and run against it: filters, grouping, ordering and counting. Two bugs closed : Merging two records didn’t look at the bin, so a deleted record could be merged into a live one. And editing a saved report answered 405, because the frontend was sending PUT to an endpoint that only has POST. Right now I’m working on the 2FA (for those who don’t know, the 2 factor auth). I’m writing the TOTP myself instead of pulling in a library: it’s an HMAC-SHA1 of the 30 second counter, and the six digits come out of the dynamic truncation described in the RFC. The secret is encrypted in the database with AES-GCM, because someone who can read the db must not be able to generate the codes, otherwise a second factor is just a second password. There are ten recovery codes, stored hashed and usable once each, and the last accepted counter is saved, so the same code can’t be replayed during its 30 seconds. The tests are the official RFC 6238 vectors: a TOTP written at home always “works” until you compare it with a real auth app, and at that point it’s too late to find out. Two things I know are missing: the second factor has no interface yet, there’s no page to scan the QR code from, and the mailbox that turns incoming emails into tickets is only half written. See you soon, the end of this project is near.
Hey guys, how’s everything going? I’m alright. I’m so glad hackclub postponed the end of stardance, I have still another month to 1. finish this project 2. do other projects I had on my mind for such a long time. Before doing this devlog, I had to use claude to debug my work, because I had some errors I didn’t understand (I was using a class created for a test in the normal “code”), so bad :( and also other small issues. Lately I worked on one of the most significat features for me, which is 2FA . As my network teacher says "zero trust, because the world is a place full of bastards" . 2FA is one of the techniques I use to follow this approach. Basically, now you can press “Enable” in your preferences, scan the QR code with any authenticator app (f.e google), or just type the secret by hand, because half the people can’t frame a QR code at the first time, lol. You also have to confirm with a code. At login, if 2FA is on, there’s a second step for the six digits. You also get ten recovery codes that you can copy or download, shown only once. Turning it off asks for your password, so a stolen open session can’t remove this precaution. You’re probably wondering: are the secrets encrypted? Yes, they are. I mostly use AES-GCM, because it’s pretty simple, but also secure, so it’s the better compromise. The TOTP secret and the mailbox passwords are stored encrypted with AES-GCM. The key lives in an env variable, not in the db, so a database dump alone isn’t enough to generate codes or read someone’s email. I also turned the crm in a PWA . You can install it on your phone or desktop, it has its own icon and window, and when I deploy a new verion, it tells you to reload, instead of silently serving you the old one from cache (it also checks every 6 hours, maybe I’m gonna change it to 10, idk, for the tab you leave open for days) Like in every other devlog, I made some tests and updated the docs. The report engine now has tests against a real Postgres started in docker, and the repo finally has a real README (it’s not finished, just with some basic information, claude, thanks for the suggestion of making it). Oh, I nearly forgot. I also worked on emails. Now I’m currently working on the Italian electronic invoice, which is called FatturaPA. The crm builds the XML from an invoice, and the first test I wrote checks it against the official government XSD: if it doesn’t pass, it isn’t saved. I think I’m gonna study a bit of english / american law, to allow people out of Italy to use this app as well. I hope you like my product, see you soon
Hey guys, how’s going? I have plenty of things to do, but coding is still one of my favorite activities, so I always try to save some time for it.This time I worked again on FatturaPA, which is the Italian electronic invoice.What I did, is that now, first of all, the CRM can now generate the FatturaPa XML directly from an invoice and validate it against the official XSD, before saving it. I also added the whole invoice lifecycle, from draft, to setn, delivered, accepted or rejected. The CRM can read the recepits from the SDI and show ufseful information when something goes wrong.Another important change is that invoices now become locked once they’re sent to the SDI. If something needs to be changed, the correct way is to create a credit note instead. This is much efficient in my opinion.I also started working on the SDI integration itself. For now there’s only a manual transport, but the system is built so that adding an actual provider later shouldn’t require changing the rest of the CRM. I did it this way, so I can decide which provider use, and not have to change everything.Besides invoicing, I added time tracking. You can start a timer from the top bar and see your hours directly on records. Timers also automatically close after a maximum amount of time, so nobody ends up with a 80-hour ticket because they forgot to stop it.Finally, I worked on email campaigns. You can create a campaign from a saved filter, send emails through a queue and manage unsubscribes. I also added some protections against things like open redirects and accidental unsubscribes.And now, the honest part: before writing this devlog, I ran the tests and guess what, the app didn’t even start.I used claude for debugging, cause I wans’t finding the error. Silly me, it was just a typo.
Hey guys, how’s everythings going? I’m doing pretty well. As always I have lots of things to do, but I still have plenty of time for coding. School is demanding, and preparing for my driving license is also tough, but I’m managing everything little by little. Last time I ended up with an app that wouldn’t even start. Luckily, I fixed all those errors, and all 258 tests are now green and passing on the PostgreSQL db. After that, I added new features. First of all I worked on NPS surveys and quote acceptance. Customers can now receive surveys and answer them through a public link. They can also accept quotes directly from a link, without needing an account. I also made sure these features work with the existing workflows, so automations can still do their job properly. Another interesting addition is the MCP server. AI agents can now interact with the CRM through an API key. Instead of creating a separate set of tools for every module, I went with seven generic tools that can work across all 34 modules. This should make it easier for AI models to understand which actions they can perform, while keeping the CRM’s existing permissions and security rules in place. I also improved search quite a bit. Before, it mostly looked at record titles. Now it uses PostgreSQL full-text search to find relevant information inside the actual record data and rank the results. The audit history is also much easier to read, with related record IDs replaced by their actual titles. I worked on a couple of smaller but important things, too. The trash can now properly handle related files and records when permanently deleting something, while protecting fiscal documents that must be kept for ten years. Finally, I started working on the customer portal. It now has its own backend authentication and permission system, separate from the employee login. Customers will only be able to access records they’re actually allowed to see. The backend is ready, but I still need to connect the frontend pages and routes. There’s still quite a bit to do, but I’m getting closer to the first complete version of the CRM. See you in the next devlog!
Hey guys, how’s going? This will be a short devlog, and it’s the one before the shipping. I decided to ship the CRM, even if it’s not completely finished. That’s because I still have to do lots of things, but now I have a working product, so, since the changes I have to make are complementary. Unfortunately, I have a big issue: the whole interface is in Italian. The app is made for Italian small businesses (FatturaPA, VAT, SDI…), but if you come from Stardance you can’t read a single menu. Real i18n is still on my list and it is a big job, so for now I added the Google Translate widget in the corner of the app. If your browser is in English it starts translating by itself, otherwise you pick English from the selector. It’s not pretty, but it makes the demo usable today instead of “someday”. I had to widen the CSP in nginx for it, and I loaded the script as an external file so I didn’t need a second hash. I also fixed the README and cleaned the repo. Now everything should work fine, or at least let’s hope so. I hope you enjoy the product.
Hey guys, what’s up? I’m finally in the last phase of getting my driving license, so that’s taking up some of my time too. The CRM is now online at crm.alessio.hackclub.app . The VPS has very little RAM, so I build the Docker images locally and transfer them to the server using docker save over SSH. It’s not the fanciest deployment process, but it works with the resources I have, so I’ll stick to it for now. One of the main things I worked on was the customer portal . The backend from last week finally has a frontend: customers can log in, see their tickets and documents, open requests, reply to messages, download PDFs and accept quotes. I also made sure that internal notes stay internal. Notes now have a Visible to customer checkbox, which is disabled by default. The portal only shows notes explicitly marked as visible, so there’s less risk of accidentally exposing something that should stay private. Another feature I added is Google Calendar import . It’s read-only for now, so the CRM can import events without modifying anything in your Google account. Events are created through the same service as normal CRM records, meaning workflows and the audit log still work as expected. Sync runs every 15 minutes, and if something goes wrong with an account, it won’t stop the others from syncing. I also started replacing the Google Translate workaround with proper internationalization (i18n). The translation system is in place, including support for parameters and locale-aware dates and numbers. The dictionary is type-checked, too, so missing English translations can be caught at compile time. There’s still a lot of work here: around 1,200 strings need to be translated by hand. It’s not the most exciting task, but I’d rather have proper translations than rely on Google Translate forever. Obviously that’s my opionion. I also started working on public registration, but it’s not ready yet. There’s one important limitation: the CRM currently has a single shared workspace, so everyone who registers would see the same data. Registration will stay disabled unless explicitly enabled until I decide how to handle that properly. That’s because the idea is to have 1 single DB for each workspace, since the CRM should be self-hosted. There’s still work to do, but the CRM is getting closer to the version I wanted to ship. See you in the next devlog!
Ships:
CRM An open-source CRM for Italian small businesses: contacts, companies, leads, quotes, orders, invoices with VAT, tickets, email campaigns, NPS surveys, reports and a customer portal. It started as a way to manage clients for a friend’s startup and became a working and valuable project. TRY IT (no install) https://crm.alessio.hackclub.app email: [email protected] password: HackClub-Demo-2026! The demo has full access and realistic fake data, so feel free to click everything, create, edit and delete. The data resets occasionally. Outgoing email is switched off on the demo. HEADS UP: the interface is in Italian. Use the translate widget in the corner of the app (or your browser’s translator) to read it in English. Real i18n is on my roadmap, sorry! WHAT TO LOOK AT A quote with line items, discounts and VAT by rate, and the “Print PDF” button. PDFs come from HTML templates you can edit, with a live preview on your last real document. A customer accepting a quote from a signed link, without an account. Full-text search across every module (PostgreSQL). Italian e-invoicing: it builds the FatturaPA XML and validates it against the official government XSD before saving. Invoices lock once sent to the SDI. The MCP server: an AI assistant can use the CRM through an API key, with seven generic tools that work on all 34 modules and respect permissions. 2FA (TOTP) with recovery codes, secrets encrypted at rest, installable PWA. HOW IT WORKS There is no “contacts” or “companies” table. One generic Record entity stores its fields in a jsonb column, and an ObjectType + FieldDef describe each module (39 field types). Adding a module is a configuration record, not a migration or a new controller. Permissions are checked per module and action at runtime. You can have more info in the README, so please check it. I hope you appreciate this project :)...
|
1793199114.023006
|
1793285514.023006
|
|
20748
|
PrayDB by @lupc65779 | Stardance
|
lupc65779
|
1
|
2.78
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T11:58:44Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Say hello to PrayDB, the only database engine powered entirely by gambling and faith. What started as a joke by openclaw has turned into a fully functioning project that I plan on actually maintaining. ! Note: The site demo is just a preview of how it works. To actually use it check out the GH repo.", "repo": "https://github.com/Lupc9102/PrayDB", "demo": "https://www.lupc.xyz/praydb-demo"}]...
|
[{"post_id": 11310, "ts": "202 [{"post_id": 11310, "ts": "2026-06-18T14:37:29Z", "hours": 0.7797, "text": "Basic showcase/walk-through script now on GH"}, {"post_id": 11233, "ts": "2026-06-18T11:50:03Z", "hours": 1.4272, "text": "Wrote README.md and published the client-side demo on https://www.lupc.xyz/praydb-demo"}, {"post_id": 10609, "ts": "2026-06-17T13:32:32Z", "hours": 0.9361, "text": "Little introduction to this project: PrayDB is a dumb idea that an OpenClaw agent jokingly gave to me on a Saturday afternoon. Who the fuck isn’t bored of MySQL, Mongo, and others? We need a CHANGE. As we can all see, the world is leaning towards using AI in pretty much everything… now why wouldn’t you want an LLM handling your super-duper-important database with super-duper-important user data? (I know this is dumb.) Therefore, I present to you PrayDB: the only DB that introduces gambling to data storage."}]...
|
Title: PrayDB by @lupc65779 | Stardance
Devlogs:
Title: PrayDB by @lupc65779 | Stardance
Devlogs:
Little introduction to this project: PrayDB is a dumb idea that an OpenClaw agent jokingly gave to me on a Saturday afternoon. Who the fuck isn’t bored of MySQL, Mongo, and others? We need a CHANGE. As we can all see, the world is leaning towards using AI in pretty much everything… now why wouldn’t you want an LLM handling your super-duper-important database with super-duper-important user data? (I know this is dumb.) Therefore, I present to you PrayDB: the only DB that introduces gambling to data storage.
Wrote README.md and published the client-side demo on https://www.lupc.xyz/praydb-demo
Basic showcase/walk-through script now on GH
Ships:
Say hello to PrayDB, the only database engine powered entirely by gambling and faith. What started as a joke by openclaw has turned into a fully functioning project that I plan on actually maintaining. ! Note: The site demo is just a preview of how it works. To actually use it check out the GH repo....
|
1793252912.3185027
|
1793339312.3185027
|