|
7551
|
Untitled by @Siedy | Stardance
|
Siedy
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Siedy | Stardance
|
1793228032.0707517
|
1793832832.0707517
|
|
7552
|
My first slack bot! by @CoolCat09 | Stardance
|
CoolCat09
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @CoolCat09 | Stardan Title: My first slack bot! by @CoolCat09 | Stardance...
|
1793260250.6782546
|
1793865050.6782546
|
|
7553
|
Teral by @fqnn | Stardance
|
fqnn
|
0
|
0.47
|
0
|
[]
|
[{"post_id": 2738, "ts": "2026 [{"post_id": 2738, "ts": "2026-06-05T14:31:51Z", "hours": 0.4711, "text": "I am fixing things like missing authentication on some services, surfacing more log infos etc"}]...
|
Title: Teral by @fqnn | Stardance
Devlogs:
I am f Title: Teral by @fqnn | Stardance
Devlogs:
I am fixing things like missing authentication on some services, surfacing more log infos etc...
|
1793224559.5770488
|
1793829359.5770488
|
|
7554
|
Untitled project by @Rohit_datla | Stardance
|
Rohit_datla
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Rohit_datla | Stardanc Title: Untitled project by @Rohit_datla | Stardance...
|
1793357372.9244442
|
1793962172.9244442
|
|
7555
|
A nice bow game by @mr_peoplez161 | Stardance
|
mr_peoplez161
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: A nice bow game by @mr_peoplez161 | Stardan Title: A nice bow game by @mr_peoplez161 | Stardance...
|
1792702305.1309638
|
1793307105.1309638
|
|
7556
|
Deeper by @AungS8430 | Stardance
|
AungS8430
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Deeper by @AungS8430 | Stardance
|
1793288894.2143896
|
1793893694.2143896
|
|
7557
|
My first slack bot! by @emperor_j | Stardance
|
emperor_j
|
0
|
1.01
|
0
|
[]
|
[{"post_id": 13999, "ts": "202 [{"post_id": 13999, "ts": "2026-06-22T23:31:34Z", "hours": 0.3078, "text": "It worked! YESSS!"}, {"post_id": 13985, "ts": "2026-06-22T23:07:34Z", "hours": 0.7008, "text": "Im working on my slack bot. I managed to run my bot from the terminal, but for some reason it’s not responding in the slack app. Im trying to figure out the issue right now."}]...
|
Title: My first slack bot! by @emperor_j | Stardan Title: My first slack bot! by @emperor_j | Stardance
Devlogs:
Im working on my slack bot. I managed to run my bot from the terminal, but for some reason it’s not responding in the slack app. Im trying to figure out the issue right now.
It worked! YESSS!...
|
1793292761.2296429
|
1793897561.2296429
|
|
7558
|
R2D2 by @Art3mis | Stardance
|
Art3mis
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-24T17:30:36Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "my slackbot is finally live!! r2d2 is up and running after a long time of fighting with nest. this was challenging as a newbie to nest and slack, but i did it! r2d2 has 3 functions, it can tell you the ping latency, show a help menu, and tell you a random fact!", "repo": "https://github.com/artemis9703/R2D2-slackbot", "demo": "https://hackclub.enterprise.slack.com/archives/C08JZ1LF3K5"}]...
|
[{"post_id": 3077, "ts": "2026 [{"post_id": 3077, "ts": "2026-06-05T23:38:27Z", "hours": 0.5211, "text": "today i added two more commands to r2d2, and install the ability to use APIs. r2d2 can now list all the commands you can use, and it can tell you a random fact. tomorrows goal is to start adding some kind of Q&A or roleplay function."}, {"post_id": 2470, "ts": "2026-06-04T23:49:09Z", "hours": 0.3811, "text": "I started my first slackbot and decided to code it as rd2d because clone wars is the best thing ever. Managed to get it up and running, and it can now tell you the ping latency. Got the profile and photo sent up as well."}]...
|
Title: R2D2 by @Art3mis | Stardance
Devlogs:
I st Title: R2D2 by @Art3mis | Stardance
Devlogs:
I started my first slackbot and decided to code it as rd2d because clone wars is the best thing ever. Managed to get it up and running, and it can now tell you the ping latency. Got the profile and photo sent up as well.
today i added two more commands to r2d2, and install the ability to use APIs. r2d2 can now list all the commands you can use, and it can tell you a random fact. tomorrows goal is to start adding some kind of Q&A or roleplay function.
Ships:
my slackbot is finally live!! r2d2 is up and running after a long time of fighting with nest. this was challenging as a newbie to nest and slack, but i did it! r2d2 has 3 functions, it can tell you the ping latency, show a help menu, and tell you a random fact!...
|
1793274834.480518
|
1793361234.480518
|
|
7559
|
Untitled by @aadya_panchal | Stardance
|
aadya_panchal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @aadya_panchal | Stardance
|
1793231334.5457869
|
1793836134.5457869
|
|
7560
|
test by @aadya_panchal | Stardance
|
aadya_panchal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: test by @aadya_panchal | Stardance
|
1792756266.1781414
|
1793361066.1781414
|
|
7561
|
Game by @SamZaNerd | Stardance
|
SamZaNerd
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Game by @SamZaNerd | Stardance
|
1793177361.668635
|
1793782161.668635
|
|
7562
|
Lego Spike Prime Code by @Overgrowth_774 | Stardan Lego Spike Prime Code by @Overgrowth_774 | Stardance...
|
Overgrowth_774
|
0
|
4.52
|
0
|
[]
|
[{"post_id": 11633, "ts": "202 [{"post_id": 11633, "ts": "2026-06-18T23:05:14Z", "hours": 3.1869, "text": "Adding pybricks tests and trying to also add AD to code library"}, {"post_id": 5054, "ts": "2026-06-08T18:31:51Z", "hours": 0.6281, "text": "Recoding the degrees_forwards function to actually work like a normal move function in degrees using micropython in VS code, and hopefully make it compatible to eventually become a gyro straight"}, {"post_id": 2818, "ts": "2026-06-05T17:20:10Z", "hours": 0.7011, "text": "Lego Spike Prime code to run tasks."}]...
|
Title: Lego Spike Prime Code by @Overgrowth_774 | Title: Lego Spike Prime Code by @Overgrowth_774 | Stardance
Devlogs:
Lego Spike Prime code to run tasks.
Recoding the degrees_forwards function to actually work like a normal move function in degrees using micropython in VS code, and hopefully make it compatible to eventually become a gyro straight
Adding pybricks tests and trying to also add AD to code library...
|
1793137987.9021823
|
1793742787.9021823
|
|
7563
|
vimPad by @Maxwell-l-hack | Stardance
|
Maxwell-l-hack
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: vimPad by @Maxwell-l-hack | Stardance
|
1793177777.761343
|
1793782577.761343
|
|
7564
|
Simple Battleship Game by @aadya_panchal | Stardan Simple Battleship Game by @aadya_panchal | Stardance...
|
aadya_panchal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Simple Battleship Game by @aadya_panchal | Title: Simple Battleship Game by @aadya_panchal | Stardance...
|
1793393251.029224
|
1793998051.029224
|
|
7565
|
My first slack bot! by @dopey | Stardance
|
dopey
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @dopey | Stardance
|
1793170342.1286395
|
1793775142.1286395
|
|
7566
|
cam by @christian | Stardance
|
christian
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: cam by @christian | Stardance
|
1793407660.827948
|
1794012460.827948
|
|
7567
|
Printful Preview Generator by @jdszekeres | Starda Printful Preview Generator by @jdszekeres | Stardance...
|
jdszekeres
|
1
|
3.31
|
30
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T00:36:53Z", "hours": 3.0, "multiplier": 10.69, "payout": 30, "blessing": "neutral", "text": "I made a Chrome extension that allows you to create embeddable entries for Printable Quick Stores on any other website hosting platform.", "repo": "https://github.com/jdszekeres/printful_preview_generator", "demo": "https://github.com/jdszekeres/printful_preview_generator/releases"}]...
|
[{"post_id": 6251, "ts": "2026 [{"post_id": 6251, "ts": "2026-06-10T14:39:20Z", "hours": 0.3111, "text": "Debbuged an issue where products were not listed in a production environment"}, {"post_id": 3159, "ts": "2026-06-06T00:32:30Z", "hours": 0.5197, "text": "Polishing touches: CSS styling, logo, etc"}, {"post_id": 2936, "ts": "2026-06-05T20:53:05Z", "hours": 1.0892, "text": "Added the ability to preview what the generated HTML looks like before having to download it"}, {"post_id": 2878, "ts": "2026-06-05T19:22:41Z", "hours": 0.2981, "text": "Got the ability to add different product endings to the custom html"}, {"post_id": 2819, "ts": "2026-06-05T17:20:25Z", "hours": 0.99, "text": "I created a content script to pull data from the site and a popup window to read data and display it, although unformatted right now."}]...
|
Title: Printful Preview Generator by @jdszekeres | Title: Printful Preview Generator by @jdszekeres | Stardance
Devlogs:
I created a content script to pull data from the site and a popup window to read data and display it, although unformatted right now.
Got the ability to add different product endings to the custom html
Added the ability to preview what the generated HTML looks like before having to download it
Polishing touches: CSS styling, logo, etc
Debbuged an issue where products were not listed in a production environment
Ships:
I made a Chrome extension that allows you to create embeddable entries for Printable Quick Stores on any other website hosting platform....
|
1793324888.6294236
|
1793411288.6294236
|
|
7568
|
My awesome macropad! by @nani | Stardance
|
nani
|
0
|
0.31
|
0
|
[]
|
[{"post_id": 5025, "ts": "2026 [{"post_id": 5025, "ts": "2026-06-08T17:55:39Z", "hours": 0.3097, "text": "I have been working on a program that first asks for login credentials and helps you make your own credentials and then giving apps like a jokes app, math app, and guess age app, I am trying to add more apps and if anyone has idea please reach out. Here is the code for the login sequence."}]...
|
Title: My awesome macropad! by @nani | Stardance
Title: My awesome macropad! by @nani | Stardance
Devlogs:
I have been working on a program that first asks for login credentials and helps you make your own credentials and then giving apps like a jokes app, math app, and guess age app, I am trying to add more apps and if anyone has idea please reach out. Here is the code for the login sequence....
|
1792752523.2521896
|
1793357323.2521896
|
|
7569
|
Portfolio Website by @sp09 | Stardance
|
sp09
|
1
|
10.0
|
82
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-22T16:01:13Z", "hours": 10.0, "multiplier": 7.9, "payout": 82, "blessing": "neutral", "text": "I built a personal portfolio website to showcase some of my technical experience and projects with who I am as a person and hobbies. It was made using HTML, CSS, and JavaScript and has a video montage giving glimpses into some important things in my life, animated navigation bar, an experience timeline, projects, my tech stack, and a contacts section. I don’t usually make very nice frontend UI so the biggest challenge for me while making this was to make the site dynamic using static HTML, CSS, and JavaScript. There was a lot of coordinating where the user was in terms of scrolling and making sections pop up. I’m most proud of the project gallery since it’s interactive so anyone viewing it can get more information about projects that interest them while still staying on the website and not being overwhelmed with just pure code. Since this is a static website, to test, you can open index.html directly in your browser or run a local server.", "repo": "https://github.com/SVPandya/PortfolioWeb", "demo": "https://svpandya.github.io/"}]...
|
[{"post_id": 33004, "ts": "202 [{"post_id": 33004, "ts": "2026-07-22T15:22:29Z", "hours": 2.4433, "text": "I added popup cards for each of my projects. They’re all arranged in a grid, but I wanted a way to get more information about each project quickly. It basically adds a popup card when you click on each project that lets you scroll through each image, read a short description, figure out what tools were used, and go to the GitHub repo for even more information."}, {"post_id": 16691, "ts": "2026-06-27T03:53:46Z", "hours": 1.8469, "text": "I did a bunch of little changes in color and theme that I won’t bore you with here but I did have one major update. I finally created a tools/technologies stack that continuously scrolls in two rows. I was actually inspired by how Hack Club has scrolling displays for their prizes on an event homepage."}, {"post_id": 14698, "ts": "2026-06-23T21:56:58Z", "hours": 1.5983, "text": "I finished the about me section of my website! This honestly should’ve been done earlier but I was too lazy. Anyways, it features some personal info about me along with a picture and that’s basically it. I’m thinking of removing my email from there since I have a dedicated contacts section at the very bottom of my page now as well with my email, LinkedIn, and Github. The next and probably final section to add will be tools and technologies."}, {"post_id": 14391, "ts": "2026-06-23T14:39:53Z", "hours": 1.6708, "text": "I know you can’t really see it in the picture but I added transitions to my website. Nothing crazy, just small animations to things pop up sequentially as you scroll down but it really ties the website together. Other than that, I basically just spent a lot of time making very small edits to make the website look just how I want it. There’s also a vignette on the main intro video now so that there isn’t a hard cutoff between the video and the rest of the page. Again, just a transition!"}, {"post_id": 13908, "ts": "2026-06-22T20:06:05Z", "hours": 2.0261, "text": "I’m really happy with how my experience section looks. I have to add in the actual content but in terms of the design I was going for, this fits the rest of my website really well and is super easy to follow. The next part will be adding a small about me section near the top of the website but I got the main “hard” parts out of the way!"}, {"post_id": 11521, "ts": "2026-06-18T20:19:18Z", "hours": 0.4353, "text": "I’m basically done with my intro screen! Sure, there will be some small changes here and there as I make the rest of my website but for the landing screen, I’m really happy with how it looks. The intro text has a little typewriter-like animation to it which doesn’t come across in one screenshot but it’s there! The background also has a video montage playing just showing some of my hobbies. I’m not sure about the color theme just yet but the next part is to add in my about me section and projects."}, {"post_id": 11335, "ts": "2026-06-18T15:24:13Z", "hours": 0.3869, "text": "I began working on my porfolio website! Right now, I have just made the navbar with all the main sections that I want to include later. You can’t see it right now because there isn’t anything else on the page, but I added some random content to make it longer that my window height since I wanted to have a scroll transition. Instead of being a pill shape in the middle, the navbar will transition and spread itself out over the entire window width when it disappears after a scroll. Also, for hovering it just disappears right now because I put arbitrary color variables since I haven’t actually finalized a color theme yet but that will come soon. My next step is going to be to add my home screen with hopefully some cool functionality!"}]...
|
Title: Portfolio Website by @sp09 | Stardance
Dev Title: Portfolio Website by @sp09 | Stardance
Devlogs:
I began working on my porfolio website! Right now, I have just made the navbar with all the main sections that I want to include later. You can’t see it right now because there isn’t anything else on the page, but I added some random content to make it longer that my window height since I wanted to have a scroll transition. Instead of being a pill shape in the middle, the navbar will transition and spread itself out over the entire window width when it disappears after a scroll. Also, for hovering it just disappears right now because I put arbitrary color variables since I haven’t actually finalized a color theme yet but that will come soon. My next step is going to be to add my home screen with hopefully some cool functionality!
I’m basically done with my intro screen! Sure, there will be some small changes here and there as I make the rest of my website but for the landing screen, I’m really happy with how it looks. The intro text has a little typewriter-like animation to it which doesn’t come across in one screenshot but it’s there! The background also has a video montage playing just showing some of my hobbies. I’m not sure about the color theme just yet but the next part is to add in my about me section and projects.
I’m really happy with how my experience section looks. I have to add in the actual content but in terms of the design I was going for, this fits the rest of my website really well and is super easy to follow. The next part will be adding a small about me section near the top of the website but I got the main “hard” parts out of the way!
I know you can’t really see it in the picture but I added transitions to my website. Nothing crazy, just small animations to things pop up sequentially as you scroll down but it really ties the website together. Other than that, I basically just spent a lot of time making very small edits to make the website look just how I want it. There’s also a vignette on the main intro video now so that there isn’t a hard cutoff between the video and the rest of the page. Again, just a transition!
I finished the about me section of my website! This honestly should’ve been done earlier but I was too lazy. Anyways, it features some personal info about me along with a picture and that’s basically it. I’m thinking of removing my email from there since I have a dedicated contacts section at the very bottom of my page now as well with my email, LinkedIn, and Github. The next and probably final section to add will be tools and technologies.
I did a bunch of little changes in color and theme that I won’t bore you with here but I did have one major update. I finally created a tools/technologies stack that continuously scrolls in two rows. I was actually inspired by how Hack Club has scrolling displays for their prizes on an event homepage.
I added popup cards for each of my projects. They’re all arranged in a grid, but I wanted a way to get more information about each project quickly. It basically adds a popup card when you click on each project that lets you scroll through each image, read a short description, figure out what tools were used, and go to the GitHub repo for even more information.
Ships:
I built a personal portfolio website to showcase some of my technical experience and projects with who I am as a person and hobbies. It was made using HTML, CSS, and JavaScript and has a video montage giving glimpses into some important things in my life, animated navigation bar, an experience timeline, projects, my tech stack, and a contacts section. I don’t usually make very nice frontend UI so the biggest challenge for me while making this was to make the site dynamic using static HTML, CSS, and JavaScript. There was a lot of coordinating where the user was in terms of scrolling and making sections pop up. I’m most proud of the project gallery since it’s interactive so anyone viewing it can get more information about projects that interest them while still staying on the website and not being overwhelmed with just pure code. Since this is a static website, to test, you can open index.html directly in your browser or run a local server....
|
1793270941.5552065
|
1793357341.5552065
|
|
7570
|
The AI Firefighter by @SelmaE | Stardance
|
SelmaE
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: The AI Firefighter by @SelmaE | Stardance
|
1792792281.9412997
|
1793397081.9412997
|
|
7571
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792929126.1879506
|
1793793126.1879506
|
|
7572
|
Godeang by @jayy | Stardance
|
jayy
|
0
|
0.5
|
0
|
[]
|
[{"post_id": 2632, "ts": "2026 [{"post_id": 2632, "ts": "2026-06-05T08:22:44Z", "hours": 0.4961, "text": "I made a go program to manage stuff in a warehouse or shop, today I made version 0.0.1 with the create delete and get stuff data features"}]...
|
Title: Godeang by @jayy | Stardance
Devlogs:
I ma Title: Godeang by @jayy | Stardance
Devlogs:
I made a go program to manage stuff in a warehouse or shop, today I made version 0.0.1 with the create delete and get stuff data features...
|
1792756180.2667842
|
1793360980.2667842
|
|
7573
|
star://CRΔSH by @JonButNotReally | Stardance
|
JonButNotReally
|
0
|
35.0
|
0
|
[]
|
[{"post_id": 2748, "ts": "2026 [{"post_id": 2748, "ts": "2026-06-05T14:51:50Z", "hours": 1.0, "text": "Finished my unity tutorial. This is going to be harder than i thought 🥀"}, {"post_id": 2991, "ts": "2026-06-05T22:21:34Z", "hours": 3.0, "text": "I have done YET ANOTHER TUTORIAL HOORAY. I’m trying to cram as much information into my head about Unity so that i can make the best game ever for you guys ❤️. ALSO you may have noticed, i put an actual name on this project. It’s - if you couldn’t tell - stardance themed. I also got a little inspired by Project Hail Mary and put a little delta symbol in place of the A."}, {"post_id": 4337, "ts": "2026-06-07T16:51:43Z", "hours": 8.0, "text": "I have started working on my game. I looked around on the unity store a bunch and i found robots that i could use maybe? Still got no idea what this games going to be about but ill update everyone soon 👍"}, {"post_id": 6408, "ts": "2026-06-10T19:36:10Z", "hours": 3.0, "text": "Worked a bit on sound design. I have an intro cutscene almost done. I made two songs last night and would like your opinions on them :3. EDIT: stardance converted both my songs into one video and deleted the second song :<. heres an updated link https://drive.google.com/file/d/1vatk2i9xqu3f0RGaYp2QvOf_O7ZOb8Cj/view?usp=drive_link , https://drive.google.com/file/d/1gPaW7eQ4ubazGF0JGi917zmj3drQxAt8/view?usp=drive_link"}, {"post_id": 6632, "ts": "2026-06-11T03:49:02Z", "hours": 5.0, "text": "Intro scene is complete!!!!!!!! I have released a teaser on Youtube . This took me longer than i expected but hopefully the rest will come easy :>. also tw jumpscare :3"}, {"post_id": 10969, "ts": "2026-06-17T23:59:48Z", "hours": 15.0, "text": "i swear I entered a time loop—7 days disappeared in what felt like 2 seconds. 😭 My older brother got me into playing OMORI, Doki Doki Literature Club!, MiSide, and Lethal Company, and its honestly been superrrr inspiring, but it also made me start doubting my own project, especially the storyline. im not sure if ill be able to finish it before the end of Stardance, but im still trying my hardest for everyone. Over the past week, ive been experimenting with different, more unique art styles for the game and reshaping the story to be more cohesive, and im definitely leaning a bit scarier and more intense than before hehehe. also btw heres a possible logo idea i was playing around with in photoshop, id love to hear your guys feedback on it"}]...
|
Title: star://CRΔSH by @JonButNotReally | Stardanc Title: star://CRΔSH by @JonButNotReally | Stardance
Devlogs:
Finished my unity tutorial. This is going to be harder than i thought 🥀
I have done YET ANOTHER TUTORIAL HOORAY. I’m trying to cram as much information into my head about Unity so that i can make the best game ever for you guys ❤️. ALSO you may have noticed, i put an actual name on this project. It’s - if you couldn’t tell - stardance themed. I also got a little inspired by Project Hail Mary and put a little delta symbol in place of the A.
I have started working on my game. I looked around on the unity store a bunch and i found robots that i could use maybe? Still got no idea what this games going to be about but ill update everyone soon 👍
Worked a bit on sound design. I have an intro cutscene almost done. I made two songs last night and would like your opinions on them :3. EDIT: stardance converted both my songs into one video and deleted the second song :<. heres an updated link https://drive.google.com/file/d/1vatk2i9xqu3f0RGaYp2QvOf_O7ZOb8Cj/view?usp=drive_link , https://drive.google.com/file/d/1gPaW7eQ4ubazGF0JGi917zmj3drQxAt8/view?usp=drive_link
Intro scene is complete!!!!!!!! I have released a teaser on Youtube . This took me longer than i expected but hopefully the rest will come easy :>. also tw jumpscare :3
i swear I entered a time loop—7 days disappeared in what felt like 2 seconds. 😭 My older brother got me into playing OMORI, Doki Doki Literature Club!, MiSide, and Lethal Company, and its honestly been superrrr inspiring, but it also made me start doubting my own project, especially the storyline. im not sure if ill be able to finish it before the end of Stardance, but im still trying my hardest for everyone. Over the past week, ive been experimenting with different, more unique art styles for the game and reshaping the story to be more cohesive, and im definitely leaning a bit scarier and more intense than before hehehe. also btw heres a possible logo idea i was playing around with in photoshop, id love to hear your guys feedback on it...
|
1792946996.8744335
|
1793810996.8744335
|
|
7574
|
Kolori by @nikooo | Stardance
|
nikooo
|
1
|
142.69
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-19T21:34:34Z", "hours": 100.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Kolori is a desktop application that lets you create beautiful pieces of art from mathematical expressions. Kolori features a custom hand-written recursive descent parser to parse mathematical expressions–which it then uses to transpile your input down to low-level shader instructions to render images to the screen on the GPU. Kolori also supports rendering not only images, but animations using the “ t ” variable in the input expression, which grows linearly with time elapsed–the speed at which is adjustable. Kolori offers four coloring modes that can generate different images based on your input: HSL : Uses the HSL color space to generate pixel colors HSLuv : Uses the HSLuv color space, a perceptually uniform alternative to HSL, to generate pixel colors Custom Palette Generation : Input 4 colors of your choosing so Kolori can generate a custom color palette based on them, to determine pixel colors Use an Image : Select an image using your file manager, or just drag and drop one onto the window for Kolori to sample pixel colors from the input image to determine pixel colors. Making this project was a bit of an adventure, as I had never worked with libraries such as ImGui, SDL, and OpenGL before. The biggest challenge when creating the program was managing memory correctly–which makes me appreciate languages like Nim even more–and code organization.", "repo": "https://github.com/neroist/kolori", "demo": "https://github.com/neroist/kolori/releases/latest"}]...
|
[{"post_id": 18957, "ts": "202 [{"post_id": 18957, "ts": "2026-06-30T04:15:45Z", "hours": 3.4697, "text": "Managed to get everything working <3 The main issue was not assigning texture units to the sampler uniforms whenever the shaders were rebuilt 🤦. Either way, the feature works fully now. The rest that’s left before making a release is chasing some bugs that are left: e.g. crashes on Windows on startup and access violation errors when making a screenshot on fullscreen (also specifically on Windows). Below is the Joukowski function, as I briefly mentioned before in the prior devlog."}, {"post_id": 18224, "ts": "2026-06-29T09:17:52Z", "hours": 16.4414, "text": "After much, much longer than I’d like to admit, I finally got “sliced” coloring to work! Naturally we need a better name, but that can wait. A bit on implementation So, for Kolori, we use OpenGL to render scenes on the GPU. Specifically, we target at minimum desktop OpenGL 3.3, and the GLSL shaders are written for GL ES 3.0 (we plan to target WebGL in the future, maybe moving to WebGPU later. Maybe.). We implement the “slices” coloring mode as follows: The user inputs a list of colors We store these colors as a variable-length array (VLA) which can grow dynamically but, instead of giving these values to the GPU as an array, we instead upload the color data onto the GPU as a one-dimensional texture , since GLSL doesnt support VLAs (and I didn’t want to limit the amount of colors one can add). Though, I did still do that inadvertently. Slice colors are managed by color edit widgets. Each widget’s ID (which must be unique) is generated using the index of the slice color it controls, casted to a byte. Thus, the number of colors cannot exceed 256. Something I hope to fix in the future. Also, an interesting note: GLSL for GLES 3.0 doesn’t support the sampler1D type (which literally represents a 1D texture), so one would have to use the type that represents a 2D texture, but set the height of the texture to 1, to emulate the same behavior and structure. This means that there are now two textures we handle in the shaders: the image texture that holds a user-uploaded image for the “Use an Image” coloring mode, and the slices texture that holds the selected colors for the “(Pizza) Slices” coloring mode. OK, but why’d you take so long? The major obstacle that was ran into was texture data mix-up: the data for the image texture would always overwrite the data for the slices texture, and it would even seem that the two textures were pointing to the same data, even though I assigned separate texture units to each one, and made sure to set the active texture each time before binding textures. OK, can I see it? See the demo below :) They don’t really start to look like “pizza slices” until you have 5+ slices. There are some really interesting graphs you can create using this, such as the graph of the Joukowski function , defined as: f(z)=(z+1/z)/2 (unfortunately not pictured below)."}, {"post_id": 16041, "ts": "2026-06-26T02:00:22Z", "hours": 22.7831, "text": "Progress on 0.4.0 Mainly, two new features/fixes: AppImage builds for Linux (we may add .deb files in releases in the future aswell) Image aspect ratio persistence AppImage builds In past releases, only an executable was published for Linux platforms. This is not a proper solution for distribution–different Linux systems may differ in ABI, available shared libraries, and packages. For instance, on WSL in my Windows machine, SDL3 is not available in the default repository, leaving me unable to build or even run the application. AppImage builds bundle the executable and everything needed for running the application into one file–perfect for distributing. “One app = one file”, or whatever those nerds say. To run on a Linux system, users will only need to do the following: Give the .AppImage file executable permissions Run the app! Its that easy. Image aspect ratio persistence Before, when you put in an image, it would be squished down into a square, distorting the image along its longest dimension. For images with a 1:1 aspect ratio, this is fine. For other images? Not so fine. We now apply proper scaling in the vertex shader pass to textures so that image aspect ratio is preserved in the canvas. Future changes Expect a new coloring mode: “Slices” . This will split the canvas into a number of “slices”–similar to how the four quadrants of the cartesian plane split it up into four slices itself"}, {"post_id": 11476, "ts": "2026-06-18T19:13:22Z", "hours": 5.6697, "text": "I’ve finally added image coloring to Kolori! Kolori can now take an image as input, by either selecting a image file using a native file dialog or dragging and dropping a image onto the window! The image below was created using the feature–using one of the gallery images as the input image. The hard part about this was, not actually loading the image file, reading the pixel data, uploading that into the GPU, and rendering it, but instead managing the file dialog by which a user can upload an image into the application. We use SDL3 for windowing and make use of the SDL_ShowOpenFileDialog function to, well, show an open file dialog. I initially put all of the image loading and OpenGL calls into the dialog callback, but something strange happened then. All of my OpenGL calls were triggering an GL_INVALID_OPERATION error–and specifically on Windows–but why? All of my OpenGL calls were fine, no invalid arguments passed in (or in the wrong order), so everything should’ve been fine. The answer lies in the SDL_ShowOpenFileDialog and how OpenGL works with multiple threads. SDL_ShowOpenFileDialog is an asynchronous function–it will return immediately, and the result of the dialog will be passed on to the callback. However, the callback function may be called on a different thread depending on the operating system, which explains the difference in effect on Windows, and the GL_INVALID_OPERATION errors were caused by the absence of an active OpenGL context on the new thread. SDL3 does not provide an API for setting the current thread’s OpenGL context, so I had to cope. I moved most of the business logic out of the callback function, only keeping the image loading logic, and instead performed the texture uploading into the UI rendering logic, where we check if there is any new image data that happened to be uploaded, upload the data onto the GPU as a texture and show it on screen."}, {"post_id": 11058, "ts": "2026-06-18T02:57:25Z", "hours": 13.5519, "text": "Bumped version from 0.1.0 to 0.2.0! See it here: https://github.com/neroist/kolori/releases/tag/0.2.0 . Some interesting changes are that there is now a VSync toggle + a frame rate slider with support for unlimited frame rate (as much as your GPU can handle), build system improvements–so that Kolori is one make release away on all platforms that have make , and the UI is now DPI-aware and will scale based on the monitor’s DPI (we do not change scaling however if the monitor were to change–something to fix in a future release). We also changed our color input sliders to display RGB colors in their integral components from 0 to 255–what you would expect, rather than a decimal display. See it below!"}, {"post_id": 10217, "ts": "2026-06-16T20:45:34Z", "hours": 5.3461, "text": "Wrote a full-length devlog about a core feature of Kolori and its implementation, but it got deleted for being “too long”. Lets try again then, with a piece that only demands a bit of your time. Kolori offers users three (at the moment) coloring modes: HSL, HSLuv, and custom palette generation. How do these work? Custom palette generation Unlike HSL and HSLuv, using a custom palette to color the complex plane is much more simple. Kolori lets the user input four arbitrary RGB colors. We then use Inigo Quilez’s cosine-based formula for procedural palette generation to determine the color of a pixel. An article of his that describes it is here: https://iquilezles.org/articles/palettes/ . The shader code that does it all: // From https://iquilezles.org/articles/palettes/ vec4 palette ( float t , vec3 a , vec3 b , vec3 c , vec3 d ) { return vec4 ( a + b * cos ( TAU * ( c * t + d )), 1 ); } Our a , b , c , and d are the colors the user has selected, and t is an input variable to vary. However, one would notice that t is a scalar, while we work in the complex numbers. How would we map the plane onto the real line in order to get a valid t to input into palette ? The answer we chose is simple: we take the projection onto the real axis–i.e. just taking the real part of the complex number This is an answer that a user would expect and is pointed out in the user guide. Furthermore, by not choosing ahead of time for the user, we allow the user to exert more control over what they wish to generate."}, {"post_id": 9714, "ts": "2026-06-16T04:10:17Z", "hours": 12.3725, "text": "Was preparing for first our ship, but then discovered that my application was leaking memory–badly. Memory usage would climb by a gigabyte in <2 minutes. Worse than any browser you’ve ever seen. To start, I use Odin, which has a tracking allocator that lets you see where you didn’t free up memory, or perhaps made bad frees. On program exit, it prints out how many bytes you leaked, and where you made the allocations. I had been using this allocator, and it had not reported anything . Furthermore, upon, admittedly, a very cursory look into my code, I couldn’t find anything that would’ve caused any leaks either–all allocations were eventually freed: whether that be manually or via Odin’s temporary allocator (a really nice feature of the language). LSan hadn’t pointed out anything, and Valgrind didn’t report anything scary, only ~200KiB of memory usage. I had even patched myself a custom allocator, which would print to stdout whenever an allocation was made with it, and I saw nothing concerning at all . Only small allocations were made which were, again, eventually freed. My application uses SDL3 for windowing and ImGui for GUI, so perhaps one of those has a memory leak in it? I’m not sure. For such a large library, I doubt that’s the case. Though, when running valgrind with --leak-check=full --show-leak-kinds=all I did keep seeing SDL pop up, but it didn’t report any outright leaks. Upon researching potential external sources for this memory leak, I found https://github.com/libsdl-org/SDL/issues/15192 , which describes my issue exactly. It seems that there is no memory leak in SDL, ImGui, or whatever I’m doing, but instead a driver issue, which is interesting. The example that was given to reproduce the leak is quite minimal, so I wonder how that got past their testing. Furthermore, if this is indeed a driver-level issue, why is it that no other applications running on this device leak memory this egregiously? In any case, the leak is not my fault, and out of my hands."}, {"post_id": 8767, "ts": "2026-06-14T16:04:51Z", "hours": 3.8556, "text": "Learned how cool rubberducking is. I was having a problem fixing a bug with the parser (as described below), and I went to write a devlog about it. As I was describing the bug, I immediately had an idea about how to fix it, and lo and behold, it worked. The original post was going to be as follows: Fixed a bug where trailing input after the parser successfully completes is not disallowed. This most commonly occurs, as I’ve found, after the use of a comma character. The parser simply does not see it, and instead only parses the expression it sees before it. Internally, a comma character is used to delimit function arguments, so this kind of behavior is not totally useless. However, for situations like picrel, it just seems strange. doesn’t it? This usually would be an easy bug to fix. We currently use a recursive descent parser (considering moving to a pratt parser) for parsing mathematical expression. All that honestly would’ve needed to be done was adding a check at the procedure that parses the top level grammar rule: “OK, are we at the end of our input? We should be. If not, return an error.” (Here, I realized that if we literally call this procedure while parsing function calls, it really isn’t too wise to immediately ask “are we done yet?” if we very much aren’t done yet. I then added the check into a procedure that isn’t called by the parser and we should definitely be done by the time that check is ran.)"}, {"post_id": 7892, "ts": "2026-06-13T05:13:05Z", "hours": 13.1858, "text": "(excuse the amount of time, i’m doing general refactors + debugging as well as working on other features) Implemented adjusting the gamma correction amount. Normally, with the gamma correction, areas close to zero would appear black, and areas that have large magnitudes would appear white. However, you might not always want this, and instead would prefer only pure hue . Set the gamma correction amount to zero to reduce the amount that colors’ lightness values are altered. An example is shown where we use this feature to produce a colorful, moving spiral. Note that when gamma correction is not zero, as demonstrated, the effect does not work as well."}, {"post_id": 7005, "ts": "2026-06-11T19:13:46Z", "hours": 32.8386, "text": "The project has come a long way (see the 30 hours of work that went into this). We now support: arbitrary function input on-the-fly graphing and error checking a “t” time variable, allowing you to animate graphs being able to speed up, slow down, and pause animations screenshots (not imaged below) zoom in/out panning As well as being multiplatform for both Linux and Windows (you can go build and run this, right now ). What to expect: the ability to change coloring method (hsl, hsluv, palette generation) the ability to use an image for coloring WASM web builds coordinate inspector to see where exactly in the complex plane you are Check it out on github: https://github.com/neroist/kolori"}, {"post_id": 3571, "ts": "2026-06-06T15:51:37Z", "hours": 12.8247, "text": "Finally! SDL3 & the GPU shaders are working. FWIW – this is the graph of f(z)=z, the identity transformation. I will make a devlog on how these images are generated later."}]...
|
Title: Kolori by @nikooo | Stardance
Devlogs:
Fin Title: Kolori by @nikooo | Stardance
Devlogs:
Finally! SDL3 & the GPU shaders are working. FWIW – this is the graph of f(z)=z, the identity transformation. I will make a devlog on how these images are generated later.
The project has come a long way (see the 30 hours of work that went into this). We now support: arbitrary function input on-the-fly graphing and error checking a “t” time variable, allowing you to animate graphs being able to speed up, slow down, and pause animations screenshots (not imaged below) zoom in/out panning As well as being multiplatform for both Linux and Windows (you can go build and run this, right now ). What to expect: the ability to change coloring method (hsl, hsluv, palette generation) the ability to use an image for coloring WASM web builds coordinate inspector to see where exactly in the complex plane you are Check it out on github: https://github.com/neroist/kolori
(excuse the amount of time, i’m doing general refactors + debugging as well as working on other features) Implemented adjusting the gamma correction amount. Normally, with the gamma correction, areas close to zero would appear black, and areas that have large magnitudes would appear white. However, you might not always want this, and instead would prefer only pure hue . Set the gamma correction amount to zero to reduce the amount that colors’ lightness values are altered. An example is shown where we use this feature to produce a colorful, moving spiral. Note that when gamma correction is not zero, as demonstrated, the effect does not work as well.
Learned how cool rubberducking is. I was having a problem fixing a bug with the parser (as described below), and I went to write a devlog about it. As I was describing the bug, I immediately had an idea about how to fix it, and lo and behold, it worked. The original post was going to be as follows: Fixed a bug where trailing input after the parser successfully completes is not disallowed. This most commonly occurs, as I’ve found, after the use of a comma character. The parser simply does not see it, and instead only parses the expression it sees before it. Internally, a comma character is used to delimit function arguments, so this kind of behavior is not totally useless. However, for situations like picrel, it just seems strange. doesn’t it? This usually would be an easy bug to fix. We currently use a recursive descent parser (considering moving to a pratt parser) for parsing mathematical expression. All that honestly would’ve needed to be done was adding a check at the procedure that parses the top level grammar rule: “OK, are we at the end of our input? We should be. If not, return an error.” (Here, I realized that if we literally call this procedure while parsing function calls, it really isn’t too wise to immediately ask “are we done yet?” if we very much aren’t done yet. I then added the check into a procedure that isn’t called by the parser and we should definitely be done by the time that check is ran.)
Was preparing for first our ship, but then discovered that my application was leaking memory–badly. Memory usage would climb by a gigabyte in <2 minutes. Worse than any browser you’ve ever seen. To start, I use Odin, which has a tracking allocator that lets you see where you didn’t free up memory, or perhaps made bad frees. On program exit, it prints out how many bytes you leaked, and where you made the allocations. I had been using this allocator, and it had not reported anything . Furthermore, upon, admittedly, a very cursory look into my code, I couldn’t find anything that would’ve caused any leaks either–all allocations were eventually freed: whether that be manually or via Odin’s temporary allocator (a really nice feature of the language). LSan hadn’t pointed out anything, and Valgrind didn’t report anything scary, only ~200KiB of memory usage. I had even patched myself a custom allocator, which would print to stdout whenever an allocation was made with it, and I saw nothing concerning at all . Only small allocations were made which were, again, eventually freed. My application uses SDL3 for windowing and ImGui for GUI, so perhaps one of those has a memory leak in it? I’m not sure. For such a large library, I doubt that’s the case. Though, when running valgrind with --leak-check=full --show-leak-kinds=all I did keep seeing SDL pop up, but it didn’t report any outright leaks. Upon researching potential external sources for this memory leak, I found https://github.com/libsdl-org/SDL/issues/15192 , which describes my issue exactly. It seems that there is no memory leak in SDL, ImGui, or whatever I’m doing, but instead a driver issue, which is interesting. The example that was given to reproduce the leak is quite minimal, so I wonder how that got past their testing. Furthermore, if this is indeed a driver-level issue, why is it that no other applications running on this device leak memory this egregiously? In any case, the leak is not my fault, and out of my hands.
Wrote a full-length devlog about a core feature of Kolori and its implementation, but it got deleted for being “too long”. Lets try again then, with a piece that only demands a bit of your time. Kolori offers users three (at the moment) coloring modes: HSL, HSLuv, and custom palette generation. How do these work? Custom palette generation Unlike HSL and HSLuv, using a custom palette to color the complex plane is much more simple. Kolori lets the user input four arbitrary RGB colors. We then use Inigo Quilez’s cosine-based formula for procedural palette generation to determine the color of a pixel. An article of his that describes it is here: https://iquilezles.org/articles/palettes/ . The shader code that does it all: // From https://iquilezles.org/articles/palettes/ vec4 palette ( float t , vec3 a , vec3 b , vec3 c , vec3 d ) { return vec4 ( a + b * cos ( TAU * ( c * t + d )), 1 ); } Our a , b , c , and d are the colors the user has selected, and t is an input variable to vary. However, one would notice that t is a scalar, while we work in the complex numbers. How would we map the plane onto the real line in order to get a valid t to input into palette ? The answer we chose is simple: we take the projection onto the real axis–i.e. just taking the real part of the complex number This is an answer that a user would expect and is pointed out in the user guide. Furthermore, by not choosing ahead of time for the user, we allow the user to exert more control over what they wish to generate.
Bumped version from 0.1.0 to 0.2.0! See it here: https://github.com/neroist/kolori/releases/tag/0.2.0 . Some interesting changes are that there is now a VSync toggle + a frame rate slider with support for unlimited frame rate (as much as your GPU can handle), build system improvements–so that Kolori is one make release away on all platforms that have make , and the UI is now DPI-aware and will scale based on the monitor’s DPI (we do not change scaling however if the monitor were to change–something to fix in a future release). We also changed our color input sliders to display RGB colors in their integral components from 0 to 255–what you would expect, rather than a decimal display. See it below!
I’ve finally added image coloring to Kolori! Kolori can now take an image as input, by either selecting a image file using a native file dialog or dragging and dropping a image onto the window! The image below was created using the feature–using one of the gallery images as the input image. The hard part about this was, not actually loading the image file, reading the pixel data, uploading that into the GPU, and rendering it, but instead managing the file dialog by which a user can upload an image into the application. We use SDL3 for windowing and make use of the SDL_ShowOpenFileDialog function to, well, show an open file dialog. I initially put all of the image loading and OpenGL calls into the dialog callback, but something strange happened then. All of my OpenGL calls were triggering an GL_INVALID_OPERATION error–and specifically on Windows–but why? All of my OpenGL calls were fine, no invalid arguments passed in (or in the wrong order), so everything should’ve been fine. The answer lies in the SDL_ShowOpenFileDialog and how OpenGL works with multiple threads. SDL_ShowOpenFileDialog is an asynchronous function–it will return immediately, and the result of the dialog will be passed on to the callback. However, the callback function may be called on a different thread depending on the operating system, which explains the difference in effect on Windows, and the GL_INVALID_OPERATION errors were caused by the absence of an active OpenGL context on the new thread. SDL3 does not provide an API for setting the current thread’s OpenGL context, so I had to cope. I moved most of the business logic out of the callback function, only keeping the image loading logic, and instead performed the texture uploading into the UI rendering logic, where we check if there is any new image data that happened to be uploaded, upload the data onto the GPU as a texture and show it on screen.
Progress on 0.4.0 Mainly, two new features/fixes: AppImage builds for Linux (we may add .deb files in releases in the future aswell) Image aspect ratio persistence AppImage builds In past releases, only an executable was published for Linux platforms. This is not a proper solution for distribution–different Linux systems may differ in ABI, available shared libraries, and packages. For instance, on WSL in my Windows machine, SDL3 is not available in the default repository, leaving me unable to build or even run the application. AppImage builds bundle the executable and everything needed for running the application into one file–perfect for distributing. “One app = one file”, or whatever those nerds say. To run on a Linux system, users will only need to do the following: Give the .AppImage file executable permissions Run the app! Its that easy. Image aspect ratio persistence Before, when you put in an image, it would be squished down into a square, distorting the image along its longest dimension. For images with a 1:1 aspect ratio, this is fine. For other images? Not so fine. We now apply proper scaling in the vertex shader pass to textures so that image aspect ratio is preserved in the canvas. Future changes Expect a new coloring mode: “Slices” . This will split the canvas into a number of “slices”–similar to how the four quadrants of the cartesian plane split it up into four slices itself
After much, much longer than I’d like to admit, I finally got “sliced” coloring to work! Naturally we need a better name, but that can wait. A bit on implementation So, for Kolori, we use OpenGL to render scenes on the GPU. Specifically, we target at minimum desktop OpenGL 3.3, and the GLSL shaders are written for GL ES 3.0 (we plan to target WebGL in the future, maybe moving to WebGPU later. Maybe.). We implement the “slices” coloring mode as follows: The user inputs a list of colors We store these colors as a variable-length array (VLA) which can grow dynamically but, instead of giving these values to the GPU as an array, we instead upload the color data onto the GPU as a one-dimensional texture , since GLSL doesnt support VLAs (and I didn’t want to limit the amount of colors one can add). Though, I did still do that inadvertently. Slice colors are managed by color edit widgets. Each widget’s ID (which must be unique) is generated using the index of the slice color it controls, casted to a byte. Thus, the number of colors cannot exceed 256. Something I hope to fix in the future. Also, an interesting note: GLSL for GLES 3.0 doesn’t support the sampler1D type (which literally represents a 1D texture), so one would have to use the type that represents a 2D texture, but set the height of the texture to 1, to emulate the same behavior and structure. This means that there are now two textures we handle in the shaders: the image texture that holds a user-uploaded image for the “Use an Image” coloring mode, and the slices texture that holds the selected colors for the “(Pizza) Slices” coloring mode. OK, but why’d you take so long? The major obstacle that was ran into was texture data mix-up: the data for the image texture would always overwrite the data for the slices texture, and it would even seem that the two textures were pointing to the same data, even though I assigned separate texture units to each one, and made sure to set the active texture each time before binding textures. OK, can I see it? See the demo below :) They don’t really start to look like “pizza slices” until you have 5+ slices. There are some really interesting graphs you can create using this, such as the graph of the Joukowski function , defined as: f(z)=(z+1/z)/2 (unfortunately not pictured below).
Managed to get everything working <3 The main issue was not assigning texture units to the sampler uniforms whenever the shaders were rebuilt 🤦. Either way, the feature works fully now. The rest that’s left before making a release is chasing some bugs that are left: e.g. crashes on Windows on startup and access violation errors when making a screenshot on fullscreen (also specifically on Windows). Below is the Joukowski function, as I briefly mentioned before in the prior devlog.
Ships:
Kolori is a desktop application that lets you create beautiful pieces of art from mathematical expressions. Kolori features a custom hand-written recursive descent parser to parse mathematical expressions–which it then uses to transpile your input down to low-level shader instructions to render images to the screen on the GPU. Kolori also supports rendering not only images, but animations using the “ t ” variable in the input expression, which grows linearly with time elapsed–the speed at which is adjustable. Kolori offers four coloring modes that can generate different images based on your input: HSL : Uses the HSL color space to generate pixel colors HSLuv : Uses the HSLuv color space, a perceptually uniform alternative to HSL, to generate pixel colors Custom Palette Generation : Input 4 colors of your choosing so Kolori can generate a custom color palette based on them, to determine pixel colors Use an Image : Select an image using your file manager, or just drag and drop one onto the window for Kolori to sample pixel colors from the input image to determine pixel colors. Making this project was a bit of an adventure, as I had never worked with libraries such as ImGui, SDL, and OpenGL before. The biggest challenge when creating the program was managing memory correctly–which makes me appreciate languages like Nim even more–and code organization....
|
1793281864.7149155
|
1793368264.7149155
|
|
7575
|
My awesome macropad! by @manyabanavar | Stardance
|
manyabanavar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @manyabanavar | Sta Title: My awesome macropad! by @manyabanavar | Stardance...
|
1792730945.7853582
|
1793335745.7853582
|
|
7576
|
My awesome macropad! by @mwang18 | Stardance
|
mwang18
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @mwang18 | Stardanc Title: My awesome macropad! by @mwang18 | Stardance...
|
1793256588.5928295
|
1793861388.5928295
|
|
7577
|
Sonora Music by @Samuel-Dingle | Stardance
|
Samuel-Dingle
|
1
|
15.0
|
112
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:34:20Z", "hours": 15.0, "multiplier": 7.41, "payout": 112, "blessing": "neutral", "text": "I built a macOS native music app called Sonora Music. It is designed to be a simple music player for local files. It uses Apple’s own AV Frameworks in order to be lightweight. The main thing I found challenging at the start was configuring all of the rust code to get actual audio playback. After some reading and a bit of help from AI, I was able to get a basic player, from which I scaled up with Shuffle, Repeat, a working playbar that supports scrubbing, and a queue system. To try out the project, just click the try project button and download the latest release from github. I have included 2 songs to test the app with!", "repo": "https://github.com/TheApparition1/Sonora-Music", "demo": "https://github.com/TheApparition1/Sonora-Music/releases"}]...
|
[{"post_id": 71504, "ts": "202 [{"post_id": 71504, "ts": "2026-09-20T23:07:40Z", "hours": 1.9058, "text": "Devlog 7 - Sonora Music I decided that with so little time left with Stardance, it wasn’t worth migrating to a new audio engine, especially with all the testing that would have to be done. I ended up deciding to just clean up the app, fix some small errors and making general fixes here and there. Here’s a short list of some bugs I fixed: Fixed a loud bang when spamming skip or closing the app with media playing The app being unable to select directories with only one file Broken UI theme selection Other than that, I’ve just spent time on rewording the readme and making the DMG background and App logo to prepare for shipping the app. Of course in typical developer logic, the build command just has to break, only for me to spend time debugging a missing image file."}, {"post_id": 52821, "ts": "2026-08-23T05:24:42Z", "hours": 2.95, "text": "Devlog 6 - Sonora Music So I left this project alone for a while to focus on other things, but i’m back! I ended up fixing a few bugs here and there, and removing 2 themes I thought didn’t look great. I also added a fallback for that, so if you were using Sonora with that theme, and updated, your app won’t break. I fixed a few memory leaks, mostly because I fell victim to a bunch of them while writing code and testing things. From what I can tell, it was because AVAudioPlayer wasn’t properly releasing itself. This meant that more instances accumulated over time, eating up more RAM and CPU. I also did some visual polishing, by cleaning up unnecessary icons I added, and also just making the UI more refined. I pinned the playbar and controls to the bottom of the screen so that you can always see the controls, and fixed the broken color swatches for the themes so you can see what you are applying. I’m getting close to being ready to ship this project, all I really have left to do is to decide if migrating to AVAudioEngine is worth it as it is an extremely intensive task, and will require lots of tedious work and debugging. The other thing I’ll consider is writing a windows build in Symphonia or some other thing so that this can be cross platform. The main reason I am migrating is so that I can have more refined control of the signal chain and DSP (The chain that your audio passes through and how it is modified, say for an EQ). AVAudioPlayer is designed to just play audio easily, where I want more control and be able to implement the ability to add EQ down the line to further enhance the experience. Hopefully the migration goes well, and I should be able to ship in the next week or two."}, {"post_id": 22506, "ts": "2026-07-05T00:38:03Z", "hours": 4.9175, "text": "Sonora Music – Pain Edition After a week of absolute debugging hell, I finally located and fixed an issue that prevented audio from playing entirely. That took up most of my week, and I also forgot to reinstall Wakatime after I reset my laptop and lost 2-3 hrs there :( While I was at it, I also added Shuffle and Repeat functionality, making the player a bit nicer to use. I’m currently experimenting with a few UI prototypes because I’d really like to add proper playlist creation and management in the future. In terms of releases, I uploaded the first version to GitHub, then realised I built my backup one that didn’t have shuffle and repeat, or the customisation. After uploading the correct build, my next steps are just to update the Sonora Website (another Stardance project ofc) Here’s what I want to tackle next: Migrate the audio system to AVAudioEngine so I can implement more advanced audio features. Add a 3-band EQ (This is why I need to migrate over to AVAudioEngine, as my current AVF Framework doesn’t have support for these types of things or DSP in general). Implement a proper library and playlist view. Create a few custom themes which are similar to the current palette. Add a dedicated Settings page for things like themes, EQ controls, and other app parameters to keep the main UI less cluttered. Overall, this update was mostly focused on bug fixes and polishing. Aside from the features above, I also designed a custom application logo and branded the DMG installer with a custom Sonora Music background, replacing the plain white installer window with something that actually matches the application’s style. Hopefully, the next devlog is a little less about debugging and a little more about adding new features. Maybe? Please???"}, {"post_id": 12851, "ts": "2026-06-21T01:30:51Z", "hours": 1.2872, "text": "I was able to add a working play bar to the app and got the controls to work so that you are now able to skip forward and back songs. I now want to remove that scroll bar on the side and pin the play controls to the bottom of the screen."}, {"post_id": 12428, "ts": "2026-06-20T08:53:34Z", "hours": 0.7778, "text": "So I decided to pivot the whole application to be macOS native by using AVFoundation for Audio. I had too many issues with rodio which is used with rust. While this means it is only for macOS users, it does mean that I can focus on creating for only one OS, and I can develop easier and better. After implementing AVFoundation I am able to select a song using the UI I developed earlier, and then play the song. The next step is to add player controls and a time bar, and work on adding a shuffle feature."}, {"post_id": 12396, "ts": "2026-06-20T07:11:11Z", "hours": 0.4494, "text": "I added logic to select a folder for music and have it list the songs in the folder! I’m now going to add the ability to play music back"}, {"post_id": 11065, "ts": "2026-06-18T03:15:52Z", "hours": 2.8081, "text": "I added the main UI as a mockup. This is only the first page, the player window. Eventually I will add a few more pages and only after will I write the logic to play music."}]...
|
Title: Sonora Music by @Samuel-Dingle | Stardance
Title: Sonora Music by @Samuel-Dingle | Stardance
Devlogs:
I added the main UI as a mockup. This is only the first page, the player window. Eventually I will add a few more pages and only after will I write the logic to play music.
I added logic to select a folder for music and have it list the songs in the folder! I’m now going to add the ability to play music back
So I decided to pivot the whole application to be macOS native by using AVFoundation for Audio. I had too many issues with rodio which is used with rust. While this means it is only for macOS users, it does mean that I can focus on creating for only one OS, and I can develop easier and better. After implementing AVFoundation I am able to select a song using the UI I developed earlier, and then play the song. The next step is to add player controls and a time bar, and work on adding a shuffle feature.
I was able to add a working play bar to the app and got the controls to work so that you are now able to skip forward and back songs. I now want to remove that scroll bar on the side and pin the play controls to the bottom of the screen.
Sonora Music – Pain Edition After a week of absolute debugging hell, I finally located and fixed an issue that prevented audio from playing entirely. That took up most of my week, and I also forgot to reinstall Wakatime after I reset my laptop and lost 2-3 hrs there :( While I was at it, I also added Shuffle and Repeat functionality, making the player a bit nicer to use. I’m currently experimenting with a few UI prototypes because I’d really like to add proper playlist creation and management in the future. In terms of releases, I uploaded the first version to GitHub, then realised I built my backup one that didn’t have shuffle and repeat, or the customisation. After uploading the correct build, my next steps are just to update the Sonora Website (another Stardance project ofc) Here’s what I want to tackle next: Migrate the audio system to AVAudioEngine so I can implement more advanced audio features. Add a 3-band EQ (This is why I need to migrate over to AVAudioEngine, as my current AVF Framework doesn’t have support for these types of things or DSP in general). Implement a proper library and playlist view. Create a few custom themes which are similar to the current palette. Add a dedicated Settings page for things like themes, EQ controls, and other app parameters to keep the main UI less cluttered. Overall, this update was mostly focused on bug fixes and polishing. Aside from the features above, I also designed a custom application logo and branded the DMG installer with a custom Sonora Music background, replacing the plain white installer window with something that actually matches the application’s style. Hopefully, the next devlog is a little less about debugging and a little more about adding new features. Maybe? Please???
Devlog 6 - Sonora Music So I left this project alone for a while to focus on other things, but i’m back! I ended up fixing a few bugs here and there, and removing 2 themes I thought didn’t look great. I also added a fallback for that, so if you were using Sonora with that theme, and updated, your app won’t break. I fixed a few memory leaks, mostly because I fell victim to a bunch of them while writing code and testing things. From what I can tell, it was because AVAudioPlayer wasn’t properly releasing itself. This meant that more instances accumulated over time, eating up more RAM and CPU. I also did some visual polishing, by cleaning up unnecessary icons I added, and also just making the UI more refined. I pinned the playbar and controls to the bottom of the screen so that you can always see the controls, and fixed the broken color swatches for the themes so you can see what you are applying. I’m getting close to being ready to ship this project, all I really have left to do is to decide if migrating to AVAudioEngine is worth it as it is an extremely intensive task, and will require lots of tedious work and debugging. The other thing I’ll consider is writing a windows build in Symphonia or some other thing so that this can be cross platform. The main reason I am migrating is so that I can have more refined control of the signal chain and DSP (The chain that your audio passes through and how it is modified, say for an EQ). AVAudioPlayer is designed to just play audio easily, where I want more control and be able to implement the ability to add EQ down the line to further enhance the experience. Hopefully the migration goes well, and I should be able to ship in the next week or two.
Devlog 7 - Sonora Music I decided that with so little time left with Stardance, it wasn’t worth migrating to a new audio engine, especially with all the testing that would have to be done. I ended up deciding to just clean up the app, fix some small errors and making general fixes here and there. Here’s a short list of some bugs I fixed: Fixed a loud bang when spamming skip or closing the app with media playing The app being unable to select directories with only one file Broken UI theme selection Other than that, I’ve just spent time on rewording the readme and making the DMG background and App logo to prepare for shipping the app. Of course in typical developer logic, the build command just has to break, only for me to spend time debugging a missing image file.
Ships:
I built a macOS native music app called Sonora Music. It is designed to be a simple music player for local files. It uses Apple’s own AV Frameworks in order to be lightweight. The main thing I found challenging at the start was configuring all of the rust code to get actual audio playback. After some reading and a bit of help from AI, I was able to get a basic player, from which I scaled up with Shuffle, Repeat, a working playbar that supports scrubbing, and a queue system. To try out the project, just click the try project button and download the latest release from github. I have included 2 songs to test the app with!...
|
1793339254.2654974
|
1793425654.2654974
|
|
7578
|
DestroyReddit by @Xavier | Stardance
|
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: DestroyReddit by @Xavier | Stardance
|
1793368257.0156534
|
1793973057.0156534
|
|
7579
|
My awesome macropad! by @dopey | Stardance
|
dopey
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @dopey | Stardance
|
1792702238.2088604
|
1793307038.2088604
|
|
7580
|
Water blowtorch by @Observer_red | Stardance
|
Observer_red
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Water blowtorch by @Observer_red | Stardanc Title: Water blowtorch by @Observer_red | Stardance...
|
1793321815.5282335
|
1793926615.5282335
|
|
7581
|
Dungeon Quest by @JaguarTortle | Stardance
|
JaguarTortle
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Dungeon Quest by @JaguarTortle | Stardance
|
1792716596.6339056
|
1793321396.6339056
|
|
7582
|
DIY Calculator by @iluvthings | Stardance
|
iluvthings
|
0
|
2.42
|
0
|
[]
|
[{"post_id": 12307, "ts": "202 [{"post_id": 12307, "ts": "2026-06-20T02:40:22Z", "hours": 0.6431, "text": "I added a new symbol and footprint for my display that I found in the following forum: https://forum.kicad.info/t/symbol-for-ili9341-320x240-lcd-with-touch/39123/2 And I also do the wiring for the button matrix."}, {"post_id": 5932, "ts": "2026-06-09T22:16:26Z", "hours": 1.7719, "text": "I’m working on a DIY calculator with ChatGPT on it. I will use an API of this LLM so I can use it in a Xiao Studio ESP32 S3 board with WiFi. I will also use a 2.8” TFT for the display and a button matrix for the input. I will make the calculator switch from ChatGPT to normal mode with a secret code or sum like that. I have just begun this project; I’m currently working on the PCB (my first PCB, btw)."}]...
|
Title: DIY Calculator by @iluvthings | Stardance
Title: DIY Calculator by @iluvthings | Stardance
Devlogs:
I’m working on a DIY calculator with ChatGPT on it. I will use an API of this LLM so I can use it in a Xiao Studio ESP32 S3 board with WiFi. I will also use a 2.8” TFT for the display and a button matrix for the input. I will make the calculator switch from ChatGPT to normal mode with a secret code or sum like that. I have just begun this project; I’m currently working on the PCB (my first PCB, btw).
I added a new symbol and footprint for my display that I found in the following forum: https://forum.kicad.info/t/symbol-for-ili9341-320x240-lcd-with-touch/39123/2 And I also do the wiring for the button matrix....
|
1793227683.4399729
|
1793832483.4399729
|
|
7583
|
TI-84 RAM cleaner by @Thepuffinmaster43 | Stardanc TI-84 RAM cleaner by @Thepuffinmaster43 | Stardance...
|
Thepuffinmaster43
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: TI-84 RAM cleaner by @Thepuffinmaster43 | S Title: TI-84 RAM cleaner by @Thepuffinmaster43 | Stardance...
|
1792767159.9582522
|
1793371959.9582522
|
|
7584
|
Syzygy by @locoexe49 | Stardance
|
locoexe49
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Syzygy by @locoexe49 | Stardance
|
1793404353.171613
|
1794009153.171613
|
|
7585
|
My awesome macropad! by @nanditha_shankar09 | Star My awesome macropad! by @nanditha_shankar09 | Stardance...
|
nanditha_shankar09
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @nanditha_shankar09 Title: My awesome macropad! by @nanditha_shankar09 | Stardance...
|
1793224267.2487671
|
1793829067.2487671
|
|
7586
|
Python Examples by @Vedant_Daga | Stardance
|
Vedant_Daga
|
1
|
13.0
|
182
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T19:47:44Z", "hours": 13.0, "multiplier": 14.37, "payout": 182, "blessing": "neutral", "text": "## Learn Python, an interactive course that runs in your browser ### What I made A full beginner Python course that runs in the browser, no downloads or setup. 28 lessons across 7 units, from your first program up to 2D lists. Each lesson has the concept, a runnable code example, two practice tasks, a quiz, and a mini project. Theres a built in editor running real Python, accounts that save your progress, and AI that checks your practice code and gives real feedback. ### What was challenging The AI grading. I didnt want my API key in the browser, so I moved it to a Supabase function that keeps it server side, then added rate limiting and caching so nobody could spam it or run up my bill. The free preview was tricky too. Progress and AI grading need a logged in user, so I had to split which features work signed out (reading, running code, quizzes) vs signed in (save and AI check) without breaking anything. ### What Im proud of Im proud that this feels like a real product, not a school project. Code runs in the browser with no server, the AI feedback is actually helpful, and anyone can try it in like 10 seconds. ### How to test it Just click the Try Project Button 1. The first two lessons are free, no account. Read one, write Python in the editor and hit run, take the quiz. 2. Want the rest? Make a free account (any email). That unlocks all 28 lessons and the AI feedback. 3. For the AI grading, go to a practice task, write your code, and hit Check. No cloning or commands needed, it all works on the live site. Thanks for checking it out!!! FYI: I'm only asking for an email to make sure that my API bill doesn't get out of hand because I don't want bots, hence email protection, your data is safe don't worry Image is of the AI Feedback and the in-built code editor", "repo": "https://github.com/DagaVedant/Python-Examples", "demo": "https://dagavedant.github.io/Python-Examples/"}]...
|
[{"post_id": 11270, "ts": "202 [{"post_id": 11270, "ts": "2026-06-18T13:02:52Z", "hours": 0.0, "text": "so signups were just breaking with “email rate limit exceeded” and i couldn’t figure out why for a bit. turns out supabase sends a confirmation email every single time someone signs up, and the free email thing only lets you send like2 an hour. so once a couple people tried it, it was dead for everyone else lol. for now i just turned off the email confirmation so accounts get made right away with no email, and made it drop you straight into the course after. gonna hookup a real SMTP (probably resend) later so i can turn verification back on without it blowing up again."}, {"post_id": 10756, "ts": "2026-06-17T17:26:31Z", "hours": 0.0, "text": "just figured out why “create account” wasn’t working….turns out we needed a proper signup page instead of jamming everything into login. built a new dedicated page and made sure that the demo goes to the signUP page"}, {"post_id": 10091, "ts": "2026-06-16T17:55:15Z", "hours": 0.0, "text": "Devlog: getting ready to ship Spent this session getting everything ready to ship. Turns out “it works on my machine” and “a random person can actually try it” are super different things lol. Free preview so people can actually try it Biggest problem was the whole site was locked behind a login. If someone clicked the link they just hit a sign in wall, which is basically the fastest way to make people leave. So I made the first two lessons (Unit 1 lesson 1 and 1.2) totally free, no account needed. Now if your signed out: The homepage loads like normal instead of throwing you to the login page The free lessons open up so you can read them, run real Python in the browser, and take the quiz Every other lesson has a little lock icon and sends you to login Save and Check still ask you to sign in since those need an account (progress and the AI grading are tied to your user) Best part is running code and the quizzes already worked without an account, so the free preview actually feels real and not just a teaser. Pretty happy with how that turned out. Lock icons on the homepage Added some logic so signed out people see a lock on the lessons they cant open yet, plus a “Free preview, sign in to unlock all lessons” message at the top. The free ones keep the normal arrow so its obvious which ones you can actually click. Fixed the README My old README was kinda lying at this point lol. It said “no server needed” and “all your data stays locally” which used to be true but isnt anymore now that I got Supabase doing accounts, progress syncing, and AI grading. So I rewrote the whole thing to actually match what the project does, threw the live demo link right at the top, and explained how the free preview works. What I checked Made sure my OpenAI key never got committed (its gitignored and the grading function reads it server side only) Tested the signed out flow in an incognito window so I could see exactly what a new visitor sees Feeling really good about where its at now. Basically just doing one last check over everything before I actually ship it!!!"}, {"post_id": 6837, "ts": "2026-06-11T13:59:38Z", "hours": 3.0, "text": "Deleted 24,000 Lines, Added a Python IDE, and Made AI Grade Your Code Big update. Since last time, the site went from 27 copy-pasted lesson pages to one dynamic page , got a real Python editor that runs in the browser , and now has an AI that checks your practice answers and gives you hints . The Great Deletion Every lesson used to be its own 907-line HTML file. 27 of them. All basically identical. Changing one button meant changing it 27 times, which I was obviously never going to do. So I merged them into one lesson.html that reads ?unit=2&lesson=3 from the URL and imports that lesson’s data.js dynamically. 29 files changed, 25 insertions(+), 24498 deletions(-) Deleted 24,498 lines! Best commit ever. The IDE Next, I replaced the static code examples with an actual editor ( CodeMirror ) plus Python running in the browser through Pyodide . No server, because the code runs on your own machine. Then I added it to the practice questions too: every question gets its own mini IDE with Run + Save , and saves go to Supabase so your code is still there when you come back. This took way more bug fixing than expected. There was a cursed '\\n' error, the editor kept breaking when switching themes, and long lines ran off the screen until I added line wrapping. Like 5 commits of just fixing the editor (help me). The AI Checker The big one. There is now a Check button next to Run that has gpt-4o-mini grade your code: ✗ Almost! Your scoreboard only prints one player. Hint: you need a second print() line for the second player. The site is fully static, so I couldn’t just put an API key in the frontend (the whole internet would spend my credits). Instead, the code and its output get sent to a Supabase Edge Function , which hides the key, checks that you’re logged in, and asks OpenAI for a strict JSON verdict: passed, feedback, hint . I compared Gemini and Ollama first, but went with OpenAI because I have $5 of credits left from a previous grant. And since I don’t want to overuse my credits: 5 checks per minute and 500 per day per user, 1,400 per day for the whole app. Next up: grading notes per question so the AI knows exactly what each task wants, and maybe an admin dashboard to watch usage."}, {"post_id": 6041, "ts": "2026-06-10T04:42:41Z", "hours": 1.0, "text": "Progress now saves to the cloud!!! Ripped out localStorage and replaced it with Supabase so lesson completions are now tied to your account, not your browser. You can now sign in on any device and your progress is tracked there too. I had to change 30 DIFFERENT FILES JUST TO ADD THIS, but hey its working properly now and its another BIG step towards making a full learning platform…you guys can now try it!!!!!!!"}, {"post_id": 4428, "ts": "2026-06-07T19:04:50Z", "hours": 3.0, "text": "JUST ADDED UNITS 4, 5, 6, AND 7!!!!!!!!! The course is officially 27 lessons in total. I also made an actual home page that lists every unit and lesson so it’s easier to use the course without having to open tons of random files. My favorite part of everything was adding the lesson completion tracking. Basically each lesson has a “Mark as complete” button which then saves everything to a localStorage. No backend needed (thank god).. Also the homepage now shows all the finished lessons in green, and also has an overall progress bar showing how far someone is through all 27 lessons. I MAY have spent way too much time trying to figure out why it kept showing an Error 404 when clicking through different lessons. I checked the JS, checked all the paths, and then rewrote all the href logic. Turns out a browser can’t handle spaces in folder names over file://. I just wrapped the path in encodeURI(). MAY have spent an hour tryna debug this but it works so yayyaya!!! Gonna deploy to GitHub Pages so it’s a real URL, add a quiz score tracker so students can see how they’re doing across the whole course, and maybe create an account system so people can track everything, but its not fixed yet so keep looking"}, {"post_id": 3653, "ts": "2026-06-06T18:05:51Z", "hours": 0.0, "text": "JUST FINISHED UNIT 3 AND MADE A PROPER README!!!!!!!!! Just finished all 4 lessons for unit 3 today: comparisons and booleans if/else elif chains combining conditions with and/or/not Each one is fully complete with a goal, explanation, an example code, practice questions, a quiz, and a project. the projects are actually pretty fun (BMI calculator, theme park entry checker, and even more…you should check the repo out frfr) Also just added a full README to show the entire course, what it covers, what each lesson has, how the file system works, and a full breakdown of every single unit, every lesson, and every project. Right now the course is sitting at 7 units, 27 lessons, 27 projects and 54 practice tasks total. Just finished unit 3, FOUR MORE TO GO!!!"}, {"post_id": 3620, "ts": "2026-06-06T17:01:06Z", "hours": 1.0, "text": "JUST FINISHED UNIT TWO!!! also organized the files into a data.js file and a lesson.html file for each lesson. check my github for the latest updatesssssss"}, {"post_id": 3266, "ts": "2026-06-06T03:38:12Z", "hours": 0.0, "text": "JUST CREATED UNIT ONE!!!!!! just some basic print(), input(), different variables, and casting"}, {"post_id": 2979, "ts": "2026-06-05T22:10:55Z", "hours": 0.0, "text": "Just created the entire lesson plan for my course and JUST LEARNED HOW TO USE FIGMA!!!! I’m lowk just used Figma for the website design"}]...
|
Title: Python Examples by @Vedant_Daga | Stardance Title: Python Examples by @Vedant_Daga | Stardance
Devlogs:
Just created the entire lesson plan for my course and JUST LEARNED HOW TO USE FIGMA!!!! I’m lowk just used Figma for the website design
JUST CREATED UNIT ONE!!!!!! just some basic print(), input(), different variables, and casting
JUST FINISHED UNIT TWO!!! also organized the files into a data.js file and a lesson.html file for each lesson. check my github for the latest updatesssssss
JUST FINISHED UNIT 3 AND MADE A PROPER README!!!!!!!!! Just finished all 4 lessons for unit 3 today: comparisons and booleans if/else elif chains combining conditions with and/or/not Each one is fully complete with a goal, explanation, an example code, practice questions, a quiz, and a project. the projects are actually pretty fun (BMI calculator, theme park entry checker, and even more…you should check the repo out frfr) Also just added a full README to show the entire course, what it covers, what each lesson has, how the file system works, and a full breakdown of every single unit, every lesson, and every project. Right now the course is sitting at 7 units, 27 lessons, 27 projects and 54 practice tasks total. Just finished unit 3, FOUR MORE TO GO!!!
JUST ADDED UNITS 4, 5, 6, AND 7!!!!!!!!! The course is officially 27 lessons in total. I also made an actual home page that lists every unit and lesson so it’s easier to use the course without having to open tons of random files. My favorite part of everything was adding the lesson completion tracking. Basically each lesson has a “Mark as complete” button which then saves everything to a localStorage. No backend needed (thank god).. Also the homepage now shows all the finished lessons in green, and also has an overall progress bar showing how far someone is through all 27 lessons. I MAY have spent way too much time trying to figure out why it kept showing an Error 404 when clicking through different lessons. I checked the JS, checked all the paths, and then rewrote all the href logic. Turns out a browser can’t handle spaces in folder names over file://. I just wrapped the path in encodeURI(). MAY have spent an hour tryna debug this but it works so yayyaya!!! Gonna deploy to GitHub Pages so it’s a real URL, add a quiz score tracker so students can see how they’re doing across the whole course, and maybe create an account system so people can track everything, but its not fixed yet so keep looking
Progress now saves to the cloud!!! Ripped out localStorage and replaced it with Supabase so lesson completions are now tied to your account, not your browser. You can now sign in on any device and your progress is tracked there too. I had to change 30 DIFFERENT FILES JUST TO ADD THIS, but hey its working properly now and its another BIG step towards making a full learning platform…you guys can now try it!!!!!!!
Deleted 24,000 Lines, Added a Python IDE, and Made AI Grade Your Code Big update. Since last time, the site went from 27 copy-pasted lesson pages to one dynamic page , got a real Python editor that runs in the browser , and now has an AI that checks your practice answers and gives you hints . The Great Deletion Every lesson used to be its own 907-line HTML file. 27 of them. All basically identical. Changing one button meant changing it 27 times, which I was obviously never going to do. So I merged them into one lesson.html that reads ?unit=2&lesson=3 from the URL and imports that lesson’s data.js dynamically. 29 files changed, 25 insertions(+), 24498 deletions(-) Deleted 24,498 lines! Best commit ever. The IDE Next, I replaced the static code examples with an actual editor ( CodeMirror ) plus Python running in the browser through Pyodide . No server, because the code runs on your own machine. Then I added it to the practice questions too: every question gets its own mini IDE with Run + Save , and saves go to Supabase so your code is still there when you come back. This took way more bug fixing than expected. There was a cursed '\n' error, the editor kept breaking when switching themes, and long lines ran off the screen until I added line wrapping. Like 5 commits of just fixing the editor (help me). The AI Checker The big one. There is now a Check button next to Run that has gpt-4o-mini grade your code: ✗ Almost! Your scoreboard only prints one player. Hint: you need a second print() line for the second player. The site is fully static, so I couldn’t just put an API key in the frontend (the whole internet would spend my credits). Instead, the code and its output get sent to a Supabase Edge Function , which hides the key, checks that you’re logged in, and asks OpenAI for a strict JSON verdict: passed, feedback, hint . I compared Gemini and Ollama first, but went with OpenAI because I have $5 of credits left from a previous grant. And since I don’t want to overuse my credits: 5 checks per minute and 500 per day per user, 1,400 per day for the whole app. Next up: grading notes per question so the AI knows exactly what each task wants, and maybe an admin dashboard to watch usage.
Devlog: getting ready to ship Spent this session getting everything ready to ship. Turns out “it works on my machine” and “a random person can actually try it” are super different things lol. Free preview so people can actually try it Biggest problem was the whole site was locked behind a login. If someone clicked the link they just hit a sign in wall, which is basically the fastest way to make people leave. So I made the first two lessons (Unit 1 lesson 1 and 1.2) totally free, no account needed. Now if your signed out: The homepage loads like normal instead of throwing you to the login page The free lessons open up so you can read them, run real Python in the browser, and take the quiz Every other lesson has a little lock icon and sends you to login Save and Check still ask you to sign in since those need an account (progress and the AI grading are tied to your user) Best part is running code and the quizzes already worked without an account, so the free preview actually feels real and not just a teaser. Pretty happy with how that turned out. Lock icons on the homepage Added some logic so signed out people see a lock on the lessons they cant open yet, plus a “Free preview, sign in to unlock all lessons” message at the top. The free ones keep the normal arrow so its obvious which ones you can actually click. Fixed the README My old README was kinda lying at this point lol. It said “no server needed” and “all your data stays locally” which used to be true but isnt anymore now that I got Supabase doing accounts, progress syncing, and AI grading. So I rewrote the whole thing to actually match what the project does, threw the live demo link right at the top, and explained how the free preview works. What I checked Made sure my OpenAI key never got committed (its gitignored and the grading function reads it server side only) Tested the signed out flow in an incognito window so I could see exactly what a new visitor sees Feeling really good about where its at now. Basically just doing one last check over everything before I actually ship it!!!
just figured out why “create account” wasn’t working….turns out we needed a proper signup page instead of jamming everything into login. built a new dedicated page and made sure that the demo goes to the signUP page
so signups were just breaking with “email rate limit exceeded” and i couldn’t figure out why for a bit. turns out supabase sends a confirmation email every single time someone signs up, and the free email thing only lets you send like2 an hour. so once a couple people tried it, it was dead for everyone else lol. for now i just turned off the email confirmation so accounts get made right away with no email, and made it drop you straight into the course after. gonna hookup a real SMTP (probably resend) later so i can turn verification back on without it blowing up again.
Ships:
## Learn Python, an interactive course that runs in your browser ### What I made A full beginner Python course that runs in the browser, no downloads or setup. 28 lessons across 7 units, from your first program up to 2D lists. Each lesson has the concept, a runnable code example, two practice tasks, a quiz, and a mini project. Theres a built in editor running real Python, accounts that save your progress, and AI that checks your practice code and gives real feedback. ### What was challenging The AI grading. I didnt want my API key in the browser, so I moved it to a Supabase function that keeps it server side, then added rate limiting and caching so nobody could spam it or run up my bill. The free preview was tricky too. Progress and AI grading need a logged in user, so I had to split which features work signed out (reading, running code, quizzes) vs signed in (save and AI check) without breaking anything. ### What Im proud of Im proud that this feels like a real product, not a school project. Code runs in the browser with no server, the AI feedback is actually helpful, and anyone can try it in like 10 seconds. ### How to test it Just click the Try Project Button 1. The first two lessons are free, no account. Read one, write Python in the editor and hit run, take the quiz. 2. Want the rest? Make a free account (any email). That unlocks all 28 lessons and the AI feedback. 3. For the AI grading, go to a practice task, write your code, and hit Check. No cloning or commands needed, it all works on the live site. Thanks for checking it out!!! FYI: I'm only asking for an email to make sure that my API bill doesn't get out of hand because I don't want bots, hence email protection, your data is safe don't worry Image is of the AI Feedback and the in-built code editor...
|
1792882054.368967
|
1793746054.368967
|
|
7587
|
My awesome macropad! by @SpikyHighVirus | Stardanc My awesome macropad! by @SpikyHighVirus | Stardance...
|
SpikyHighVirus
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @SpikyHighVirus | S Title: My awesome macropad! by @SpikyHighVirus | Stardance...
|
1793253183.9517448
|
1793857983.9517448
|
|
7588
|
Yo-Yo Fu by @benMakesStuff | Stardance
|
benMakesStuff
|
0
|
10.23
|
0
|
[]
|
[{"post_id": 14095, "ts": "202 [{"post_id": 14095, "ts": "2026-06-23T02:31:05Z", "hours": 1.1878, "text": "Got the main menu working (the quit and start button) and it now has nice text/logo thing, and a bg for the main menu (made with AI). And also worked on getting more charcters."}, {"post_id": 11076, "ts": "2026-06-18T03:34:21Z", "hours": 0.9653, "text": "Made and organized the README.md, to be more professional and document all of the project better."}, {"post_id": 10929, "ts": "2026-06-17T22:13:40Z", "hours": 1.7839, "text": "I worked on getting the yo-yo to show up in the player’s hand and launch properly, but it was pretty confusing and I ended up with a lot of errors and a non-working yo-yo. I also worked on the file structure; my files were scattered all over the place, so I asked an AI how to organize them using Boomerang Fu as a reference, and I did what I could with that. Finally, I started working on the main menu UI to make it look a bit more finished, even though it’s still far from it!"}, {"post_id": 7338, "ts": "2026-06-12T07:31:06Z", "hours": 1.0008, "text": "Big update for the main character! The cactus finally got a glow-up with a cute head flower, eyes, a mouth, and proper spikes. Even better, basic movement is officially live. You can now move and dash, and the character smoothly turns toward your movement direction (just like the best game in history: Boomerang fu)."}, {"post_id": 6704, "ts": "2026-06-11T07:22:58Z", "hours": 0.8689, "text": "Made the chcarter move in godot, and it looks kinda amazing. But its is still really plain and i dont know a lot of stuff so its basically nothing."}, {"post_id": 5971, "ts": "2026-06-10T00:31:00Z", "hours": 0.9847, "text": "I have started using Godot tp get the game into an actual game engine. Its my first time using it so its not going relly well, its really slow and stuff, but i am getting better. I have also started using Blockbench for 3d modelling my characters and i have been trying to model this character (the cactus) for around 2 hours but Lapse kinda glitched and didnt count them (it just said server error). But i am getting better at blockbench"}, {"post_id": 5237, "ts": "2026-06-08T22:59:44Z", "hours": 0.8228, "text": "So now there is animations, and there is one character, the cactus. and i have also made yoyos and their spining animations. But i still havent decided if i should use smooth surfaces or pixelated, and if i should be using an actual game engine for it. I will do that later when i have a clear idea of what i am doing, but for now its looking pretty good. and i am still trying to figure out how to make the bounces work, right now they are really bad."}, {"post_id": 4646, "ts": "2026-06-08T01:40:19Z", "hours": 0.5947, "text": "Added more Yoyo functions to make the yoyo movement better including: Bounces to walls Recalling (bring the yoyo back before max lenght) And added more central keys for the throwing/moving/aiming and added an aim preview before throwing"}, {"post_id": 4612, "ts": "2026-06-08T00:00:00Z", "hours": 1.0489, "text": "I added controls through an actual controler and now it is able to shoot yoyos and the collisions actually work too. The controls are: Left joystick - movement A (nintendo) - Shoot/Aim and if aiming left joystick works just like it I am thinking now to add better maping and UI, or the actual animations."}, {"post_id": 3285, "ts": "2026-06-06T04:25:10Z", "hours": 0.9694, "text": "A game inspired by Boomerang Fu, but instead of Boomerangs, Yoyos"}]...
|
Title: Yo-Yo Fu by @benMakesStuff | Stardance
Dev Title: Yo-Yo Fu by @benMakesStuff | Stardance
Devlogs:
A game inspired by Boomerang Fu, but instead of Boomerangs, Yoyos
I added controls through an actual controler and now it is able to shoot yoyos and the collisions actually work too. The controls are: Left joystick - movement A (nintendo) - Shoot/Aim and if aiming left joystick works just like it I am thinking now to add better maping and UI, or the actual animations.
Added more Yoyo functions to make the yoyo movement better including: Bounces to walls Recalling (bring the yoyo back before max lenght) And added more central keys for the throwing/moving/aiming and added an aim preview before throwing
So now there is animations, and there is one character, the cactus. and i have also made yoyos and their spining animations. But i still havent decided if i should use smooth surfaces or pixelated, and if i should be using an actual game engine for it. I will do that later when i have a clear idea of what i am doing, but for now its looking pretty good. and i am still trying to figure out how to make the bounces work, right now they are really bad.
I have started using Godot tp get the game into an actual game engine. Its my first time using it so its not going relly well, its really slow and stuff, but i am getting better. I have also started using Blockbench for 3d modelling my characters and i have been trying to model this character (the cactus) for around 2 hours but Lapse kinda glitched and didnt count them (it just said server error). But i am getting better at blockbench
Made the chcarter move in godot, and it looks kinda amazing. But its is still really plain and i dont know a lot of stuff so its basically nothing.
Big update for the main character! The cactus finally got a glow-up with a cute head flower, eyes, a mouth, and proper spikes. Even better, basic movement is officially live. You can now move and dash, and the character smoothly turns toward your movement direction (just like the best game in history: Boomerang fu).
I worked on getting the yo-yo to show up in the player’s hand and launch properly, but it was pretty confusing and I ended up with a lot of errors and a non-working yo-yo. I also worked on the file structure; my files were scattered all over the place, so I asked an AI how to organize them using Boomerang Fu as a reference, and I did what I could with that. Finally, I started working on the main menu UI to make it look a bit more finished, even though it’s still far from it!
Made and organized the README.md, to be more professional and document all of the project better.
Got the main menu working (the quit and start button) and it now has nice text/logo thing, and a bg for the main menu (made with AI). And also worked on getting more charcters....
|
1793141571.1329124
|
1793746371.1329124
|
|
7589
|
Self-Balancing Robot - Gary by @benMakesStuff | St Self-Balancing Robot - Gary by @benMakesStuff | Stardance...
|
benMakesStuff
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T22:05:51Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a self-balancing robot. That works through a PID control loop. I have not yet finished the design or the code because the IMU sensor does not have a stable connection. Therefore it can stop giving data to the Pico at any time, so it is not working perfectly yet. I think I could solve this either by soldering the IMU sensor to the cables (its not soldered yet) or by getting a custom PCB but I don’t have any soldering iron to do that yet.", "repo": "https://github.com/benvelzul/Balancing-robot", "demo": ""}]...
|
[{"post_id": 8454, "ts": "2026 [{"post_id": 8454, "ts": "2026-06-14T01:48:40Z", "hours": 1.5022, "text": "Building For this phase of the project, the primary goal was to construct a stable chassis for Gary (the robot’s name). I designed and fabricated a new, updated base intended to improve structural integrity. However, during the assembly phase, I ran into a clearance issue—the motors did not fit properly into the new mounts. As a result, I had to pivot and revert back to the previous design iteration. Figure 1: The first version of the base (successful fit). Figure 2: The second version of the base that unfortunately did not work due to motor clearance. Because my immediate goal was to establish a quick Proof of Concept (PoC) and test the self-balancing algorithms, I decided not to let the chassis setback halt my momentum. To secure the electronics, I temporary mounted all the internal components, sensors, and the battery pack directly onto the older chassis using hot glue. While not the final aesthetic design, this kept the center of gravity fixed and robust enough for testing. With the physical structure secured, Gary was officially ready to move on to the wiring stage. Wiring The wiring phase presented several hardware limitations that required creative, temporary solutions, many of which became valuable learning experiences later in the project. Power Supply & Connections Because a dedicated 4xAA battery pack wasn’t available, I engineered a solution by combining two separate smaller battery packs to supply the necessary voltage. Furthermore, because I did not have access to a soldering iron, I had to secure the spliced power wires together using hot glue. While this worked initially to establish a connection, the lack of a proper mechanical bond introduced intermittent power issues down the line. Microcontroller & Motor Protection Before connecting any components, I had to research safe wiring configurations to ensure the high-voltage motor circuits wouldn’t back-feed and destroy the Raspberry Pi Pico. To safely bridge the Pico, the dual battery packs, and the motor outputs without soldering, I mapped the entire circuit out on a standard breadboard. [Battery Packs] —> [Motor Driver] <—> [Raspberry Pi Pico] | [DC Motors] The Breadboard & Sensor Bottleneck While the breadboard was essential for a solderless prototype, it quickly became a primary source of instability. The most critical issue occurred with the ADXL345 accelerometer: Because the header pins couldn’t be permanently soldered, I had to rely on friction and physical pressure to keep the jumper wires connected to the sensor. This poor connection meant that as soon as the robot’s motors spun up, the physical vibrations shook the loose wires. This resulted in erratic sensor readings, momentary ‘’‘OSError’’’ crashes, and distorted tilt data, proving that a reliable mechanical connection is vital for self-balancing robotics. Coding Sensor Integration & Debugging The coding phase began by reading raw 6-byte chunks from the ADXL345 register 0x32. These data points were converted into integers and printed out as a tuple ‘’’(x, y, z)’’’ so they could be monitored and visualized inside the Thonny Plotter. Implementing the PID Control Loop A PID framework was written to determine how Gary reacts to falling: K_p (Proportional): Pushes back against the present error based on how far the robot is currently tilting. K_d (Derivative): Counteracts future error by assessing how fast the robot is falling, which dampens shaking. K_i (Integral): Tracks past error over time to eliminate minor, steady leaning issues. Figure 3: Assembled robot"}, {"post_id": 4038, "ts": "2026-06-07T06:51:05Z", "hours": 0.5064, "text": "I have designed the first version of the base for the robot (the thing holder for the motors)"}]...
|
Title: Self-Balancing Robot - Gary by @benMakesStu Title: Self-Balancing Robot - Gary by @benMakesStuff | Stardance
Devlogs:
I have designed the first version of the base for the robot (the thing holder for the motors)
Building For this phase of the project, the primary goal was to construct a stable chassis for Gary (the robot’s name). I designed and fabricated a new, updated base intended to improve structural integrity. However, during the assembly phase, I ran into a clearance issue—the motors did not fit properly into the new mounts. As a result, I had to pivot and revert back to the previous design iteration. Figure 1: The first version of the base (successful fit). Figure 2: The second version of the base that unfortunately did not work due to motor clearance. Because my immediate goal was to establish a quick Proof of Concept (PoC) and test the self-balancing algorithms, I decided not to let the chassis setback halt my momentum. To secure the electronics, I temporary mounted all the internal components, sensors, and the battery pack directly onto the older chassis using hot glue. While not the final aesthetic design, this kept the center of gravity fixed and robust enough for testing. With the physical structure secured, Gary was officially ready to move on to the wiring stage. Wiring The wiring phase presented several hardware limitations that required creative, temporary solutions, many of which became valuable learning experiences later in the project. Power Supply & Connections Because a dedicated 4xAA battery pack wasn’t available, I engineered a solution by combining two separate smaller battery packs to supply the necessary voltage. Furthermore, because I did not have access to a soldering iron, I had to secure the spliced power wires together using hot glue. While this worked initially to establish a connection, the lack of a proper mechanical bond introduced intermittent power issues down the line. Microcontroller & Motor Protection Before connecting any components, I had to research safe wiring configurations to ensure the high-voltage motor circuits wouldn’t back-feed and destroy the Raspberry Pi Pico. To safely bridge the Pico, the dual battery packs, and the motor outputs without soldering, I mapped the entire circuit out on a standard breadboard. [Battery Packs] —> [Motor Driver] <—> [Raspberry Pi Pico] | [DC Motors] The Breadboard & Sensor Bottleneck While the breadboard was essential for a solderless prototype, it quickly became a primary source of instability. The most critical issue occurred with the ADXL345 accelerometer: Because the header pins couldn’t be permanently soldered, I had to rely on friction and physical pressure to keep the jumper wires connected to the sensor. This poor connection meant that as soon as the robot’s motors spun up, the physical vibrations shook the loose wires. This resulted in erratic sensor readings, momentary ‘’‘OSError’’’ crashes, and distorted tilt data, proving that a reliable mechanical connection is vital for self-balancing robotics. Coding Sensor Integration & Debugging The coding phase began by reading raw 6-byte chunks from the ADXL345 register 0x32. These data points were converted into integers and printed out as a tuple ‘’’(x, y, z)’’’ so they could be monitored and visualized inside the Thonny Plotter. Implementing the PID Control Loop A PID framework was written to determine how Gary reacts to falling: K_p (Proportional): Pushes back against the present error based on how far the robot is currently tilting. K_d (Derivative): Counteracts future error by assessing how fast the robot is falling, which dampens shaking. K_i (Integral): Tracks past error over time to eliminate minor, steady leaning issues. Figure 3: Assembled robot
Ships:
I made a self-balancing robot. That works through a PID control loop. I have not yet finished the design or the code because the IMU sensor does not have a stable connection. Therefore it can stop giving data to the Pico at any time, so it is not working perfectly yet. I think I could solve this either by soldering the IMU sensor to the cables (its not soldered yet) or by getting a custom PCB but I don’t have any soldering iron to do that yet....
|
1793328547.6327202
|
1793414947.6327202
|
|
7590
|
My awesome macropad! by @BOB_builder1 | Stardance
|
BOB_builder1
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @BOB_builder1 | Sta Title: My awesome macropad! by @BOB_builder1 | Stardance...
|
1793177500.794628
|
1793782300.794628
|
|
7591
|
Demo by @Noob | Stardance
|
Noob
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Demo by @Noob | Stardance
|
1792723649.6425562
|
1793328449.6425562
|
|
7592
|
My first slack bot! by @jameseknight | Stardance
|
jameseknight
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @jameseknight | Star Title: My first slack bot! by @jameseknight | Stardance...
|
1793141541.3562567
|
1793746341.3562567
|
|
7593
|
Retract by @Senay | Stardance
|
Senay
|
0
|
3.12
|
0
|
[]
|
[{"post_id": 3095, "ts": "2026 [{"post_id": 3095, "ts": "2026-06-06T00:15:35Z", "hours": 1.2775, "text": "Added toasts, changed usage of pip and changed it into python -m pip for a more reliable use, and added a small animation while it installs yt-dlp using python so that it doesn’t look like it is just frozen. Took me a while to find out why the UI wasn’t updating with click and found out I needed to use yield to push the updates to the button and to send out the toasts after it downloads."}, {"post_id": 2561, "ts": "2026-06-05T03:48:25Z", "hours": 1.8408, "text": "Added detection yt-dlp detection using subprocess and incase it isn’t on path or the assets directory to alert the user, tell them to install it, or return back to the home page. Also allows the user to download it by pressing a button using python’s pip to install the package version of yt-dlp."}]...
|
Title: Retract by @Senay | Stardance
Devlogs:
Add Title: Retract by @Senay | Stardance
Devlogs:
Added detection yt-dlp detection using subprocess and incase it isn’t on path or the assets directory to alert the user, tell them to install it, or return back to the home page. Also allows the user to download it by pressing a button using python’s pip to install the package version of yt-dlp.
Added toasts, changed usage of pip and changed it into python -m pip for a more reliable use, and added a small animation while it installs yt-dlp using python so that it doesn’t look like it is just frozen. Took me a while to find out why the UI wasn’t updating with click and found out I needed to use yield to push the updates to the button and to send out the toasts after it downloads....
|
1793299752.0911126
|
1793904552.0911126
|
|
7594
|
GeoRemind by @Tijil | Stardance
|
Tijil
|
0
|
0.98
|
0
|
[]
|
[{"post_id": 6424, "ts": "2026 [{"post_id": 6424, "ts": "2026-06-10T20:10:08Z", "hours": 0.9844, "text": "🫠"}]...
|
Title: GeoRemind by @Tijil | Stardance
Devlogs:
🫠
|
1793317786.56564
|
1793922586.56564
|
|
7595
|
Untitled project by @its-gwang | Stardance
|
its-gwang
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @its-gwang | Stardance
|
1793299683.765121
|
1793904483.765121
|
|
7596
|
Untitled by @TheRealCitixx | Stardance
|
TheRealCitixx
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @TheRealCitixx | Stardance
|
1793249590.0358045
|
1793854390.0358045
|
|
7597
|
My awesome macropad! by @franco | Stardance
|
franco
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @franco | Stardance
|
1793303342.1042068
|
1793908142.1042068
|
|
7598
|
My awesome macropad! by @Justin-F | Stardance
|
Justin-F
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Justin-F | Stardan Title: My awesome macropad! by @Justin-F | Stardance...
|
1792929041.610555
|
1793793041.610555
|
|
7599
|
Task Manager by @elijahkott | Stardance
|
elijahkott
|
1
|
4.0
|
10
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-13T21:42:02Z", "hours": 4.0, "multiplier": 2.42, "payout": 10, "blessing": "neutral", "text": "I made a simple task manager in Rust as a first Rust project. I was proud that I was able to pretty quickly pick up Rust. What was challenging was implementing Rust code that I’ve never seen to make this project work. Also, testing the project on all platforms. You can use both the terminal commands and the TUI to use the project.", "repo": "https://github.com/LijKott/task-manager/tree/master", "demo": "https://crates.io/crates/task-manager-kotter"}]...
|
[{"post_id": 3837, "ts": "2026 [{"post_id": 3837, "ts": "2026-06-06T21:55:41Z", "hours": 1.9919, "text": "TUI is done, tsk is live So last time I had the CLI working. Today I finished the TUI and shipped the whole thing. Getting ratatui going was interesting. It doesn’t work like anything I’ve done before. Instead of just printing stuff, you’ve got a loop that redraws the whole screen every time you press a key. You also have to set up and tear down the terminal manually. If you don’t, your terminal just breaks after you exit. Took me a second to get my head around it but once it clicked it made sense. The TUI has two modes, Normal and Adding. Normal is where you scroll around and do things to tasks. Adding turns the bottom bar into a text input where you type your task and hit Enter. I think using enums for that was pretty clean. I added two things that weren’t in the original plan. A reset command that wipes everything and brings the IDs back to 1, and making the done button a toggle instead of one way. The toggle was annoying, but in the end it worked out fine. The problem was that I forgot to update the function’s name to the updated one. Small thing but it tripped me up. After that, I published to crates.io as task-manager-kotter (tsk) because task-manager was already taken. Then I set up GitHub Actions to build binaries for Linux, Windows, and Mac automatically when I push a tag. Hit a permissions error first try, so I had to go into the repo settings and flip on read/write for workflows. After that I programmed the yml file wrong, so it would merge the binaries instead of having them seperate. I fixed that, and it worked, all three binaries showed up in the release. What’s working Full TUI with scrolling, adding, toggling, deleting, and resetting cargo install tsk works Prebuilt binaries on GitHub Releases for all three platforms"}, {"post_id": 3062, "ts": "2026-06-05T23:10:22Z", "hours": 1.9483, "text": "I got the core database and CLI working Built the foundation today for my SQLite task store and a working CLI with four commands: add, list, done, and delete. You can actually add tasks and check them off from the terminal now. What’s working cargo run – add “buy milk” cargo run – list Output: 1: buy milk [ ] cargo run – done 1 cargo run – list Output: 1: buy milk [x] The stack is rusqlite for SQLite (with the bundled feature so there are no system deps), clap for argument parsing with the derive macro, and chrono for timestamps. The project is split into models.rs, db.rs, commands.rs, and main.rs. These keep the database logic completely separate from the CLI wiring. One thing that tripped me up: Rust’s ownership model means you can’t just pass a Connection willy nilly, you have to borrow it with &Connection everywhere. Took a few compiler errors to get the hang of it, but now it makes sense. Next up Building the TUI with ratatui so you can navigate tasks without typing commands. After that: publishing to crates.io and updating the README."}]...
|
Title: Task Manager by @elijahkott | Stardance
De Title: Task Manager by @elijahkott | Stardance
Devlogs:
I got the core database and CLI working Built the foundation today for my SQLite task store and a working CLI with four commands: add, list, done, and delete. You can actually add tasks and check them off from the terminal now. What’s working cargo run – add “buy milk” cargo run – list Output: 1: buy milk [ ] cargo run – done 1 cargo run – list Output: 1: buy milk [x] The stack is rusqlite for SQLite (with the bundled feature so there are no system deps), clap for argument parsing with the derive macro, and chrono for timestamps. The project is split into models.rs, db.rs, commands.rs, and main.rs. These keep the database logic completely separate from the CLI wiring. One thing that tripped me up: Rust’s ownership model means you can’t just pass a Connection willy nilly, you have to borrow it with &Connection everywhere. Took a few compiler errors to get the hang of it, but now it makes sense. Next up Building the TUI with ratatui so you can navigate tasks without typing commands. After that: publishing to crates.io and updating the README.
TUI is done, tsk is live So last time I had the CLI working. Today I finished the TUI and shipped the whole thing. Getting ratatui going was interesting. It doesn’t work like anything I’ve done before. Instead of just printing stuff, you’ve got a loop that redraws the whole screen every time you press a key. You also have to set up and tear down the terminal manually. If you don’t, your terminal just breaks after you exit. Took me a second to get my head around it but once it clicked it made sense. The TUI has two modes, Normal and Adding. Normal is where you scroll around and do things to tasks. Adding turns the bottom bar into a text input where you type your task and hit Enter. I think using enums for that was pretty clean. I added two things that weren’t in the original plan. A reset command that wipes everything and brings the IDs back to 1, and making the done button a toggle instead of one way. The toggle was annoying, but in the end it worked out fine. The problem was that I forgot to update the function’s name to the updated one. Small thing but it tripped me up. After that, I published to crates.io as task-manager-kotter (tsk) because task-manager was already taken. Then I set up GitHub Actions to build binaries for Linux, Windows, and Mac automatically when I push a tag. Hit a permissions error first try, so I had to go into the repo settings and flip on read/write for workflows. After that I programmed the yml file wrong, so it would merge the binaries instead of having them seperate. I fixed that, and it worked, all three binaries showed up in the release. What’s working Full TUI with scrolling, adding, toggling, deleting, and resetting cargo install tsk works Prebuilt binaries on GitHub Releases for all three platforms
Ships:
I made a simple task manager in Rust as a first Rust project. I was proud that I was able to pretty quickly pick up Rust. What was challenging was implementing Rust code that I’ve never seen to make this project work. Also, testing the project on all platforms. You can use both the terminal commands and the TUI to use the project....
|
1793329006.0473652
|
1793415406.0473652
|
|
7600
|
My awesome macropad! by @Ishaan_P | Stardance
|
Ishaan_P
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Ishaan_P | Stardan Title: My awesome macropad! by @Ishaan_P | Stardance...
|
1793364768.6739092
|
1793969568.6739092
|