|
57569
|
nano_code by @wilrakov | Stardance
|
wilrakov
|
1
|
17.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-23T13:06:28Z", "hours": 17.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I did a small bytecode in pure x64 assembly. I am proud of it since it was my first assembly project. It only works on Linux, and you should know a little about asm to test it. I mean, the programming language for my bytecode is really close to assembly. It’s complex to test, I know, but I hope you’ll find out! Thanks a lot for all the event!!!", "repo": "https://github.com/wilrak0v/nano_code", "demo": "https://github.com/wilrak0v/nano_code/releases/tag/Stardance"}]...
|
[{"post_id": 72653, "ts": "202 [{"post_id": 72653, "ts": "2026-09-23T12:56:37Z", "hours": 2.2403, "text": "I think I am done with this project… I hope it´s fine to ship it."}, {"post_id": 69148, "ts": "2026-09-16T14:06:41Z", "hours": 3.0778, "text": "Okay so I finished the bytecode, all is working great! I started a language for it which is closer to assembly. I do it with customASM. On the image you can see the Fibonacci algorithm"}, {"post_id": 66681, "ts": "2026-09-12T15:34:32Z", "hours": 1.4653, "text": "Okay so I added memory operations from 8 bits to 32 bits. I also did the syscall system but for now I just have one syscall which is print (the same as the write syscall on linux)."}, {"post_id": 66448, "ts": "2026-09-12T08:56:33Z", "hours": 2.4089, "text": "All operations on registers are done. It´s faster than JVM for 100 numbers of Fibonacci. So now I just have to make the memory operations and the syscall system. Then the core will be done."}, {"post_id": 64895, "ts": "2026-09-09T16:31:19Z", "hours": 3.5192, "text": "Last three days I added a lot of instructions. We can perform arithmetic expressions and jump with and without conditions. So I think my VM is turing complete isn´t it? Today I did a fibonacci test and I beat the JVM."}, {"post_id": 60307, "ts": "2026-09-02T16:15:17Z", "hours": 4.63, "text": "First devlog Last days I worked on a small and simple project called nano_code. It´s a bytecode written in pure assembly and designed to be fast. I hope I can beat the JVM on modern PC. So what did I do? Actually I did the hardest part of this project by making the loop (fetch-decode-execute). Now I just need to implement the instructions one by one. Oh and I don´t load bytecode from a file for now so I have to implement it later. I already implemented movr and movi (r = register and i = immediate), and I am currently making the arithmetic operations like add, sub, mul, div, and mod which is modulo of course. All of these instructions have two version : one with a register and an immediate value and the other one with two register as the operands. Of course in the future I will need to make a small assembler to write easily code for that VM. Thanks for reading, see you soon."}]...
|
Title: nano_code by @wilrakov | Stardance
Devlogs Title: nano_code by @wilrakov | Stardance
Devlogs:
First devlog Last days I worked on a small and simple project called nano_code. It´s a bytecode written in pure assembly and designed to be fast. I hope I can beat the JVM on modern PC. So what did I do? Actually I did the hardest part of this project by making the loop (fetch-decode-execute). Now I just need to implement the instructions one by one. Oh and I don´t load bytecode from a file for now so I have to implement it later. I already implemented movr and movi (r = register and i = immediate), and I am currently making the arithmetic operations like add, sub, mul, div, and mod which is modulo of course. All of these instructions have two version : one with a register and an immediate value and the other one with two register as the operands. Of course in the future I will need to make a small assembler to write easily code for that VM. Thanks for reading, see you soon.
Last three days I added a lot of instructions. We can perform arithmetic expressions and jump with and without conditions. So I think my VM is turing complete isn´t it? Today I did a fibonacci test and I beat the JVM.
All operations on registers are done. It´s faster than JVM for 100 numbers of Fibonacci. So now I just have to make the memory operations and the syscall system. Then the core will be done.
Okay so I added memory operations from 8 bits to 32 bits. I also did the syscall system but for now I just have one syscall which is print (the same as the write syscall on linux).
Okay so I finished the bytecode, all is working great! I started a language for it which is closer to assembly. I do it with customASM. On the image you can see the Fibonacci algorithm
I think I am done with this project… I hope it´s fine to ship it.
Ships:
I did a small bytecode in pure x64 assembly. I am proud of it since it was my first assembly project. It only works on Linux, and you should know a little about asm to test it. I mean, the programming language for my bytecode is really close to assembly. It’s complex to test, I know, but I hope you’ll find out! Thanks a lot for all the event!!!...
|
1793350179.4846725
|
1793436579.4846725
|
|
37765
|
nano65 by @lynx1076 | Stardance
|
lynx1076
|
0
|
62.17
|
0
|
[]
|
[{"post_id": 66283, "ts": "202 [{"post_id": 66283, "ts": "2026-09-12T00:59:04Z", "hours": 8.9686, "text": "Big things in the happening yall! The LCD just seemed oh so limiting so I decided to switch to a 64x64 LCD panel. Obviously the 6502 is nowhere near fast enough to control the display AND calculate stuff to put there so I’m using a tang nano 20k as a sort of GPU. It kind of feels like a waste though, using a device that could emulate a faster processor and drive the display at the same time so I might switch to a hardware implementation in the future. For now though this will suffice as I care more about the calculations I want to plot onto the display. (Ohoh what ever might he do with an array of pixels that can be arbitrarily colored and turned on/off )"}, {"post_id": 61195, "ts": "2026-09-04T00:28:40Z", "hours": 0.7014, "text": "Yall. Its wozzing time Running wozmon on a diy computer that I alone developed, debugged and produced is really something else. I dont know how much this applies to you guys but I think its time we all took a step back as junior devs and consider the stuff weve built. Im really amazed as to what we are all capable of when we put our minds to it. A few months ago I was a teen with a stupid idea, in way over my head. Now Im running 50 years old software on my very own machine, just as the computer gods intended. Ive certainly got quite a journey ahead of me but Im excited to see whats coming my way. Happy hacking yall"}, {"post_id": 61170, "ts": "2026-09-03T23:27:36Z", "hours": 1.5656, "text": "American layout… But hey ITS WORKING Next Stop: Wozmon on the nano65"}, {"post_id": 61124, "ts": "2026-09-03T21:27:24Z", "hours": 8.0733, "text": "Quick status update Im racking up hours too quickly so heres a quick update on what Im doing: Built hardware to support PS2 keyboard Switched LCD to 4-bit mode Started to work on interpreting keyboard signals Some of you might recognize the circuitry from Ben Eater’s video series. If you’re looking to implement this in your own project make sure to add some series resistors for the 74HC14 outputs as they may ring heavily distorting your interrupts."}, {"post_id": 58401, "ts": "2026-08-30T20:09:51Z", "hours": 5.9656, "text": "We ballin’! Last time I caught some heat for not using a project related pic so here are some exciting pictures of my messy desk and horrible wiring. I am excited to announce that flashing and dumping the memory is now a somewhat survivable experience even though its kind of slow. Right now Im just looking to hook up a PS2 keyboard so we can get some interactive stuff going but its lookin good. I had loads of issues with the wiring and since I was doing an internship up until friday I havent had much time but Im free now so expect more frequent updates more monke (lookin at you @fsh ) and more fanatic rambling about a processor nobody cares about (I LOVE ASSEMBLY)"}, {"post_id": 48484, "ts": "2026-08-16T21:07:50Z", "hours": 1.8153, "text": "Finally got flashing to work. The speed is absolutely abysmal (~30s for dumping and flashing) but it works and since single bytes can be quickly edited without re-flashing everything I don’t mind"}, {"post_id": 48412, "ts": "2026-08-16T19:03:51Z", "hours": 2.2406, "text": "Memory dumps now implemented. It’s a bit sketchy but you know… “Nothing more permanent than a temporary fix” It’s a bit slow all in all but I already increased the baudrate to 500k and I feel if I go any higher it’ll probably die like a hamster in a microwave."}, {"post_id": 44218, "ts": "2026-08-09T20:41:09Z", "hours": 9.3833, "text": "Just doing a quick post since I am racking up some time. Haven’t been working a lot on the software as I’ve been really busy recently. Anyways the command to dump the entire memory is almost done. Right now I am just making it print some specific known bytes from the dump."}, {"post_id": 35355, "ts": "2026-07-26T18:04:16Z", "hours": 3.2119, "text": "Tried running the nano65 at 2.5 MHz aaaannddd… IT WORKS PERFECTLY!!! I just ran a simple program that reads a byte from SRAM, adds 1 and then writes it back. This program loops infinitely so I could see if the CPU would go haywire and it actually didn’t. This means more intense programs like video games (oooh spoilers) could theoretically already run."}, {"post_id": 35119, "ts": "2026-07-26T10:55:48Z", "hours": 1.0125, "text": "Memory manipulation while processor is running!!! The memory can now be safely written to WHILE THE CPU IS RUNNING INSTRUCTIONS AT THE SAME ADDRESS! After adding a pull-up to the RWB pin (low means write so I’d have to assert the clock low before turning off the CPU) the SRAM and EEPROM can be written to/read from arbitrarily while the CPU is paused and all registers are preserved. Spot a bug while stepping through your code? Change the byte immediately before the CPU even sees it."}, {"post_id": 34921, "ts": "2026-07-26T00:57:06Z", "hours": 1.4275, "text": "UI starting to look good and memory interaction is working splendidly I also decided to finally change the font so we don’t all get eye cancer. Next is just going to be some QOL features like the panel on the left I haven’t really used. Probably going to put some status info there like if a vector is being pulled and the current clock state. Also going to implement writing a whole binary file to the nano65’s memory and dumping the memory. Once that’s all done I’ll treat myself to actually doing some projects with the nano65 to see if any other features might be nice."}, {"post_id": 34830, "ts": "2026-07-25T20:48:30Z", "hours": 1.4211, "text": "“The debugger is very confusing. It exists, but it’s very confusing. I don’t understand my debugger. It’s a low-level debugger and if you’re not familiar with a low-level debugger you don’t know what you’re talking about.” Terry A. Davis"}, {"post_id": 34713, "ts": "2026-07-25T17:24:35Z", "hours": 8.7947, "text": "THE HOST APP WORKS It’s now possible to step through a 6502 program using the debugger software instead of manually sending commands via serial. The GUI doesn’t look as good as I’d like it to but that’s a bridge I’ll burn when I get to it. For now the CPU can be reset with the hardware reset button and the stp (step [count]) command allows stepping through individual clock cycles. This will soon be changed to step through individual instructions instead to allow easier debugging but I’ll leave the direct clock manipulation in just in case. The screenshot clearly shows the W65C02S processor stepping through it’s reset cycle (the pseudo-reads were omitted since they are meaningless). The oscilloscope shows the external clock doing the 7 cycles until the reading of 0xFFFC is reached (bus is sampled on high clock so the positive edges count as clock ticks). Woah you read all that? Thx <3 From here on out it’s just a matter of implementing the rest of the commands on the host’s side and then doing some cool projects."}, {"post_id": 33241, "ts": "2026-07-22T23:51:47Z", "hours": 1.88, "text": "Well I decided to fully scrap the TUI afteralll since doing that would not let me compile for Windows and Linux easily and a GUI was going to be the end goal anyways. Using raylib and microui and it’s looking good (so far). https://www.raylib.com/ https://github.com/rxi/microui"}, {"post_id": 32733, "ts": "2026-07-22T02:21:39Z", "hours": 1.8928, "text": "Can’t get ncurses to work because I’d have to patch together like 5 different libraries just to get input working somewhat and you guys deserve better than me generating half of this project using ai cause I’m too dumb to figure out a 40 year old library. Stumbled upon this gem of a library (haven’t even tried it yet but the trailer so fire I had to share). Next update will hopefully be one about the hardware once I figure out this TUI-mess. notcurses https://www.youtube.com/watch?v=dcjkezf1ARY"}, {"post_id": 32131, "ts": "2026-07-21T02:45:01Z", "hours": 3.5219, "text": "Well I haven’t broken the firmware (yet) but the host software is really making me go through a lot. Setting up a “simple” ui using ncurses turned out to not be that simple afterall which might be due to the fact I decided to write this whole project in C. I’ll get back to logging once I have some decent program running on the nano65 so I can show off all the cool features of the arduBug. Since I don’t have much to show for all my work right now I’m just going to flex my C sloc on all the react kiddies ; ). Anyways that’s all for today folks (well I guess that’s just you, dear mod, reading this until I get verified). I’ve got to catch up on some sleep now (-_-)zzZZz"}, {"post_id": 31993, "ts": "2026-07-20T20:42:27Z", "hours": 0.2978, "text": "Working on the debugger (arduBug). Basically a little tool that I’ll use to manipulate the W65C02 processor and any devices on the bus. Its working well firmware-wise so I’m working on the host to let me interact with the nano65 (the actual computer) on a more abstract level. If all goes well I’ll hook up the VIA soon and from there on all sorts of cool things will be possible. In the picture you can see the full setup (arduBug, motherboard, and storage board). The oscilloscope shows the internal clock (2.5 MHz; will likely be decreased to 2 MHz). The interesting thing is that the arduBug boots up and turns off the internal clock to overwrite it with it’s own clock source. I was now able to revert that setup from the host software via a serial command."}]...
|
Title: nano65 by @lynx1076 | Stardance
Devlogs:
W Title: nano65 by @lynx1076 | Stardance
Devlogs:
Working on the debugger (arduBug). Basically a little tool that I’ll use to manipulate the W65C02 processor and any devices on the bus. Its working well firmware-wise so I’m working on the host to let me interact with the nano65 (the actual computer) on a more abstract level. If all goes well I’ll hook up the VIA soon and from there on all sorts of cool things will be possible. In the picture you can see the full setup (arduBug, motherboard, and storage board). The oscilloscope shows the internal clock (2.5 MHz; will likely be decreased to 2 MHz). The interesting thing is that the arduBug boots up and turns off the internal clock to overwrite it with it’s own clock source. I was now able to revert that setup from the host software via a serial command.
Well I haven’t broken the firmware (yet) but the host software is really making me go through a lot. Setting up a “simple” ui using ncurses turned out to not be that simple afterall which might be due to the fact I decided to write this whole project in C. I’ll get back to logging once I have some decent program running on the nano65 so I can show off all the cool features of the arduBug. Since I don’t have much to show for all my work right now I’m just going to flex my C sloc on all the react kiddies ; ). Anyways that’s all for today folks (well I guess that’s just you, dear mod, reading this until I get verified). I’ve got to catch up on some sleep now (-_-)zzZZz
Can’t get ncurses to work because I’d have to patch together like 5 different libraries just to get input working somewhat and you guys deserve better than me generating half of this project using ai cause I’m too dumb to figure out a 40 year old library. Stumbled upon this gem of a library (haven’t even tried it yet but the trailer so fire I had to share). Next update will hopefully be one about the hardware once I figure out this TUI-mess. notcurses https://www.youtube.com/watch?v=dcjkezf1ARY
Well I decided to fully scrap the TUI afteralll since doing that would not let me compile for Windows and Linux easily and a GUI was going to be the end goal anyways. Using raylib and microui and it’s looking good (so far). https://www.raylib.com/ https://github.com/rxi/microui
THE HOST APP WORKS It’s now possible to step through a 6502 program using the debugger software instead of manually sending commands via serial. The GUI doesn’t look as good as I’d like it to but that’s a bridge I’ll burn when I get to it. For now the CPU can be reset with the hardware reset button and the stp (step [count]) command allows stepping through individual clock cycles. This will soon be changed to step through individual instructions instead to allow easier debugging but I’ll leave the direct clock manipulation in just in case. The screenshot clearly shows the W65C02S processor stepping through it’s reset cycle (the pseudo-reads were omitted since they are meaningless). The oscilloscope shows the external clock doing the 7 cycles until the reading of 0xFFFC is reached (bus is sampled on high clock so the positive edges count as clock ticks). Woah you read all that? Thx <3 From here on out it’s just a matter of implementing the rest of the commands on the host’s side and then doing some cool projects.
“The debugger is very confusing. It exists, but it’s very confusing. I don’t understand my debugger. It’s a low-level debugger and if you’re not familiar with a low-level debugger you don’t know what you’re talking about.” Terry A. Davis
UI starting to look good and memory interaction is working splendidly I also decided to finally change the font so we don’t all get eye cancer. Next is just going to be some QOL features like the panel on the left I haven’t really used. Probably going to put some status info there like if a vector is being pulled and the current clock state. Also going to implement writing a whole binary file to the nano65’s memory and dumping the memory. Once that’s all done I’ll treat myself to actually doing some projects with the nano65 to see if any other features might be nice.
Memory manipulation while processor is running!!! The memory can now be safely written to WHILE THE CPU IS RUNNING INSTRUCTIONS AT THE SAME ADDRESS! After adding a pull-up to the RWB pin (low means write so I’d have to assert the clock low before turning off the CPU) the SRAM and EEPROM can be written to/read from arbitrarily while the CPU is paused and all registers are preserved. Spot a bug while stepping through your code? Change the byte immediately before the CPU even sees it.
Tried running the nano65 at 2.5 MHz aaaannddd… IT WORKS PERFECTLY!!! I just ran a simple program that reads a byte from SRAM, adds 1 and then writes it back. This program loops infinitely so I could see if the CPU would go haywire and it actually didn’t. This means more intense programs like video games (oooh spoilers) could theoretically already run.
Just doing a quick post since I am racking up some time. Haven’t been working a lot on the software as I’ve been really busy recently. Anyways the command to dump the entire memory is almost done. Right now I am just making it print some specific known bytes from the dump.
Memory dumps now implemented. It’s a bit sketchy but you know… “Nothing more permanent than a temporary fix” It’s a bit slow all in all but I already increased the baudrate to 500k and I feel if I go any higher it’ll probably die like a hamster in a microwave.
Finally got flashing to work. The speed is absolutely abysmal (~30s for dumping and flashing) but it works and since single bytes can be quickly edited without re-flashing everything I don’t mind
We ballin’! Last time I caught some heat for not using a project related pic so here are some exciting pictures of my messy desk and horrible wiring. I am excited to announce that flashing and dumping the memory is now a somewhat survivable experience even though its kind of slow. Right now Im just looking to hook up a PS2 keyboard so we can get some interactive stuff going but its lookin good. I had loads of issues with the wiring and since I was doing an internship up until friday I havent had much time but Im free now so expect more frequent updates more monke (lookin at you @fsh ) and more fanatic rambling about a processor nobody cares about (I LOVE ASSEMBLY)
Quick status update Im racking up hours too quickly so heres a quick update on what Im doing: Built hardware to support PS2 keyboard Switched LCD to 4-bit mode Started to work on interpreting keyboard signals Some of you might recognize the circuitry from Ben Eater’s video series. If you’re looking to implement this in your own project make sure to add some series resistors for the 74HC14 outputs as they may ring heavily distorting your interrupts.
American layout… But hey ITS WORKING Next Stop: Wozmon on the nano65
Yall. Its wozzing time Running wozmon on a diy computer that I alone developed, debugged and produced is really something else. I dont know how much this applies to you guys but I think its time we all took a step back as junior devs and consider the stuff weve built. Im really amazed as to what we are all capable of when we put our minds to it. A few months ago I was a teen with a stupid idea, in way over my head. Now Im running 50 years old software on my very own machine, just as the computer gods intended. Ive certainly got quite a journey ahead of me but Im excited to see whats coming my way. Happy hacking yall
Big things in the happening yall! The LCD just seemed oh so limiting so I decided to switch to a 64x64 LCD panel. Obviously the 6502 is nowhere near fast enough to control the display AND calculate stuff to put there so I’m using a tang nano 20k as a sort of GPU. It kind of feels like a waste though, using a device that could emulate a faster processor and drive the display at the same time so I might switch to a hardware implementation in the future. For now though this will suffice as I care more about the calculations I want to plot onto the display. (Ohoh what ever might he do with an array of pixels that can be arbitrarily colored and turned on/off )...
|
1793152480.857652
|
1793757280.857652
|
|
36234
|
name...soon by @tmi_net | Stardance
|
tmi_net
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: name...soon by @tmi_net | Stardance
|
1793400763.8944561
|
1794005563.8944561
|
|
53365
|
name of site by @bluechicken | Stardance
|
bluechicken
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: name of site by @bluechicken | Stardance
|
1792745535.9999275
|
1793350335.9999275
|
|
52191
|
name by @saidcim | Stardance
|
saidcim
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: name by @saidcim | Stardance
|
1792892916.4227495
|
1793756916.4227495
|
|
22937
|
nah.ai by @justrivaan | Stardance
|
justrivaan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: nah.ai by @justrivaan | Stardance
|
1792889483.026624
|
1793753483.026624
|
|
3734
|
naadix website by @harshitpandey3519 | Stardance
|
harshitpandey3519
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: naadix website by @harshitpandey3519 | Star Title: naadix website by @harshitpandey3519 | Stardance...
|
1792705795.98231
|
1793310595.98231
|
|
50773
|
n8n locally by @zoro | Stardance
|
zoro
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: n8n locally by @zoro | Stardance
|
1793361184.7982903
|
1793965984.7982903
|
|
19166
|
n/a by @resslr | Stardance
|
resslr
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: n/a by @resslr | Stardance
|
1793148807.561673
|
1793753607.561673
|
|
17820
|
n-body simulator by @victorluo | Stardance
|
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: n-body simulator by @victorluo | Stardance
|
1793390131.1883028
|
1793994931.1883028
|
|
44048
|
n cars by @rigel | Stardance
|
rigel
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: n cars by @rigel | Stardance
|
1793249647.1035697
|
1793854447.1035697
|
|
46358
|
n by @juliette17 | Stardance
|
juliette17
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: n by @juliette17 | Stardance
|
1793382671.5950634
|
1793987471.5950634
|
|
71685
|
n by @atharv_jadhav | Stardance
|
atharv_jadhav
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: n by @atharv_jadhav | Stardance
|
1793155636.0712361
|
1793760436.0712361
|
|
70393
|
n by @Picazo | Stardance
|
Picazo
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: n by @Picazo | Stardance
|
1793008395.4910932
|
1793613195.4910932
|
|
65218
|
mywebsite by @geeky | Stardance
|
geeky
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T20:54:20Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "ita a tracker that makes keep your streak easier", "repo": "https://github.com/filippoplesca3-wq/habit-tracker", "demo": "https://filippoplesca3-wq.github.io/habit-tracker/"}]...
|
[{"post_id": 73298, "ts": "202 [{"post_id": 73298, "ts": "2026-09-24T19:54:07Z", "hours": 10.0153, "text": "im working on an habit tracker for streaks"}]...
|
Title: mywebsite by @geeky | Stardance
Devlogs:
i Title: mywebsite by @geeky | Stardance
Devlogs:
im working on an habit tracker for streaks
Ships:
ita a tracker that makes keep your streak easier...
|
1792814214.0890195
|
1793678214.0890195
|
|
52697
|
mywebsite by @Jeshu | Stardance
|
Jeshu
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-24T17:08:18Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my own portfolio for the Stardance event and I used basic vanilla JavaScript, CSS, and HTML for this", "repo": "https://github.com/jeshu-collab/mywebsite", "demo": "https://mywebsite-tawny-alpha.vercel.app/"}]...
|
[{"post_id": 53922, "ts": "202 [{"post_id": 53922, "ts": "2026-08-24T17:00:34Z", "hours": 0.2533, "text": "devlog — cleaned up the site today removed three.js and replaced it with a lightweight pure css dot-grid. warmed up the whole color palette and gave it more of an aged parchment feel. fixed the landing page alignment by switching to a strict css grid and keeping everything dead-center. added ibm plex mono locally, so there are no external font requests anymore. added my hardware + software toolkit to the about page. added a vanilla javascript observer for smooth fade-ins when elements enter the viewport. overall, the build feels way lighter, faster, and cleaner now. and yeah, the alignment is finally actually right."}, {"post_id": 52225, "ts": "2026-08-22T10:10:56Z", "hours": 2.5078, "text": "I built a minimalist portfolio from the ground up, focusing entirely on strict layout control and a raw “hacker-document” aesthetic. I originally had a 3D particle system running in the background, but I ended up removing Three.js completely and replaced it with a much lighter, pure CSS dot-grid that uses a custom mouse-tracking spotlight mask to keep the load times near zero.The core of the build involved creating a precise CSS state-machine for a sticky-scroll landing sequence and using CSS Grid to achieve pixel-perfect absolute centering across the viewport. For typography, I used Google Fonts with IBM Plex Mono instead of adding the font directly into the stylesheet. Everything is tied together with a warm, vintage parchment color palette, strict flex-aligned project cards, and smooth hover-state GitHub reveals.It’s completely self-contained, lightweight, lightning fast, and matches exactly the aesthetic I was going for."}]...
|
Title: mywebsite by @Jeshu | Stardance
Devlogs:
I Title: mywebsite by @Jeshu | Stardance
Devlogs:
I built a minimalist portfolio from the ground up, focusing entirely on strict layout control and a raw “hacker-document” aesthetic. I originally had a 3D particle system running in the background, but I ended up removing Three.js completely and replaced it with a much lighter, pure CSS dot-grid that uses a custom mouse-tracking spotlight mask to keep the load times near zero.The core of the build involved creating a precise CSS state-machine for a sticky-scroll landing sequence and using CSS Grid to achieve pixel-perfect absolute centering across the viewport. For typography, I used Google Fonts with IBM Plex Mono instead of adding the font directly into the stylesheet. Everything is tied together with a warm, vintage parchment color palette, strict flex-aligned project cards, and smooth hover-state GitHub reveals.It’s completely self-contained, lightweight, lightning fast, and matches exactly the aesthetic I was going for.
devlog — cleaned up the site today removed three.js and replaced it with a lightweight pure css dot-grid. warmed up the whole color palette and gave it more of an aged parchment feel. fixed the landing page alignment by switching to a strict css grid and keeping everything dead-center. added ibm plex mono locally, so there are no external font requests anymore. added my hardware + software toolkit to the about page. added a vanilla javascript observer for smooth fade-ins when elements enter the viewport. overall, the build feels way lighter, faster, and cleaner now. and yeah, the alignment is finally actually right.
Ships:
I made my own portfolio for the Stardance event and I used basic vanilla JavaScript, CSS, and HTML for this...
|
1793271019.2065203
|
1793357419.2065203
|
|
56585
|
mywebos by @coolcream | Stardance
|
coolcream
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: mywebos by @coolcream | Stardance
|
1792921954.1994033
|
1793785954.1994033
|
|
45684
|
mywebos by @arhamgangwal | Stardance
|
arhamgangwal
|
0
|
1.65
|
0
|
[]
|
[{"post_id": 45079, "ts": "202 [{"post_id": 45079, "ts": "2026-08-11T10:56:43Z", "hours": 1.0544, "text": "Made the window draggable and added open and closing functionality to the window"}, {"post_id": 43897, "ts": "2026-08-09T10:47:35Z", "hours": 0.5944, "text": "I am making a personal portfolio website in the format of webos, it is still in the very early stages and I am still learning html"}]...
|
Title: mywebos by @arhamgangwal | Stardance
Devlo Title: mywebos by @arhamgangwal | Stardance
Devlogs:
I am making a personal portfolio website in the format of webos, it is still in the very early stages and I am still learning html
Made the window draggable and added open and closing functionality to the window...
|
1793346886.0082402
|
1793951686.0082402
|
|
21024
|
mythicalOS by @ele-na | Stardance
|
ele-na
|
2
|
19.0
|
61
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-24T22:04:35Z", "hours": 12.0, "multiplier": 5.11, "payout": 61, "blessing": "neutral", "text": "this is a web-based OS made with html, css and javascript! features: login (password is 1234) notebook (markdown and code accepted) gallery (upload pictures) calculator spotify player calendar terminal to-do list system monitor search bar quick links time and weather tracker (easter egg found here) challenges: ZERO time to work bugs bugs bugs previous versions: elenaOS (june 2026) kpopOS (august 2026) enjoy!", "repo": "https://github.com/ele-na2011/elena.com", "demo": "https://ele-na2011.github.io/elena.com/"}, {"ship_num": 2, "ts": "2026-06-28T17:46:04Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made an OS that basically just holds my personal profile. it’s pretty basic for now, just a welcome screen, spotify player, blog, and resume but i will add more in the future note: the spotify is a fixed widget bc yall are obligated to listen to my amazing music taste ty SerenityUX for the amazing guide ty google for the search engine ty claude for saving me from mental collapse during debugging future updates: add more apps (gallery app hopefully), make UI better, add location tracking for real time weather and stuff basically js make it do more things", "repo": "https://github.com/ele-na2011/elena.com", "demo": "https://ele-na2011.github.io/elena.com/"}]...
|
[{"post_id": 82464, "ts": "202 [{"post_id": 82464, "ts": "2026-10-24T21:52:20Z", "hours": 2.5528, "text": "well i genuinely have not touched vscode since i went back to school (and i ran out of codespace storage asw) so here we are i just genuinely deleted everything that wasn’t working. last devlog before submission :)))"}, {"post_id": 66292, "ts": "2026-09-12T01:18:36Z", "hours": 0.6428, "text": "school’s started up, and i’ve lowk really been slacking (just doing my sticky streak w this project now ig) and i’ve lowk spent the past couple of days working on fixing a bug and adding a todo app. i’ve also added more features to the terminal, but yeah! next i’ll start working on the password feature and the other uh feature then it should be ready to ship! (except more bugs are showing up endlessly haha)"}, {"post_id": 63531, "ts": "2026-09-07T13:24:07Z", "hours": 1.1717, "text": "hii so i’ve been busy lately (schools starting up and ive also been locking in on snowglobe!!) but i’ve worked some more on this i added 2 more apps: a terminal and a newsfeed. the newsfeed uses an api endpoint to call the news, and i’m planning on adding more features to the terminal! i’ve also fixed the dragging issue thank god….acc no im just looking at it rn and fahh yo im acc done w ts i also changed the font to ceveat, and i think the ui looks a lot more cozy now (i still need to change the font in the terminal tho haha). today i also updated the readme!! later i’ll add all the icons (lowk cant find a newsfeed or terminal one but thats okay), work on the ui (and the FRICKING dragging issue bruhhh) then keep working on the secret feature!! i also want to make the os only accessible via a password, but thats a feature for the future ykk"}, {"post_id": 62284, "ts": "2026-09-05T16:05:46Z", "hours": 0.7583, "text": "yesterday and today i’ve just been working on the ui, which means adding icons, etc etc and also making the window look more like a window (hint at tuff feature trust) the window drag program broke again (idek why) so i’m tryna figure out how to fix that (debugging is not fun) and i wanna figure out how to open mini windows inside the webOS to make it more like an OS"}, {"post_id": 61507, "ts": "2026-09-04T13:39:10Z", "hours": 0.7083, "text": "today i mostly just customized stuff. i added a favicon (just to it looks more polished), icons for all the apps, and im working on changing the cursor inside the site im trying to find a tuff font but imo all the more modern UI ones look vibecoded idk"}, {"post_id": 61212, "ts": "2026-09-04T01:12:04Z", "hours": 2.3611, "text": "today i did a lot of work, mostly on this really tuff new feature im adding (ima call it touching grass for now), i reprogrammed the welcome screen, and got the basic format down the ui rn looks vibecoded (which it lowk is cuz i needed it cleaned up for testing) but i will go through it tmr and redesign everything (cuz as much as it fits the vibe it does look chopped asf)"}, {"post_id": 60684, "ts": "2026-09-03T06:58:40Z", "hours": 0.5658, "text": "okay so today i rebranded again (it was too hard to think up a UI theme for kpop and i’m too lazy to change the wallpaper (feature coming soon tho dw) i cleaned up some formatting so it’s slightly easier to test, and i’m working on a toolbar thats similar to those that run on actual laptops"}, {"post_id": 49900, "ts": "2026-08-18T21:17:55Z", "hours": 0.6858, "text": "today i started the rebrand by firstly, deleting a lot of code, and secondly, deciding some features. i deleted the resume, the notebook (gonna make a better one ofc) and the original welcome screen im pretty much done the intro screen, i’m not gonna make it reopenable it’s just gonna be a separate tab type shi (and its very neutral) i’m still debating whether to have separate themes for each kpop group (i’m gonna start w seventeen and enhypen first just to make sure ik changing it works, and everything would be easier as i would just have the icons like pictures of the group and stuff) or have the user themselves upload a background and stuff i relocated the top bar to the bottom center (still have to work on the formatting and stuff ofc) i’m thinking about what apps to build, definitely need weverse, mnet, spotify (already built, i’ll just keep it), a pomodoro timer, etc etc"}, {"post_id": 42977, "ts": "2026-08-07T23:48:50Z", "hours": 0.8789, "text": "okay so now that i have my very professional site, it’s time for the very exciting rebrand of ElenaOS i’m brainstorming themes rn, but i think i might make a kpopOS (because i really like kpop ofc lol) this is going to be a lot of work lol (essentially starting over again) but let’s see where this goes"}, {"post_id": 29123, "ts": "2026-07-15T19:47:50Z", "hours": 0.7731, "text": "today i was pretty productive and added some apps. i think everything started getting easier once i started getting the hang of things with adding new apps and ensuring that they can open and close normally and stuff i added a grade calculator and embedded a google calendar in there as well i want to be able to sync a lot of things in the OS to my google account so that I don’t have to set up extra time to go update the site"}, {"post_id": 28629, "ts": "2026-07-15T00:19:31Z", "hours": 0.7594, "text": "i haven’t worked on this in a while (since the ship was approving lmao) but today i added a gallery app (as promised from the last ship) im not gonna worry too much about actual OS aesthetics until I have a couple more fully functional apps, then ima see if I can animate the background or smt i also wanna code a OS pet but thats a project for slightly later lmao anyways about the gallery app, its just gonna be a simple carousel to demonstrate my projects and stuff. highkey i regret creating this OS all about myself especially after they dropped the new personal website mission but oh well"}, {"post_id": 17735, "ts": "2026-06-28T17:29:22Z", "hours": 0.6325, "text": "this is prob the last devlog before i ship this project for the first time i added a resume and made that draggable also fixed some bugs… (a lot of bugs) in the top bar i also added a temperature tracking module that tracks the temperature in a random town (its pretty tuff) but someday i will update it to match the location of the user ima add some actual articles to the notebook someday the spotify remains a widget anyways all of this will be completed in elenaOS2.0!!"}, {"post_id": 17334, "ts": "2026-06-28T02:25:15Z", "hours": 2.6892, "text": "its been a long day lmao i got the dragging bug fixed and created the notebook app, still working on some formatting issues but its going well. i decided to make it a blog of some sort that i can update through the html code pretty easily and u can basically access it through a dropdown menu instead of a sidebar i decided to make the spotify permanently fixed on the screen and so i deleted its handle and close button (partly bc i couldnt get the click-> open function to work and i didn’t want to deal with it tdy) im probably js gonna make all the apps collectively located on the left and have them open on the right and thus have some sort of control panel on the left the vision is coming together gng ima go brainstorm the new app now :)"}, {"post_id": 16524, "ts": "2026-06-26T21:45:44Z", "hours": 0.8669, "text": "help gng the bugs r only getting worse i added a spotify player and a notebook thingy but i js need the notebook to be closed when the program starts and open on click the drift problem applies to all 3 of the tiny windows now and claude aint fixing it i like the spotify player tho bc its the only thing that works ToT im acc so done (small thing but ima upload a playlist cover cuz i dont like the blue scheme of the playlist) and if i dont drag the others the notebook wont even drag so that needs to be fixed asw"}, {"post_id": 16382, "ts": "2026-06-26T17:39:59Z", "hours": 1.1119, "text": "its been quite a while of trying to debug the drifting problem, so i decided to just go ahead and add some more stuff im trying to add a spotify player and the app thats described in the guide it looks tuff, js some more problems to fix"}, {"post_id": 16254, "ts": "2026-06-26T12:37:47Z", "hours": 1.0319, "text": "oki so between last night and this morning i js kept going with the guide and added some backgrounds and graphics, as well as the timekeeper im currently working on the dragging function, which is bugging out a bit rn but i will figure it out (trust!) i also want to figure out a way to add boundaries so that i wont be able to js drag the window completely off the screen (as shown below lol)"}, {"post_id": 16039, "ts": "2026-06-26T01:50:05Z", "hours": 0.2667, "text": "hi gng first devlog ever so here goes tdy i finally got hackatime, github and my vscode all connected and set up. i haven’t coded HTML since over 5 yrs ago so i dont rlly remember anything so im starting from scratch again yay!! the guides r rlly helpful and im finally recalling some of my past knowledge and i managed to get a decent looking webos started im tired so ima continue this tmr but hey at least its started ykyk"}]...
|
Title: mythicalOS by @ele-na | Stardance
Devlogs: Title: mythicalOS by @ele-na | Stardance
Devlogs:
hi gng first devlog ever so here goes tdy i finally got hackatime, github and my vscode all connected and set up. i haven’t coded HTML since over 5 yrs ago so i dont rlly remember anything so im starting from scratch again yay!! the guides r rlly helpful and im finally recalling some of my past knowledge and i managed to get a decent looking webos started im tired so ima continue this tmr but hey at least its started ykyk
oki so between last night and this morning i js kept going with the guide and added some backgrounds and graphics, as well as the timekeeper im currently working on the dragging function, which is bugging out a bit rn but i will figure it out (trust!) i also want to figure out a way to add boundaries so that i wont be able to js drag the window completely off the screen (as shown below lol)
its been quite a while of trying to debug the drifting problem, so i decided to just go ahead and add some more stuff im trying to add a spotify player and the app thats described in the guide it looks tuff, js some more problems to fix
help gng the bugs r only getting worse i added a spotify player and a notebook thingy but i js need the notebook to be closed when the program starts and open on click the drift problem applies to all 3 of the tiny windows now and claude aint fixing it i like the spotify player tho bc its the only thing that works ToT im acc so done (small thing but ima upload a playlist cover cuz i dont like the blue scheme of the playlist) and if i dont drag the others the notebook wont even drag so that needs to be fixed asw
its been a long day lmao i got the dragging bug fixed and created the notebook app, still working on some formatting issues but its going well. i decided to make it a blog of some sort that i can update through the html code pretty easily and u can basically access it through a dropdown menu instead of a sidebar i decided to make the spotify permanently fixed on the screen and so i deleted its handle and close button (partly bc i couldnt get the click-> open function to work and i didn’t want to deal with it tdy) im probably js gonna make all the apps collectively located on the left and have them open on the right and thus have some sort of control panel on the left the vision is coming together gng ima go brainstorm the new app now :)
this is prob the last devlog before i ship this project for the first time i added a resume and made that draggable also fixed some bugs… (a lot of bugs) in the top bar i also added a temperature tracking module that tracks the temperature in a random town (its pretty tuff) but someday i will update it to match the location of the user ima add some actual articles to the notebook someday the spotify remains a widget anyways all of this will be completed in elenaOS2.0!!
i haven’t worked on this in a while (since the ship was approving lmao) but today i added a gallery app (as promised from the last ship) im not gonna worry too much about actual OS aesthetics until I have a couple more fully functional apps, then ima see if I can animate the background or smt i also wanna code a OS pet but thats a project for slightly later lmao anyways about the gallery app, its just gonna be a simple carousel to demonstrate my projects and stuff. highkey i regret creating this OS all about myself especially after they dropped the new personal website mission but oh well
today i was pretty productive and added some apps. i think everything started getting easier once i started getting the hang of things with adding new apps and ensuring that they can open and close normally and stuff i added a grade calculator and embedded a google calendar in there as well i want to be able to sync a lot of things in the OS to my google account so that I don’t have to set up extra time to go update the site
okay so now that i have my very professional site, it’s time for the very exciting rebrand of ElenaOS i’m brainstorming themes rn, but i think i might make a kpopOS (because i really like kpop ofc lol) this is going to be a lot of work lol (essentially starting over again) but let’s see where this goes
today i started the rebrand by firstly, deleting a lot of code, and secondly, deciding some features. i deleted the resume, the notebook (gonna make a better one ofc) and the original welcome screen im pretty much done the intro screen, i’m not gonna make it reopenable it’s just gonna be a separate tab type shi (and its very neutral) i’m still debating whether to have separate themes for each kpop group (i’m gonna start w seventeen and enhypen first just to make sure ik changing it works, and everything would be easier as i would just have the icons like pictures of the group and stuff) or have the user themselves upload a background and stuff i relocated the top bar to the bottom center (still have to work on the formatting and stuff ofc) i’m thinking about what apps to build, definitely need weverse, mnet, spotify (already built, i’ll just keep it), a pomodoro timer, etc etc
okay so today i rebranded again (it was too hard to think up a UI theme for kpop and i’m too lazy to change the wallpaper (feature coming soon tho dw) i cleaned up some formatting so it’s slightly easier to test, and i’m working on a toolbar thats similar to those that run on actual laptops
today i did a lot of work, mostly on this really tuff new feature im adding (ima call it touching grass for now), i reprogrammed the welcome screen, and got the basic format down the ui rn looks vibecoded (which it lowk is cuz i needed it cleaned up for testing) but i will go through it tmr and redesign everything (cuz as much as it fits the vibe it does look chopped asf)
today i mostly just customized stuff. i added a favicon (just to it looks more polished), icons for all the apps, and im working on changing the cursor inside the site im trying to find a tuff font but imo all the more modern UI ones look vibecoded idk
yesterday and today i’ve just been working on the ui, which means adding icons, etc etc and also making the window look more like a window (hint at tuff feature trust) the window drag program broke again (idek why) so i’m tryna figure out how to fix that (debugging is not fun) and i wanna figure out how to open mini windows inside the webOS to make it more like an OS
hii so i’ve been busy lately (schools starting up and ive also been locking in on snowglobe!!) but i’ve worked some more on this i added 2 more apps: a terminal and a newsfeed. the newsfeed uses an api endpoint to call the news, and i’m planning on adding more features to the terminal! i’ve also fixed the dragging issue thank god….acc no im just looking at it rn and fahh yo im acc done w ts i also changed the font to ceveat, and i think the ui looks a lot more cozy now (i still need to change the font in the terminal tho haha). today i also updated the readme!! later i’ll add all the icons (lowk cant find a newsfeed or terminal one but thats okay), work on the ui (and the FRICKING dragging issue bruhhh) then keep working on the secret feature!! i also want to make the os only accessible via a password, but thats a feature for the future ykk
school’s started up, and i’ve lowk really been slacking (just doing my sticky streak w this project now ig) and i’ve lowk spent the past couple of days working on fixing a bug and adding a todo app. i’ve also added more features to the terminal, but yeah! next i’ll start working on the password feature and the other uh feature then it should be ready to ship! (except more bugs are showing up endlessly haha)
well i genuinely have not touched vscode since i went back to school (and i ran out of codespace storage asw) so here we are i just genuinely deleted everything that wasn’t working. last devlog before submission :)))
Ships:
i made an OS that basically just holds my personal profile. it’s pretty basic for now, just a welcome screen, spotify player, blog, and resume but i will add more in the future note: the spotify is a fixed widget bc yall are obligated to listen to my amazing music taste ty SerenityUX for the amazing guide ty google for the search engine ty claude for saving me from mental collapse during debugging future updates: add more apps (gallery app hopefully), make UI better, add location tracking for real time weather and stuff basically js make it do more things
this is a web-based OS made with html, css and javascript! features: login (password is 1234) notebook (markdown and code accepted) gallery (upload pictures) calculator spotify player calendar terminal to-do list system monitor search bar quick links time and weather tracker (easter egg found here) challenges: ZERO time to work bugs bugs bugs previous versions: elenaOS (june 2026) kpopOS (august 2026) enjoy!...
|
1793278255.2487304
|
1793364655.2487304
|
|
63485
|
mythangg by @samarnova | Stardance
|
samarnova
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: mythangg by @samarnova | Stardance
|
1793051490.2800996
|
1793656290.2800996
|
|
46323
|
mytab by @krupa_pramod | Stardance
|
krupa_pramod
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-30T22:08:29Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a study tab, which has a search engine and various other aspects that I think look good and are also useful for productivity. It has a tasks bar, a widget with Kanye quotes you can keep generating, a search bar that connects to Google, shortcuts to some of my favorite websites, a song, NASAs APOD which updates daily using an API, and the date and time. This was made in HTML, CSS, and JS. It was kind of challenging figuring out the API at first but with the help of the guide I was able to figure out. Overall a fun website to make and I may even use it while studying…", "repo": "https://github.com/krupa-pramod/nasaweb", "demo": "https://krupa-pramod.github.io/nasaweb/"}]...
|
[{"post_id": 58466, "ts": "202 [{"post_id": 58466, "ts": "2026-08-30T21:44:31Z", "hours": 0.4475, "text": "Added shortcuts to Spotify, Github, and Pinterest! Also made the search bar functional (finally), and added the date bar that updates constantly. That was pretty easy since I learnt it in the oS project as well haha. Starting to look more filled!"}, {"post_id": 57579, "ts": "2026-08-29T19:22:10Z", "hours": 0.625, "text": "Added a tasks widget. You can enter tasks, click on them to clear it (check it off), and clear the entire thing. Kind of just did this to delay doing the search bar thing but that’s next actually now. Also tried to make it a little more visually appealing but I still feel like something’s off… hopefully adding a bar with like the date/time and maybe weather will fix that."}, {"post_id": 57056, "ts": "2026-08-29T04:20:12Z", "hours": 1.6194, "text": "I have decided to make a studying kind of tab! I added the nasa photo of the day and also a random kanye quote generator I found online… I also made the search bar in HTML/CSS but it is not functional so next time I will probably be implementing the JS logic for that. So far so good!"}]...
|
Title: mytab by @krupa_pramod | Stardance
Devlogs Title: mytab by @krupa_pramod | Stardance
Devlogs:
I have decided to make a studying kind of tab! I added the nasa photo of the day and also a random kanye quote generator I found online… I also made the search bar in HTML/CSS but it is not functional so next time I will probably be implementing the JS logic for that. So far so good!
Added a tasks widget. You can enter tasks, click on them to clear it (check it off), and clear the entire thing. Kind of just did this to delay doing the search bar thing but that’s next actually now. Also tried to make it a little more visually appealing but I still feel like something’s off… hopefully adding a bar with like the date/time and maybe weather will fix that.
Added shortcuts to Spotify, Github, and Pinterest! Also made the search bar functional (finally), and added the date bar that updates constantly. That was pretty easy since I learnt it in the oS project as well haha. Starting to look more filled!
Ships:
I made a study tab, which has a search engine and various other aspects that I think look good and are also useful for productivity. It has a tasks bar, a widget with Kanye quotes you can keep generating, a search bar that connects to Google, shortcuts to some of my favorite websites, a song, NASAs APOD which updates daily using an API, and the date and time. This was made in HTML, CSS, and JS. It was kind of challenging figuring out the API at first but with the help of the guide I was able to figure out. Overall a fun website to make and I may even use it while studying…...
|
1793263778.8465385
|
1793350178.8465385
|
|
55193
|
mysupercoolprojectt by @porgsrpogs | Stardance
|
porgsrpogs
|
0
|
36.26
|
0
|
[]
|
[{"post_id": 56182, "ts": "202 [{"post_id": 56182, "ts": "2026-08-27T20:24:23Z", "hours": 36.2578, "text": "cool devlog"}]...
|
Title: mysupercoolprojectt by @porgsrpogs | Starda Title: mysupercoolprojectt by @porgsrpogs | Stardance
Devlogs:
cool devlog...
|
1793148535.4562933
|
1793753335.4562933
|
|
43322
|
myst. by @pri3 | Stardance
|
pri3
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myst. by @pri3 | Stardance
|
1793216936.4328954
|
1793821736.4328954
|
|
50995
|
myslack-bot 011 by @keshav666 | Stardance
|
keshav666
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-18T17:09:27Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "so i make a slack bot and the challange is that i accedently add this bot to some channel and after they remove the bot i was able to focus on project i have to find api keys for weather and also need to render this for 24/ 7 . Thank you", "repo": "https://github.com/keshav66m/myslack-bot-011", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 49719, "ts": "202 [{"post_id": 49719, "ts": "2026-08-18T17:06:53Z", "hours": 1.4392, "text": "so guys i was working on slack bot and my slack bot can do some commands i will add other commands in future . Thank you"}]...
|
Title: myslack-bot 011 by @keshav666 | Stardance
Title: myslack-bot 011 by @keshav666 | Stardance
Devlogs:
so guys i was working on slack bot and my slack bot can do some commands i will add other commands in future . Thank you
Ships:
so i make a slack bot and the challange is that i accedently add this bot to some channel and after they remove the bot i was able to focus on project i have to find api keys for weather and also need to render this for 24/ 7 . Thank you...
|
1793224323.832073
|
1793310723.832073
|
|
53895
|
mysite by @Polar | Stardance
|
Polar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: mysite by @Polar | Stardance
|
1792910884.1500936
|
1793774884.1500936
|
|
48874
|
myself by @trace | Stardance
|
trace
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myself by @trace | Stardance
|
1793249672.62932
|
1793854472.62932
|
|
69594
|
myproj by @john4 | Stardance
|
john4
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myproj by @john4 | Stardance
|
1792857188.263283
|
1793461988.263283
|
|
13305
|
mypochats by @barfpile | Stardance
|
barfpile
|
1
|
13.05
|
15
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T19:26:46Z", "hours": 12.0, "multiplier": 1.24, "payout": 15, "blessing": "neutral", "text": "It was difficult staying in the constraints of an ESP32, but now I’m super happy because it works pretty well!", "repo": "https://github.com/fries-git/mpyochats", "demo": "https://fries.hackclub.app/client"}]...
|
[{"post_id": 20899, "ts": "202 [{"post_id": 20899, "ts": "2026-07-02T16:56:57Z", "hours": 1.0469, "text": "Wrapping up here adding message editing, worked on polls but I don’t think I’m going to implement them. Once this is done I may basically be done with this project. :O"}, {"post_id": 20190, "ts": "2026-07-01T18:57:44Z", "hours": 1.11, "text": "Capabilities, Slash Commands, and Polls - Capabilities are sent from server to client and vice versa to determine what the client can and can’t do. Examples include: creating polls, uploading emojis, creating threads, server-side embeds, etc. Slash commands are like Discord’s in which predefined commands are created and displayer in a gui, and called with /command name. They’re not fully implemented yet but will allow banning, kicking, timing out, and anything else you define. Polls are… Well they’re polls. Not yet implemented fully, as they aren’t even on the main server, polls let you create infinite options, set how long the poll exists for, and vote on it in real time."}, {"post_id": 18742, "ts": "2026-06-29T22:35:58Z", "hours": 0.5894, "text": "Emojis and more. This project is now, with all emojis but no message history, 50 KB while maintaining near full feature completeness to the original. (note that combined the emojis make up about 20/50kb"}, {"post_id": 15192, "ts": "2026-06-24T18:10:19Z", "hours": 0.7519, "text": "Emojis are implemented!"}, {"post_id": 15104, "ts": "2026-06-24T15:24:26Z", "hours": 0.3867, "text": "Emojis. I’ve been implementing emojis."}, {"post_id": 8956, "ts": "2026-06-14T22:10:27Z", "hours": 9.4833, "text": "i finished it. i forgot devlogs… its a decentralized chat server running on an esp32"}]...
|
Title: mypochats by @barfpile | Stardance
Devlogs Title: mypochats by @barfpile | Stardance
Devlogs:
i finished it. i forgot devlogs… its a decentralized chat server running on an esp32
Emojis. I’ve been implementing emojis.
Emojis are implemented!
Emojis and more. This project is now, with all emojis but no message history, 50 KB while maintaining near full feature completeness to the original. (note that combined the emojis make up about 20/50kb
Capabilities, Slash Commands, and Polls - Capabilities are sent from server to client and vice versa to determine what the client can and can’t do. Examples include: creating polls, uploading emojis, creating threads, server-side embeds, etc. Slash commands are like Discord’s in which predefined commands are created and displayer in a gui, and called with /command name. They’re not fully implemented yet but will allow banning, kicking, timing out, and anything else you define. Polls are… Well they’re polls. Not yet implemented fully, as they aren’t even on the main server, polls let you create infinite options, set how long the poll exists for, and vote on it in real time.
Wrapping up here adding message editing, worked on polls but I don’t think I’m going to implement them. Once this is done I may basically be done with this project. :O
Ships:
It was difficult staying in the constraints of an ESP32, but now I’m super happy because it works pretty well!...
|
1793307357.5703673
|
1793393757.5703673
|
|
50576
|
mypersonalsite by @netcatsyn | Stardance
|
netcatsyn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: mypersonalsite by @netcatsyn | Stardance
|
1793350474.0821779
|
1793955274.0821779
|
|
62470
|
mymelody flappy bird by @prateeka_k | Stardance
|
prateeka_k
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: mymelody flappy bird by @prateeka_k | Stard Title: mymelody flappy bird by @prateeka_k | Stardance...
|
1793044441.535963
|
1793649241.535963
|
|
64354
|
myke by @maicol | Stardance
|
maicol
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myke by @maicol | Stardance
|
1793062362.971282
|
1793667162.971282
|
|
31835
|
myhomeproject by @JVishal | Stardance
|
JVishal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myhomeproject by @JVishal | Stardance
|
1793397067.3531418
|
1794001867.3531418
|
|
54558
|
myhackpad by @piyushoutthere | Stardance
|
piyushoutthere
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myhackpad by @piyushoutthere | Stardance
|
1792914628.859019
|
1793778628.859019
|
|
54559
|
myhackpad by @piyushoutthere | Stardance
|
piyushoutthere
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myhackpad by @piyushoutthere | Stardance
|
1792914629.6873643
|
1793778629.6873643
|
|
54560
|
myhackpad by @piyushoutthere | Stardance
|
piyushoutthere
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myhackpad by @piyushoutthere | Stardance
|
1792914630.5199096
|
1793778630.5199096
|
|
34861
|
myfirstapp by @xek20090428 | Stardance
|
xek20090428
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myfirstapp by @xek20090428 | Stardance
|
1792799472.3772807
|
1793404272.3772807
|
|
43244
|
mychess by @MEGAmoos | Stardance
|
MEGAmoos
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: mychess by @MEGAmoos | Stardance
|
1793210002.1080902
|
1793814802.1080902
|
|
40652
|
myburgpet by @lorenzop | Stardance
|
lorenzop
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myburgpet by @lorenzop | Stardance
|
1792774080.5015123
|
1793378880.5015123
|
|
70967
|
mybio by @md_salim | Stardance
|
md_salim
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: mybio by @md_salim | Stardance
|
1792702031.6122785
|
1793306831.6122785
|
|
51604
|
my_website by @simeon_ | Stardance
|
simeon_
|
0
|
1.26
|
0
|
[]
|
[{"post_id": 51546, "ts": "202 [{"post_id": 51546, "ts": "2026-08-21T09:43:06Z", "hours": 1.2567, "text": "its allmost done the html css and js is finaged"}]...
|
Title: my_website by @simeon_ | Stardance
Devlogs Title: my_website by @simeon_ | Stardance
Devlogs:
its allmost done the html css and js is finaged...
|
1793397367.9162428
|
1794002167.9162428
|
|
59880
|
my_warioware_game by @zunno_francesco | Stardance
|
zunno_francesco
|
0
|
0.83
|
0
|
[]
|
[{"post_id": 64348, "ts": "202 [{"post_id": 64348, "ts": "2026-09-08T17:28:11Z", "hours": 0.8333, "text": "first time coding a game pls give me advice were to learn something asap"}]...
|
Title: my_warioware_game by @zunno_francesco | Sta Title: my_warioware_game by @zunno_francesco | Stardance
Devlogs:
first time coding a game pls give me advice were to learn something asap...
|
1793029954.7630408
|
1793634754.7630408
|
|
67091
|
my_portfolio by @G4 | Stardance
|
G4
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: my_portfolio by @G4 | Stardance
|
1793105660.8437157
|
1793710460.8437157
|
|
62985
|
my_childhood_game by @bilawal_akber69 | Stardance
|
bilawal_akber69
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: my_childhood_game by @bilawal_akber69 | Sta Title: my_childhood_game by @bilawal_akber69 | Stardance...
|
1793047940.2903109
|
1793652740.2903109
|
|
28227
|
myWebsite by @AfterWorld | Stardance
|
AfterWorld
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myWebsite by @AfterWorld | Stardance
|
1793354169.7071762
|
1793958969.7071762
|
|
71382
|
myWebOS by @kratak | Stardance
|
kratak
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myWebOS by @kratak | Stardance
|
1792964824.1076593
|
1793569624.1076593
|
|
55192
|
myProject by @porgsrpogs | Stardance
|
porgsrpogs
|
0
|
36.37
|
0
|
[]
|
[{"post_id": 56179, "ts": "202 [{"post_id": 56179, "ts": "2026-08-27T20:21:43Z", "hours": 36.365, "text": "hi"}]...
|
Title: myProject by @porgsrpogs | Stardance
Devlo Title: myProject by @porgsrpogs | Stardance
Devlogs:
hi...
|
1793148530.8989148
|
1793753330.8989148
|
|
6964
|
myPad by @Wyatt26 | Stardance
|
Wyatt26
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myPad by @Wyatt26 | Stardance
|
1793386119.694835
|
1793990919.694835
|
|
18394
|
myMusic by @cluelessfr | Stardance
|
cluelessfr
|
3
|
105.0
|
1498
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-01T04:09:47Z", "hours": 49.0, "multiplier": 12.73, "payout": 608, "blessing": "neutral", "text": "I made myMusic, a Windows/Linux app that allows you to download your favorite songs. It works by searching YouTube/YouTube music for videos of your song. Then, using yt-dlp, it is able to download your song as an mp3 file. Finally it adds all of the metadata, allowing you to properly listen to your music offline. This is ship #3 of my project, so let me explain all of the changes since the last ship: First I finally added support for playlist and album downloads. Now instead of putting in each separate track individually you can combine it into a playlist and download that all together. For this I also had to update the GUI in order to fit all of the song information together. Second I improved the song searching and reliability. I made things consistent with how YouTube expects them (ASCII, Unicode characters, etc.). I also combine YouTube Music and YouTube candidates, so you get the best of both worlds. The app also tries multiple candidates before declaring that track a fail. Third I introduced explicit-version matching. Before, you would sometimes get the clean version of an explicit song. To fix this I switched to ytmusicapi, which allows me to compare matches to determine which one fits the criteria the best. The API also allows me to see whether or not the song is clean, which makes matching easier. Fourth (and probably the biggest update) I was able to add a Spicetify extension with the app. Because of this you are now able to download your favorite songs directly from the Spotify windows app. It reuses Spotify’s native download button rows, which make it easy to download your songs. It also preserves native behavior if you are already on Spotify Premium. It also shows notifications about the status of your download. This is only available on Windows. Fifth in order to make the Spotify integration work, the app now opens up a FastAPI/Uvicorn server bound to 127.0.0.1:18492. I chose a far away port in order for it not to affect any other local host processes. Sixth I also added background behavior for the app. This keeps the app open in the background without it being open on the gui (you will still be able to see it in your system tray). This allows the Spotify integration to run seamlessly without interfering with your every day work. Seventh I greatly improved the in app updater speed. Before it would greatly lag your computer because the chunk sizes were so small and it had to do a lot of writes to your disk. Now I increased the chunk size, and updated the packaging configurations to further boost the download speed and app size. These were all the main updates I did to my app, hope you like it!", "repo": "https://github.com/cluelessfr/myMusic", "demo": "https://github.com/cluelessfr/myMusic/releases/tag/v2.0.1"}, {"ship_num": 2, "ts": "2026-07-06T17:31:14Z", "hours": 34.0, "multiplier": 18.59, "payout": 611, "blessing": "neutral", "text": "I made myMusic, a Windows desktop app that takes a Spotify track link, previews the song details, finds a matching audio result, downloads it, converts it to MP3, and saves it with basic metadata tags. This is Ship #2 of my project. There have been a quite a few changes since my last ship, so let me list them all: First I added a folder-picking dialog. This allows the user to change the directory their songs are downloaded to, instead of being forced to always download to the “Downloads” directory. The app also saves the last chosen directory, so even if you close and reopen the app the directory is still saved. I then bundled Deno into the app, which helps yt-dlp solve JS challenges. Then I added the Spotify oEmbed metadata as fallback metadata if the SpotifyScraper python package fails. I also added YouTube as a partner with YouTube Music to get the best results from both platforms. I then a ranking system for the songs. The program adds and removes points from the top 6 matches from both platforms based on a few criteria, then it tries downloading from highest to least ranked. Then I also started embedding cover art. The app now takes in the cover art link, streams it, then writes it to the audio file. Next I added in-app update checking. The app can search the github repo for the latest version, checks to see if it is newer, then can automatically download and installer it. I also polished up the UI so that the controls and labels are more organized. Finally, I added Linux x64 and Linux ARM64 support. This has the same behavior as the Windows app, but the dependencies are now installed natively on that platform, which makes the app run more reliably on Linux. The current latest version at the time of this ship is v1.3.0.", "repo": "https://github.com/cluelessfr/myMusic", "demo": "https://github.com/cluelessfr/myMusic/releases/tag/v2.0.1"}, {"ship_num": 3, "ts": "2026-06-18T06:15:48Z", "hours": 22.0, "multiplier": 13.37, "payout": 279, "blessing": "neutral", "text": "I made myMusic, a Windows desktop app that takes a Spotify track link, previews the song details, finds a matching audio result, downloads it, converts it to MP3, and saves it with basic metadata tags. The hardest part was turning it from a local Python project into something other people can actually run: bundling FFmpeg, building the Windows executable, creating an installer, and writing clear install/testing instructions. These were all new steps that I wasn’t familiar with before, so I had to heavily research them and get familiar with them before shipping. I am proud that I was able to get it working as a real, bundled Windows desktop app, instead of a small project that runs only on my computer. To test it, use the Try Project link, download the v1.0.1 Windows installer, install it, open myMusic, paste a Spotify track link, click Preview Song Details, then click Download. The finished MP3 should appear in your Downloads folder. Windows may show SmartScreen because the app is unsigned; the release notes explain how to continue.", "repo": "https://github.com/cluelessfr/myMusic", "demo": "https://github.com/cluelessfr/myMusic/releases/tag/v2.0.1"}]...
|
[{"post_id": 38621, "ts": "202 [{"post_id": 38621, "ts": "2026-08-01T03:30:24Z", "hours": 2.9203, "text": "Devlog 39: I was finally able to get the Linux guards in place, and also packaged the new builds and released them to GitHub has a new version. The guards were mostly simple, as they were just a few checks that asked what operating system the user was on. And depending on that it decided whether or not to install the Spicetify extensions."}, {"post_id": 38528, "ts": "2026-07-31T23:36:25Z", "hours": 7.4581, "text": "Devlog 38: I worked on functions that helped install the Spicetify extension into the Spicetify configuration. I had to ensure Spicetify was installer, had to find its path, had to find its extensions path, then finally copy over the extension. I also added system tray behavior and multiple instance detection for the app, so that now when you close the app it doesn’t close but instead goes to the system tray. This allows the Spotify integration to work even if the app itself isn’t visible. The multiple instance detection ensures the app runs properly, and ensures that the app doesn’t try to use the same http port twice, resulting in errors. This did take a while but now all I have to do is create guards for Linux, so that the Spotify integration only works on Windows and doesn’t create unexpected errors on Linux."}, {"post_id": 37449, "ts": "2026-07-30T06:15:53Z", "hours": 4.1092, "text": "Devlog 37: I am very close to shipping now. I added the Spotify status/progress update messages, so now you can see when the tracks have finished downloading. I also fixed three (kinda major) bugs. First of all there was an error when searching for the songs on YouTube/YouTube Music. Basically what happened was that the title didn’t follow the same ASCII conventions that was used by YouTube. Because of this the app would reject good title matches even though they were the same. This produced quite a few errors, especially when trying to download songs with apostrophes. The second error I fixed was the some songs would automatically have the clean version downloaded. To fix this I switched to the ytmusicapi python package. This package also returned whether the song was explicit or not. Because of this I was able to check whether or not the song was intended to be that way, and if not I could prevent that match from being downloaded. I did have to edit a few functions to accept the new format, but in the end everything worked. Third I fixed a simple error that messed up the searching. This time it wasn’t really a bug, but instead an edge case that I missed. I was catching keywords like “feat.” and “featuring”, but I didn’t catch words like “From (and tv show, etc.)”. Because of this some matches were getting left out. I fixed this by adding another regex pattern that removes this as well."}, {"post_id": 37238, "ts": "2026-07-29T19:53:38Z", "hours": 2.6647, "text": "Devlog 36: I am almost done with the first phase of the integration. When the download button is clicked inside of Spotify, Spicetify intercepts it and now posts a request to the open web server. Then the python script gets notified of that request, decodes it, then automatically starts downloading the song/playlist/album. The only thing is that the myMusic app has to be open while doing this, but I will remove that requirement in the future (not now). The next step would be to add status reports to Spotify so that the user knows what the status of their download is."}, {"post_id": 36598, "ts": "2026-07-28T20:17:16Z", "hours": 2.8025, "text": "Devlog 35: The app now creates its own server on a very distant and far port so that your other local host stuff doesn’t get affected. I did this with uvicorn and threading, so that creating the port doesn’t make the app freeze. With this functionality the app can get the requests made inside Spotify and automatically download them. The next step is to get the app to report the statuses of the download jobs (queued, downloading, completed, failed, etc.). Then I would actually have to connect both parts, let Spotify send messages and the app receive the message."}, {"post_id": 35435, "ts": "2026-07-26T20:46:18Z", "hours": 4.8314, "text": "Devlog 34: I have been working on creating a queue for the requests. This ensures that the user can download multiple songs at once without having to wait for the previous ones to be finished. So far I have been able to create a request id for each request. The app can update the attributes of each request, such as its status, and error message. On top of this once a request is completed the app also automatically removes that request."}, {"post_id": 31912, "ts": "2026-07-20T18:12:07Z", "hours": 3.5339, "text": "Devlog 33: The app is now able to understand and automatically download any received links. Now the problem is that Spotify isn’t able to send any normal requests to via the computer. Because of this I need to find a way for Spotify to send and get data. I know that Spotify (using Spicetify) can send and get http requests. Because of that I am planning to use FastAPI and a local http server to be able to send and get data so the app can automatically download tracks. I will ensure to keep the server in a high index to ensure it doesn’t get in the way of any other local servers."}, {"post_id": 29252, "ts": "2026-07-16T01:35:08Z", "hours": 6.2167, "text": "Devlog 32: (sorry for the late post) I have been working on a really cool feature for the app. Basically what I am trying to do is integrate the myMusic pipeline into the windows Spotify app itself. When you right click a playlist or album, there will be a menu that pops up. Usually for normal Spotify users (not on premium) there will be a greyed out download button. What I am trying to do is two things: add a download button for tracks (because there isn’t one right now), and make the playlist/album button actually work. Right now what I have accomplished is adding a new button for the track and making the playlist/album button clickable. I was able to do this by using Spicetify and its framework. Because I already have it installed on my computer I am using it to test everything out but later I will bundle it with my app. What I did was build a custom Spicetify extension (I had to learn JavaScript) that creates a new button. I was able to make the original playlist/album button work because it was only “aria-disabled”, not actually disabled. This means that it was only disabled at the UI level, but Spotify still recorded clicks. By applying some UI changes I was able to make the button look enabled and still record clicks. My next step is to actually hook this up to the Python script. I think this is a really cool feature."}, {"post_id": 28364, "ts": "2026-07-14T16:05:28Z", "hours": 2.7422, "text": "Devlog 31: This devlog was mainly focused on the efficiency and speed of updating the app. Before the data would come in really small packets, meaning the cpu would have to write to the drive about 130,000 times in total (I know 😭). I adjusted this so it now comes in larger packets so the cpu doesn’t have to do more work. I also adjusted the compression and a few other Inno Setup settings (number of threads, etc.) to make the app more efficient in general. Another issue that I found is that once the app updated (specifically in Windows, idk about other platforms) the settings app would still show the older version for some time. This was an issue with the timing, so I had to adjust some of the delays to get it to work properly. Overall I think this is a pretty good update."}, {"post_id": 27877, "ts": "2026-07-13T19:39:38Z", "hours": 6.6931, "text": "Devlog 30: I FINALLY implemented playlist and album support. At first I thought it would be simple, just looping though each song in the playlist/album. Oh was I wrong. First I had to add two more methods that looped though each song, one for playlists and one for albums. There had to be two different ones because each returned metadata differently. Then I had to kind of change the format of the whole thing, because I had to store all of the songs in a list, but currently I was only returning dictionaries from all of my methods. After getting all of that sorted out I had to actually fix the GUI/downloading part. I had to update the downloading method to handle playlist/album links, then I had to properly handle all of the status message for each song (“Ready”, “Downloading”, “Failed”). Finally I had to work on fixing the bugs I had introduced and handling the edge cases. After all of that I FINALLY had playlist and album support. One thing that was sorta tough was handling the status for each track individually. Before I was just looping through the entire list and setting all of the statuses to the same thing, but I was able to create a new method and change each song status as it was being downloaded, not for every song as a whole."}, {"post_id": 25666, "ts": "2026-07-10T02:30:59Z", "hours": 5.3094, "text": "Devlog 29: This is kind of a messy devlog, so I’ll lay it out as best as I can. First, I update the UI in preparation for playlist/album support. Before it was three static text fields that could only display one song at a time. Now I replaced it with a scrollable frame, with the ability to add more sections inside the frame for more songs. This frame also has the ability to display metadata. I also introduced a status message that shows different messages and colors depending on the status. While I was doing that (and I am not done with it), I decided to stop in the middle and fix another bug. This bug (that was reported by other people as well as my testing) prevented good matches from ranked properly. This was a problem with how I compared the titles in my ranker. To fix this I added two new functions, one that normalizes the candidate title, and another that normalizes the actual Spotify song name (mainly to exclude features and get just the song name). To do this I messed around a lot with regex patterns, so I learned a lot. Now I have to go back and continue working on the new UI for playlists and albums."}, {"post_id": 23538, "ts": "2026-07-06T15:46:31Z", "hours": 3.8236, "text": "Devlog 28: Based on feedback from my first ship, I have decided to introduce Linux support. I thought it would be easy, but it turned out to be a little harder than I thought. The first thing I had to do was rewrite some of the Path code that saves the users download directory. This is because Linux and Windows have different file systems, and I had to account for both. Then came the hard part, Packaging. For ARM, I decided to do this on my Raspberry Pi, where I downloaded the project files from git, downloaded the OS specific FFMPEG and Deno, then repackaged the app as a .tar.gz. I decided to do it this way because this is sort of simply an experimental release. For x64 I decided to use GitHub Actions, which allowed me to download the dependencies and compile without having to spin up a new Virtual Machine. I also decided to keep this as a .tar.gz. Later, once I get more feedback about the Linux versions, I am planning to release a more universal app package (.flatpak). I also had to change the update checkers, because each OS version has to check its own corresponding file. In the end this was a very unique experience and I learned a lot of things about packaging apps on Linux."}, {"post_id": 21260, "ts": "2026-07-03T03:02:23Z", "hours": 5.4692, "text": "Devlog 27: This is a pretty major update. The myMusic can now automatically download and install updates, without the user having to go and download the github repository. Before, the user would manually have to go and download the installer from github, and set it up like a completely new install. Now, the app itself has a “Check for Updates” button. This button checks the github for the latest version, and if there is a newer version available it gives the user an option to download and install that. If they change their mind during the download, there is a cancel option as well. This works by first getting the github version (latest), then seeing if the current app version matches that. If it does, the app is up to date. If not, then the app can fetch the executable using the github API and automatically download the latest installer. On top of this some inno setup tools allow the app to close the app, install the new version, and reopen the app by itself. The only caveat is that this only works starting from v1.2.0. This means that if you have an older version you will have to manually download v1.2.0 in order to start getting automatic app updates."}, {"post_id": 20302, "ts": "2026-07-01T21:16:28Z", "hours": 1.2353, "text": "Devlog 26: Added a function to help with auto-downloading new updates. I haven’t hooked it up to the UI yet, but that is my next step. The function takes in the name of the installer and the link to download it. It first downloads the installer to a temp file, then once everything is good it saves it to a real executable."}, {"post_id": 19419, "ts": "2026-06-30T18:55:12Z", "hours": 1.0339, "text": "Devlog 25: This update was about implementing the update checker from the last devlog. Now there is an in-app button that allows you to check for new updates. The implementation was similar to all the other buttons and didn’t take too long because I already had the function ready. The next step is to allow the app to actually download and install the update, instead of just pointing out it is available."}, {"post_id": 19007, "ts": "2026-06-30T05:16:32Z", "hours": 1.6642, "text": "Devlog 24: I have started adding implementations that checks for the latest version of the app from github. It uses the github API endpoint for my specific project, then reads the json to get any version information. Using that we can compare the current version to the latest version on the github to see if there are any updates available. Currently I have only created the function and am yet to implement this feature into the actual app/GUI."}, {"post_id": 18082, "ts": "2026-06-29T02:24:36Z", "hours": 1.4658, "text": "Devlog 23: Today I added the feature that embeds cover art into the mp3 files. To do this I had to first use the requests library in Python to get the image itself. Instead of downloading the image I kept it in memory using the ‘io’ library. This made the metadata tagging safer and faster. Finally the app uses mutagen to embed the cover art into the mp3 file. I used a try and except loop, which ensures that even if the cover art adding fails the mp3 file still gets returned, just without the art."}, {"post_id": 17306, "ts": "2026-06-28T01:07:06Z", "hours": 1.4167, "text": "Devlog 22 This update was about further increasing the matching strength. Before the program would automatically download the highest ranked candidate, even if it was very low. Now the app downloads the highest ranked candidate only if its ranked above a certain thresh hold. If there are no qualifying matches then the app simply returns a no matches found error. This wasn’t that complicated, but I had to modify a few functions so that the score was returned properly and in a usable format."}, {"post_id": 16647, "ts": "2026-06-27T02:18:17Z", "hours": 2.3261, "text": "Devlog 21: Now added real YouTube (YT) to the match finding instead of just YouTube Music (YTM). Before the songs were found only on YTM, but I realist that normal YT has a larger list of songs, so I decided to add that to the algorithm as well. Now, the program takes 3 songs from YTM and 3 songs from YT, and uses the ranking function I created before to sort them from best to worst. Then the program starts by trying to download the best match. If it can’t, it goes through the list until if finds one it can download. If none of them download, then it sends an error message. One thing with this step was that I tried not to repeat big chunks of code, as a lot of this was similar to the original YTM downloading method."}, {"post_id": 16559, "ts": "2026-06-26T22:37:04Z", "hours": 1.9589, "text": "Devlog 20: Added the Spotify OEmbed fallback. Now even if the SpotifyScraper python package fails we have a fallback to get as much metadata as we can. This wasn’t that hard, as I already had the file from a previous time. The hard part was accounting for all the different cases, such as the title being missing or an empty string. I had to account for all of those while integrating the new file."}, {"post_id": 15864, "ts": "2026-06-25T19:50:13Z", "hours": 0.3722, "text": "Devlog 19: Implemented the ranking feature from the last devlog. Now, the best candidates are ranked in order from best to worst, and that is the order in which they are downloaded."}, {"post_id": 15836, "ts": "2026-06-25T19:07:36Z", "hours": 0.9022, "text": "Devlog 18: I implemented a way to start scoring the candidates returned by YT-DLP. This ensures that even if the first candidate returned is not the best, the program can automatically filter out the bad ones using key words and ensure the best candidate is always selected. I have only coded this function for now, and I have to wire it in to the real app soon."}, {"post_id": 15337, "ts": "2026-06-24T22:21:13Z", "hours": 3.4889, "text": "Devlog 17: Did some major code cleanups. No new features, but made the code more efficient. Also reorganized some files. The hard part was keeping the functionality the same while trying to make the code non-repetitive and more efficient. I also tried to fix any warnings that were present in the code that were caught by the IDE."}, {"post_id": 13864, "ts": "2026-06-22T18:38:18Z", "hours": 1.5628, "text": "Devlog 16: Simple update, but I added a new error message to account for a yt-dlp botting error. Now, when YouTube sends an error saying that the request was blocked due to botting being suspected, it sends a properly formatted error message instead of the raw yt-dlp text. I retested everything to ensure the previous functionality of the app remained the same."}, {"post_id": 13481, "ts": "2026-06-22T02:29:05Z", "hours": 3.7828, "text": "Devlog 15: Improved song selection algorithm, so it selects the next best track if the first selection is invalid. Before if the first track selected by YT-DLP didn’t work/was invalid, then the whole program would fail. Now it moves on to the next if the first one doesn’t work. I also update the progress messages, so it shows which match it is trying."}, {"post_id": 11619, "ts": "2026-06-18T22:25:28Z", "hours": 3.6753, "text": "Devlog 14: I have implemented two new features. First I implemented a feature that allows users to switch the directory where songs get downloaded. This took some time, but I was able to get it in the end. It works by creating a new button which opens a folder picking dialogue. The path that the user seclects inside this dialogue then gets saved to a local json file. Everytime the user changes the path it gets saved to the json, which allows the program to always open up the last directory selected by the user. I had to implement some checks to ensure that the program would work even if the json file was missing or corrupted. The second feature is more of an update. The static “Downloading” progress message is now updated with real time info on what the program is doing. The next step would be adding a dynamic progress bar."}, {"post_id": 11117, "ts": "2026-06-18T05:51:42Z", "hours": 1.4456, "text": "Devlog 13: I added an installer .exe file, added screenshots to the readme, and added a new release on GitHub. Configuring the installer was a little hard, as I was new to this process and didn’t know where to start. I used Codex to help me figure out that I could use a program called Inno. This handled the installer file, uninstall, as well as configuring it with Windows. Codex guided me through how to set that up, and eventually I got everything working. Finally I created a new version on Git and pushed everything."}, {"post_id": 10999, "ts": "2026-06-18T00:51:48Z", "hours": 1.1539, "text": "Devlog 12: I compiled the app into a .exe, updated the readme, and pushed the first version to git. I ran into some issues when compiling the app. Specifically after the initial compiling YT-DLP couldn’t see the location of FFMPEG. Because of this I had to update the “get_app_root.py” file so it accounted for the file changes when compiling."}, {"post_id": 10925, "ts": "2026-06-17T22:01:48Z", "hours": 1.1078, "text": "Devlog 11: I added a preview button to the GUI so that users could see the song details and confirm they were right before downloading the song. also prepared for packaging this file into an executable (.exe)."}, {"post_id": 10860, "ts": "2026-06-17T20:15:14Z", "hours": 1.8986, "text": "Devlog 10: Added app.py and introduced a GUI window using Custom Tkinter. Now when users run app.py they see a new desktop window open up, see a text box and a download button. Once they paste in a Spotify link they see status messages like “Downloading”. At the end they also see the downloaded path. On top of this if there are any errors during the download (like fetching metadata), this also displays as a status message. This took a little bit because I get to get familiar with Custom Tkinter, add another function that gets called by the button, and add some safeguards/quality of life updates. The main safeguard was disabling the download button while the song was downloading, which ensured the user didn’t spam processes. The quality of life update was that the download path now wraps the text to multiple lines if the path is very long."}, {"post_id": 10426, "ts": "2026-06-17T04:14:00Z", "hours": 0.4461, "text": "Devlog 09 Simple update, but it now uses Mutagen to add track name, artists, and album name to the downloaded files."}, {"post_id": 10333, "ts": "2026-06-17T00:33:23Z", "hours": 1.6983, "text": "Devlog 08 Introduced FFMPEG to the project to be able to convert downloads from .webm to .mp3 files. Also change the song title to be the title of the song. Introduced a file check to ensure file names are valid and accepted by Windows."}, {"post_id": 10283, "ts": "2026-06-16T22:29:59Z", "hours": 1.0183, "text": "Devlog 07 The program now automatically uses YT-DLP to download the best match found. This works by using YT-DLP’s build in “Download” method. I pass in the number 1 match found by YT-DLP (built in the last devlog), and it downloads it to the users default “Downloads” folder. This is a major step in the project, and I am almost ready to ship the first version."}, {"post_id": 10156, "ts": "2026-06-16T19:30:33Z", "hours": 2.4497, "text": "Devlog 06 Major Update: Now added YT-DLP to the project. Now whenever you put in a valid link you get more than just the metadata. You also get the top 5 best matches from YouTube Music. This took a while because I had to learn to properly call and use the YT-DLP package in python. I created 3 helper functions. The first created the search query using the metadata, the second returned the search results, and the last one formatted and returned the results. I created one last function as a wrapper, such that when I passed in the metadata it returned the YouTube Music search results. When calling yt_dlp.YoutubeDL(), I got a type error when passing the parameters. This was because the package expected its own datatype, while I was simply passing a dictionary. I was able to fix this by setting the type to “Any” when passing in the argument. I also changed main.py to include the YouTube search results. Now, whenever you pass in a Spotify link you get the song metadata as well as well as the top 5 best matches from YouTube Music."}, {"post_id": 9712, "ts": "2026-06-16T04:05:09Z", "hours": 0.4872, "text": "Devlog 05 This is a pretty small update, all I did was add a small test file to be able to consistently check for errors and functionality."}, {"post_id": 9667, "ts": "2026-06-16T02:27:43Z", "hours": 3.6628, "text": "Devlog 04 This was a big change in the metadata retrieving/handling. Last devlog I explained how the new restrictions on the Spotify API made it difficult to fetch the metadata, so I had to use the public oEmbed API. This didn’t give much information and was hard to work with. After researching some more I found a python package that does the metadata fetching for me, “SpotifyScraper”. this package takes in a spotify url (which the user will be providing), and can get information like song names, artists, duration, etc. This was very useful for me when coding the metadata functions. On top of this it supports playlist and album inputs as well, which is great for future updates. I spent this time rewriting the metadata retrieving functions and cleaning everything up. I removed a few redundant functions and introduced proper error messages."}, {"post_id": 9279, "ts": "2026-06-15T16:04:31Z", "hours": 2.2303, "text": "Devlog 03 After getting the link cleaner to work, I wanted to use the Spotify API to get the metadata of the song. The problem with this is that Spotify introduced heavy limitations on its API earlier this year. Because of this I had to fallback to the Spotify oEmbed, which gives only provides the song name. I am still researching for more options."}, {"post_id": 9003, "ts": "2026-06-15T00:31:15Z", "hours": 3.3114, "text": "Devlog 02 This took a while, but I was able to make the program that strips the input down to only the Spotify link. This ensures that (for the most part) that only the Spotify link gets used, and not any other whitespace/extra characters that might have appeared. It took a while because I was researching and learning how to use the ‘re’ library in Python, and it took some trial and error/debugging to get the logic to work. How this works; The user inputs into the text field First the type of track gets identified (single track, playlist, album) Then it uses the ‘re’ library to detect the pattern of Spotify URLs and URIs. This ensures that the Spotify track is actually valid. It then uses the ‘.group()’ function to capture the matching section out of the input Finally the functions are checked to ensure everything is valid, then the type of track and song url are returned."}, {"post_id": 8718, "ts": "2026-06-14T14:15:06Z", "hours": 0.7378, "text": "Devlog 01 This is the initial commit for the myMusic project. I created the file system locally, then opened the project inside IntelliJ Idea. I kept things simple and only introduced a README for now. I ran into a few problems when pushing to GitHub. Mainly, the .gitignore was being placed inside a .idea folder (I think because I was using IntelliJ). Because of this I had to go back into the IDE and move the .gitignore into the main branch and not into a subfolder."}]...
|
Title: myMusic by @cluelessfr | Stardance
Devlogs Title: myMusic by @cluelessfr | Stardance
Devlogs:
Devlog 01 This is the initial commit for the myMusic project. I created the file system locally, then opened the project inside IntelliJ Idea. I kept things simple and only introduced a README for now. I ran into a few problems when pushing to GitHub. Mainly, the .gitignore was being placed inside a .idea folder (I think because I was using IntelliJ). Because of this I had to go back into the IDE and move the .gitignore into the main branch and not into a subfolder.
Devlog 02 This took a while, but I was able to make the program that strips the input down to only the Spotify link. This ensures that (for the most part) that only the Spotify link gets used, and not any other whitespace/extra characters that might have appeared. It took a while because I was researching and learning how to use the ‘re’ library in Python, and it took some trial and error/debugging to get the logic to work. How this works; The user inputs into the text field First the type of track gets identified (single track, playlist, album) Then it uses the ‘re’ library to detect the pattern of Spotify URLs and URIs. This ensures that the Spotify track is actually valid. It then uses the ‘.group()’ function to capture the matching section out of the input Finally the functions are checked to ensure everything is valid, then the type of track and song url are returned.
Devlog 03 After getting the link cleaner to work, I wanted to use the Spotify API to get the metadata of the song. The problem with this is that Spotify introduced heavy limitations on its API earlier this year. Because of this I had to fallback to the Spotify oEmbed, which gives only provides the song name. I am still researching for more options.
Devlog 04 This was a big change in the metadata retrieving/handling. Last devlog I explained how the new restrictions on the Spotify API made it difficult to fetch the metadata, so I had to use the public oEmbed API. This didn’t give much information and was hard to work with. After researching some more I found a python package that does the metadata fetching for me, “SpotifyScraper”. this package takes in a spotify url (which the user will be providing), and can get information like song names, artists, duration, etc. This was very useful for me when coding the metadata functions. On top of this it supports playlist and album inputs as well, which is great for future updates. I spent this time rewriting the metadata retrieving functions and cleaning everything up. I removed a few redundant functions and introduced proper error messages.
Devlog 05 This is a pretty small update, all I did was add a small test file to be able to consistently check for errors and functionality.
Devlog 06 Major Update: Now added YT-DLP to the project. Now whenever you put in a valid link you get more than just the metadata. You also get the top 5 best matches from YouTube Music. This took a while because I had to learn to properly call and use the YT-DLP package in python. I created 3 helper functions. The first created the search query using the metadata, the second returned the search results, and the last one formatted and returned the results. I created one last function as a wrapper, such that when I passed in the metadata it returned the YouTube Music search results. When calling yt_dlp.YoutubeDL(), I got a type error when passing the parameters. This was because the package expected its own datatype, while I was simply passing a dictionary. I was able to fix this by setting the type to “Any” when passing in the argument. I also changed main.py to include the YouTube search results. Now, whenever you pass in a Spotify link you get the song metadata as well as well as the top 5 best matches from YouTube Music.
Devlog 07 The program now automatically uses YT-DLP to download the best match found. This works by using YT-DLP’s build in “Download” method. I pass in the number 1 match found by YT-DLP (built in the last devlog), and it downloads it to the users default “Downloads” folder. This is a major step in the project, and I am almost ready to ship the first version.
Devlog 08 Introduced FFMPEG to the project to be able to convert downloads from .webm to .mp3 files. Also change the song title to be the title of the song. Introduced a file check to ensure file names are valid and accepted by Windows.
Devlog 09 Simple update, but it now uses Mutagen to add track name, artists, and album name to the downloaded files.
Devlog 10: Added app.py and introduced a GUI window using Custom Tkinter. Now when users run app.py they see a new desktop window open up, see a text box and a download button. Once they paste in a Spotify link they see status messages like “Downloading”. At the end they also see the downloaded path. On top of this if there are any errors during the download (like fetching metadata), this also displays as a status message. This took a little bit because I get to get familiar with Custom Tkinter, add another function that gets called by the button, and add some safeguards/quality of life updates. The main safeguard was disabling the download button while the song was downloading, which ensured the user didn’t spam processes. The quality of life update was that the download path now wraps the text to multiple lines if the path is very long.
Devlog 11: I added a preview button to the GUI so that users could see the song details and confirm they were right before downloading the song. also prepared for packaging this file into an executable (.exe).
Devlog 12: I compiled the app into a .exe, updated the readme, and pushed the first version to git. I ran into some issues when compiling the app. Specifically after the initial compiling YT-DLP couldn’t see the location of FFMPEG. Because of this I had to update the “get_app_root.py” file so it accounted for the file changes when compiling.
Devlog 13: I added an installer .exe file, added screenshots to the readme, and added a new release on GitHub. Configuring the installer was a little hard, as I was new to this process and didn’t know where to start. I used Codex to help me figure out that I could use a program called Inno. This handled the installer file, uninstall, as well as configuring it with Windows. Codex guided me through how to set that up, and eventually I got everything working. Finally I created a new version on Git and pushed everything.
Devlog 14: I have implemented two new features. First I implemented a feature that allows users to switch the directory where songs get downloaded. This took some time, but I was able to get it in the end. It works by creating a new button which opens a folder picking dialogue. The path that the user seclects inside this dialogue then gets saved to a local json file. Everytime the user changes the path it gets saved to the json, which allows the program to always open up the last directory selected by the user. I had to implement some checks to ensure that the program would work even if the json file was missing or corrupted. The second feature is more of an update. The static “Downloading” progress message is now updated with real time info on what the program is doing. The next step would be adding a dynamic progress bar.
Devlog 15: Improved song selection algorithm, so it selects the next best track if the first selection is invalid. Before if the first track selected by YT-DLP didn’t work/was invalid, then the whole program would fail. Now it moves on to the next if the first one doesn’t work. I also update the progress messages, so it shows which match it is trying.
Devlog 16: Simple update, but I added a new error message to account for a yt-dlp botting error. Now, when YouTube sends an error saying that the request was blocked due to botting being suspected, it sends a properly formatted error message instead of the raw yt-dlp text. I retested everything to ensure the previous functionality of the app remained the same.
Devlog 17: Did some major code cleanups. No new features, but made the code more efficient. Also reorganized some files. The hard part was keeping the functionality the same while trying to make the code non-repetitive and more efficient. I also tried to fix any warnings that were present in the code that were caught by the IDE.
Devlog 18: I implemented a way to start scoring the candidates returned by YT-DLP. This ensures that even if the first candidate returned is not the best, the program can automatically filter out the bad ones using key words and ensure the best candidate is always selected. I have only coded this function for now, and I have to wire it in to the real app soon.
Devlog 19: Implemented the ranking feature from the last devlog. Now, the best candidates are ranked in order from best to worst, and that is the order in which they are downloaded.
Devlog 20: Added the Spotify OEmbed fallback. Now even if the SpotifyScraper python package fails we have a fallback to get as much metadata as we can. This wasn’t that hard, as I already had the file from a previous time. The hard part was accounting for all the different cases, such as the title being missing or an empty string. I had to account for all of those while integrating the new file.
Devlog 21: Now added real YouTube (YT) to the match finding instead of just YouTube Music (YTM). Before the songs were found only on YTM, but I realist that normal YT has a larger list of songs, so I decided to add that to the algorithm as well. Now, the program takes 3 songs from YTM and 3 songs from YT, and uses the ranking function I created before to sort them from best to worst. Then the program starts by trying to download the best match. If it can’t, it goes through the list until if finds one it can download. If none of them download, then it sends an error message. One thing with this step was that I tried not to repeat big chunks of code, as a lot of this was similar to the original YTM downloading method.
Devlog 22 This update was about further increasing the matching strength. Before the program would automatically download the highest ranked candidate, even if it was very low. Now the app downloads the highest ranked candidate only if its ranked above a certain thresh hold. If there are no qualifying matches then the app simply returns a no matches found error. This wasn’t that complicated, but I had to modify a few functions so that the score was returned properly and in a usable format.
Devlog 23: Today I added the feature that embeds cover art into the mp3 files. To do this I had to first use the requests library in Python to get the image itself. Instead of downloading the image I kept it in memory using the ‘io’ library. This made the metadata tagging safer and faster. Finally the app uses mutagen to embed the cover art into the mp3 file. I used a try and except loop, which ensures that even if the cover art adding fails the mp3 file still gets returned, just without the art.
Devlog 24: I have started adding implementations that checks for the latest version of the app from github. It uses the github API endpoint for my specific project, then reads the json to get any version information. Using that we can compare the current version to the latest version on the github to see if there are any updates available. Currently I have only created the function and am yet to implement this feature into the actual app/GUI.
Devlog 25: This update was about implementing the update checker from the last devlog. Now there is an in-app button that allows you to check for new updates. The implementation was similar to all the other buttons and didn’t take too long because I already had the function ready. The next step is to allow the app to actually download and install the update, instead of just pointing out it is available.
Devlog 26: Added a function to help with auto-downloading new updates. I haven’t hooked it up to the UI yet, but that is my next step. The function takes in the name of the installer and the link to download it. It first downloads the installer to a temp file, then once everything is good it saves it to a real executable.
Devlog 27: This is a pretty major update. The myMusic can now automatically download and install updates, without the user having to go and download the github repository. Before, the user would manually have to go and download the installer from github, and set it up like a completely new install. Now, the app itself has a “Check for Updates” button. This button checks the github for the latest version, and if there is a newer version available it gives the user an option to download and install that. If they change their mind during the download, there is a cancel option as well. This works by first getting the github version (latest), then seeing if the current app version matches that. If it does, the app is up to date. If not, then the app can fetch the executable using the github API and automatically download the latest installer. On top of this some inno setup tools allow the app to close the app, install the new version, and reopen the app by itself. The only caveat is that this only works starting from v1.2.0. This means that if you have an older version you will have to manually download v1.2.0 in order to start getting automatic app updates.
Devlog 28: Based on feedback from my first ship, I have decided to introduce Linux support. I thought it would be easy, but it turned out to be a little harder than I thought. The first thing I had to do was rewrite some of the Path code that saves the users download directory. This is because Linux and Windows have different file systems, and I had to account for both. Then came the hard part, Packaging. For ARM, I decided to do this on my Raspberry Pi, where I downloaded the project files from git, downloaded the OS specific FFMPEG and Deno, then repackaged the app as a .tar.gz. I decided to do it this way because this is sort of simply an experimental release. For x64 I decided to use GitHub Actions, which allowed me to download the dependencies and compile without having to spin up a new Virtual Machine. I also decided to keep this as a .tar.gz. Later, once I get more feedback about the Linux versions, I am planning to release a more universal app package (.flatpak). I also had to change the update checkers, because each OS version has to check its own corresponding file. In the end this was a very unique experience and I learned a lot of things about packaging apps on Linux.
Devlog 29: This is kind of a messy devlog, so I’ll lay it out as best as I can. First, I update the UI in preparation for playlist/album support. Before it was three static text fields that could only display one song at a time. Now I replaced it with a scrollable frame, with the ability to add more sections inside the frame for more songs. This frame also has the ability to display metadata. I also introduced a status message that shows different messages and colors depending on the status. While I was doing that (and I am not done with it), I decided to stop in the middle and fix another bug. This bug (that was reported by other people as well as my testing) prevented good matches from ranked properly. This was a problem with how I compared the titles in my ranker. To fix this I added two new functions, one that normalizes the candidate title, and another that normalizes the actual Spotify song name (mainly to exclude features and get just the song name). To do this I messed around a lot with regex patterns, so I learned a lot. Now I have to go back and continue working on the new UI for playlists and albums.
Devlog 30: I FINALLY implemented playlist and album support. At first I thought it would be simple, just looping though each song in the playlist/album. Oh was I wrong. First I had to add two more methods that looped though each song, one for playlists and one for albums. There had to be two different ones because each returned metadata differently. Then I had to kind of change the format of the whole thing, because I had to store all of the songs in a list, but currently I was only returning dictionaries from all of my methods. After getting all of that sorted out I had to actually fix the GUI/downloading part. I had to update the downloading method to handle playlist/album links, then I had to properly handle all of the status message for each song (“Ready”, “Downloading”, “Failed”). Finally I had to work on fixing the bugs I had introduced and handling the edge cases. After all of that I FINALLY had playlist and album support. One thing that was sorta tough was handling the status for each track individually. Before I was just looping through the entire list and setting all of the statuses to the same thing, but I was able to create a new method and change each song status as it was being downloaded, not for every song as a whole.
Devlog 31: This devlog was mainly focused on the efficiency and speed of updating the app. Before the data would come in really small packets, meaning the cpu would have to write to the drive about 130,000 times in total (I know 😭). I adjusted this so it now comes in larger packets so the cpu doesn’t have to do more work. I also adjusted the compression and a few other Inno Setup settings (number of threads, etc.) to make the app more efficient in general. Another issue that I found is that once the app updated (specifically in Windows, idk about other platforms) the settings app would still show the older version for some time. This was an issue with the timing, so I had to adjust some of the delays to get it to work properly. Overall I think this is a pretty good update.
Devlog 32: (sorry for the late post) I have been working on a really cool feature for the app. Basically what I am trying to do is integrate the myMusic pipeline into the windows Spotify app itself. When you right click a playlist or album, there will be a menu that pops up. Usually for normal Spotify users (not on premium) there will be a greyed out download button. What I am trying to do is two things: add a download button for tracks (because there isn’t one right now), and make the playlist/album button actually work. Right now what I have accomplished is adding a new button for the track and making the playlist/album button clickable. I was able to do this by using Spicetify and its framework. Because I already have it installed on my computer I am using it to test everything out but later I will bundle it with my app. What I did was build a custom Spicetify extension (I had to learn JavaScript) that creates a new button. I was able to make the original playlist/album button work because it was only “aria-disabled”, not actually disabled. This means that it was only disabled at the UI level, but Spotify still recorded clicks. By applying some UI changes I was able to make the button look enabled and still record clicks. My next step is to actually hook this up to the Python script. I think this is a really cool feature.
Devlog 33: The app is now able to understand and automatically download any received links. Now the problem is that Spotify isn’t able to send any normal requests to via the computer. Because of this I need to find a way for Spotify to send and get data. I know that Spotify (using Spicetify) can send and get http requests. Because of that I am planning to use FastAPI and a local http server to be able to send and get data so the app can automatically download tracks. I will ensure to keep the server in a high index to ensure it doesn’t get in the way of any other local servers.
Devlog 34: I have been working on creating a queue for the requests. This ensures that the user can download multiple songs at once without having to wait for the previous ones to be finished. So far I have been able to create a request id for each request. The app can update the attributes of each request, such as its status, and error message. On top of this once a request is completed the app also automatically removes that request.
Devlog 35: The app now creates its own server on a very distant and far port so that your other local host stuff doesn’t get affected. I did this with uvicorn and threading, so that creating the port doesn’t make the app freeze. With this functionality the app can get the requests made inside Spotify and automatically download them. The next step is to get the app to report the statuses of the download jobs (queued, downloading, completed, failed, etc.). Then I would actually have to connect both parts, let Spotify send messages and the app receive the message.
Devlog 36: I am almost done with the first phase of the integration. When the download button is clicked inside of Spotify, Spicetify intercepts it and now posts a request to the open web server. Then the python script gets notified of that request, decodes it, then automatically starts downloading the song/playlist/album. The only thing is that the myMusic app has to be open while doing this, but I will remove that requirement in the future (not now). The next step would be to add status reports to Spotify so that the user knows what the status of their download is.
Devlog 37: I am very close to shipping now. I added the Spotify status/progress update messages, so now you can see when the tracks have finished downloading. I also fixed three (kinda major) bugs. First of all there was an error when searching for the songs on YouTube/YouTube Music. Basically what happened was that the title didn’t follow the same ASCII conventions that was used by YouTube. Because of this the app would reject good title matches even though they were the same. This produced quite a few errors, especially when trying to download songs with apostrophes. The second error I fixed was the some songs would automatically have the clean version downloaded. To fix this I switched to the ytmusicapi python package. This package also returned whether the song was explicit or not. Because of this I was able to check whether or not the song was intended to be that way, and if not I could prevent that match from being downloaded. I did have to edit a few functions to accept the new format, but in the end everything worked. Third I fixed a simple error that messed up the searching. This time it wasn’t really a bug, but instead an edge case that I missed. I was catching keywords like “feat.” and “featuring”, but I didn’t catch words like “From (and tv show, etc.)”. Because of this some matches were getting left out. I fixed this by adding another regex pattern that removes this as well.
Devlog 38: I worked on functions that helped install the Spicetify extension into the Spicetify configuration. I had to ensure Spicetify was installer, had to find its path, had to find its extensions path, then finally copy over the extension. I also added system tray behavior and multiple instance detection for the app, so that now when you close the app it doesn’t close but instead goes to the system tray. This allows the Spotify integration to work even if the app itself isn’t visible. The multiple instance detection ensures the app runs properly, and ensures that the app doesn’t try to use the same http port twice, resulting in errors. This did take a while but now all I have to do is create guards for Linux, so that the Spotify integration only works on Windows and doesn’t create unexpected errors on Linux.
Devlog 39: I was finally able to get the Linux guards in place, and also packaged the new builds and released them to GitHub has a new version. The guards were mostly simple, as they were just a few checks that asked what operating system the user was on. And depending on that it decided whether or not to install the Spicetify extensions.
Ships:
I made myMusic, a Windows desktop app that takes a Spotify track link, previews the song details, finds a matching audio result, downloads it, converts it to MP3, and saves it with basic metadata tags. The hardest part was turning it from a local Python project into something other people can actually run: bundling FFmpeg, building the Windows executable, creating an installer, and writing clear install/testing instructions. These were all new steps that I wasn’t familiar with before, so I had to heavily research them and get familiar with them before shipping. I am proud that I was able to get it working as a real, bundled Windows desktop app, instead of a small project that runs only on my computer. To test it, use the Try Project link, download the v1.0.1 Windows installer, install it, open myMusic, paste a Spotify track link, click Preview Song Details, then click Download. The finished MP3 should appear in your Downloads folder. Windows may show SmartScreen because the app is unsigned; the release notes explain how to continue.
I made myMusic, a Windows desktop app that takes a Spotify track link, previews the song details, finds a matching audio result, downloads it, converts it to MP3, and saves it with basic metadata tags. This is Ship #2 of my project. There have been a quite a few changes since my last ship, so let me list them all: First I added a folder-picking dialog. This allows the user to change the directory their songs are downloaded to, instead of being forced to always download to the “Downloads” directory. The app also saves the last chosen directory, so even if you close and reopen the app the directory is still saved. I then bundled Deno into the app, which helps yt-dlp solve JS challenges. Then I added the Spotify oEmbed metadata as fallback metadata if the SpotifyScraper python package fails. I also added YouTube as a partner with YouTube Music to get the best results from both platforms. I then a ranking system for the songs. The program adds and removes points from the top 6 matches from both platforms based on a few criteria, then it tries downloading from highest to least ranked. Then I also started embedding cover art. The app now takes in the cover art link, streams it, then writes it to the audio file. Next I added in-app update checking. The app can search the github repo for the latest version, checks to see if it is newer, then can automatically download and installer it. I also polished up the UI so that the controls and labels are more organized. Finally, I added Linux x64 and Linux ARM64 support. This has the same behavior as the Windows app, but the dependencies are now installed natively on that platform, which makes the app run more reliably on Linux. The current latest version at the time of this ship is v1.3.0.
I made myMusic, a Windows/Linux app that allows you to download your favorite songs. It works by searching YouTube/YouTube music for videos of your song. Then, using yt-dlp, it is able to download your song as an mp3 file. Finally it adds all of the metadata, allowing you to properly listen to your music offline. This is ship #3 of my project, so let me explain all of the changes since the last ship: First I finally added support for playlist and album downloads. Now instead of putting in each separate track individually you can combine it into a playlist and download that all together. For this I also had to update the GUI in order to fit all of the song information together. Second I improved the song searching and reliability. I made things consistent with how YouTube expects them (ASCII, Unicode characters, etc.). I also combine YouTube Music and YouTube candidates, so you get the best of both worlds. The app also tries multiple candidates before declaring that track a fail. Third I introduced explicit-version matching. Before, you would sometimes get the clean version of an explicit song. To fix this I switched to ytmusicapi, which allows me to compare matches to determine which one fits the criteria the best. The API also allows me to see whether or not the song is clean, which makes matching easier. Fourth (and probably the biggest update) I was able to add a Spicetify extension with the app. Because of this you are now able to download your favorite songs directly from the Spotify windows app. It reuses Spotify’s native download button rows, which make it easy to download your songs. It also preserves native behavior if you are already on Spotify Premium. It also shows notifications about the status of your download. This is only available on Windows. Fifth in order to make the Spotify integration work, the app now opens up a FastAPI/Uvicorn server bound to 127.0.0.1:18492. I chose a far away port in order for it not to affect any other local host processes. Sixth I also added background behavior for the app. This keeps the app open in the background without it being open on the gui (you will still be able to see it in your system tray). This allows the Spotify integration to run seamlessly without interfering with your every day work. Seventh I greatly improved the in app updater speed. Before it would greatly lag your computer because the chunk sizes were so small and it had to do a lot of writes to your disk. Now I increased the chunk size, and updated the packaging configurations to further boost the download speed and app size. These were all the main updates I did to my app, hope you like it!...
|
1793328802.905017
|
1793415202.905017
|
|
26466
|
myMicropad by @AfterWorld | Stardance
|
AfterWorld
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: myMicropad by @AfterWorld | Stardance
|
1792716711.3531506
|
1793321511.3531506
|
|
7876
|
myMacropad by @heian | Stardance
|
heian
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-11T23:09:18Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Custom Hackpad! My first time using QMK, so that was a learning curve. I’m proud of how it turned out.", "repo": "https://github.com/syntonos/myMacropad", "demo": ""}]...
|
[{"post_id": 7147, "ts": "2026 [{"post_id": 7147, "ts": "2026-06-11T22:43:34Z", "hours": 2.4367, "text": "Made a macropad! Did not expect to suffer so much. I genuinely think engineering is just a measure of how many small problems you can tolerate before you combust. This took wayy more than 2.5 hours I just did not know how to use either Lapse or Hackatime and I suffered quite a lot off camera. PCB wasn’t that bad. I still have no idea how KiCad does any sort of positioning (from where in the object is the position calculated?? why is it so different across objects?? why does align just never work???), and it’s also deeply wonky switching back and forth from KiCad to Altium for different projects. It’s really nice not having to worry about any complications (signal processing, hunting down or making 3D models, etc) with wiring for once. CAD went alright! I feel like you notice a lot of fun quality of life features that Fusion is missing when you start doing CAD for a bit. I’d love to be able to group objects or parts of a sketch and have them behave the same way. I’d love to have an easy way to find the midpoint or centers in a sketch. I’d love a way to align objects. oh well ! First time using QMK! Took a while to install and learn. I think I genuinely spent an hour scrolling through documentation. I imagine I’ll have to do some more wrangling when I flash it. Finally done! I can finally sleep."}]...
|
Title: myMacropad by @heian | Stardance
Devlogs:
Title: myMacropad by @heian | Stardance
Devlogs:
Made a macropad! Did not expect to suffer so much. I genuinely think engineering is just a measure of how many small problems you can tolerate before you combust. This took wayy more than 2.5 hours I just did not know how to use either Lapse or Hackatime and I suffered quite a lot off camera. PCB wasn’t that bad. I still have no idea how KiCad does any sort of positioning (from where in the object is the position calculated?? why is it so different across objects?? why does align just never work???), and it’s also deeply wonky switching back and forth from KiCad to Altium for different projects. It’s really nice not having to worry about any complications (signal processing, hunting down or making 3D models, etc) with wiring for once. CAD went alright! I feel like you notice a lot of fun quality of life features that Fusion is missing when you start doing CAD for a bit. I’d love to be able to group objects or parts of a sketch and have them behave the same way. I’d love to have an easy way to find the midpoint or centers in a sketch. I’d love a way to align objects. oh well ! First time using QMK! Took a while to install and learn. I think I genuinely spent an hour scrolling through documentation. I imagine I’ll have to do some more wrangling when I flash it. Finally done! I can finally sleep.
Ships:
Custom Hackpad! My first time using QMK, so that was a learning curve. I’m proud of how it turned out....
|
1792878654.6206846
|
1793742654.6206846
|