|
18351
|
Untitled by @x1c_pk | Stardance
|
x1c_pk
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @x1c_pk | Stardance
|
1793562666.9575784
|
1794167466.9575784
|
|
18352
|
My very own WebOS by @Advait_Abhijwal | Stardance
|
Advait_Abhijwal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @Advait_Abhijwal | Sta Title: My very own WebOS by @Advait_Abhijwal | Stardance...
|
1793372083.6716943
|
1793976883.6716943
|
|
18353
|
Orbit Weaver by @binu_saravana | Stardance
|
binu_saravana
|
0
|
2.05
|
0
|
[]
|
[{"post_id": 16061, "ts": "202 [{"post_id": 16061, "ts": "2026-06-26T03:07:53Z", "hours": 1.3933, "text": "Devlog #2: Changed the UI to allow more user interaction with the celestial bodies. This made the entire project much more interactive. Interactions include starting position (x, y, z), mass, and a time-step to speed up simulations. Added a tab in the top left that allows for presets of other common simulations. So far, I’ve only implemented the 3-body simulation but a simulation of our Earth-Moon-Sun and a sim of our solar system will be added soon!"}, {"post_id": 10359, "ts": "2026-06-17T01:16:09Z", "hours": 0.6525, "text": "Devlog #1: Building the Sandbox I started this project inside CodeSandbox, but ran into a roadblock: it didn’t support Hackatime for tracking my hours. I moved everything over to a local setup in VS Code to make sure my hours were logged properly. The Physics & Current State My project uses Newtonian physics to calculate gravity, mass, and acceleration in real time in order to replicate cool space orbits in 3-D. Right now, Phase 1 is complete: a sandbox that models the three-body problem. You can use the control panel to change the mass and starting X-coordinates of three stars (Yellow, Blue, and Red) to see how small tweaks completely destabilize an orbit into total chaos. What’s Next Now that the core mechanics work, I want to add particle trail effects so you can actually see the geometric paths the stars leave behind. I’m also planning to add initial velocity controls and presets for other famous stable orbits. Controls: Left Click + Drag: Rotate camera Right Click + Drag: Pan screen Scroll Wheel: Zoom in/out"}]...
|
Title: Orbit Weaver by @binu_saravana | Stardance
Title: Orbit Weaver by @binu_saravana | Stardance
Devlogs:
Devlog #1: Building the Sandbox I started this project inside CodeSandbox, but ran into a roadblock: it didn’t support Hackatime for tracking my hours. I moved everything over to a local setup in VS Code to make sure my hours were logged properly. The Physics & Current State My project uses Newtonian physics to calculate gravity, mass, and acceleration in real time in order to replicate cool space orbits in 3-D. Right now, Phase 1 is complete: a sandbox that models the three-body problem. You can use the control panel to change the mass and starting X-coordinates of three stars (Yellow, Blue, and Red) to see how small tweaks completely destabilize an orbit into total chaos. What’s Next Now that the core mechanics work, I want to add particle trail effects so you can actually see the geometric paths the stars leave behind. I’m also planning to add initial velocity controls and presets for other famous stable orbits. Controls: Left Click + Drag: Rotate camera Right Click + Drag: Pan screen Scroll Wheel: Zoom in/out
Devlog #2: Changed the UI to allow more user interaction with the celestial bodies. This made the entire project much more interactive. Interactions include starting position (x, y, z), mass, and a time-step to speed up simulations. Added a tab in the top left that allows for presets of other common simulations. So far, I’ve only implemented the 3-body simulation but a simulation of our Earth-Moon-Sun and a sim of our solar system will be added soon!...
|
1793962408.9996881
|
1794567208.9996881
|
|
18354
|
Untitled by @clayanicholson | Stardance
|
clayanicholson
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @clayanicholson | Stardance
|
1793519508.7100337
|
1794124308.7100337
|
|
18355
|
My awesome macropad! by @VarunV08 | Stardance
|
VarunV08
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @VarunV08 | Stardan Title: My awesome macropad! by @VarunV08 | Stardance...
|
1793526836.109019
|
1794131636.109019
|
|
18356
|
My first slack bot! by @Maite | Stardance
|
Maite
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Maite | Stardance
|
1793462080.3179271
|
1794066880.3179271
|
|
18357
|
Frictionless by @zhongwendy4 | Stardance
|
zhongwendy4
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @zhongwendy4 | Stardance
|
1793818115.8530252
|
1794422915.8530252
|
|
18358
|
Omega GPT by @codeyash09 | Stardance
|
codeyash09
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Omega GPT by @codeyash09 | Stardance
|
1793530211.9123907
|
1794135011.9123907
|
|
18359
|
rinoOS by @justrivaan | Stardance
|
justrivaan
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-26T07:19:07Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "the mission said build a personal website. i didn’t want to do the usual thing, a page with my name, a list of projects, some links. that’s boring and nobody actually reads it. i wanted something where you actually have to explore to find out who i am. so instead of a website about me, i made an OS that feels like mine. live like rino. you boot in, pick a wallpaper from 8 presets, then land on a full desktop with a dock, draggable and resizable windows, a top bar with a live clock, and a right click menu on the desktop. there’s a guide app that walks you through how to get around, a sticky notes app you can actually type in, and a jarvis terminal where you type commands like “hey jarvis, open projects” and it actually does it. the windows have all three buttons working, red closes, yellow minimizes the window into a tray tile next to the dock, green fullscreens it. everything is one single html file, no frameworks, no libraries, no backend. what was challenging: a lot of small things that looked easy and weren’t. getting window drag and resize to not fight each other took a while. the guide hint bubble was floating to the wrong spot because a css transform on the dock was silently breaking position fixed for anything inside it, took actual debugging to figure that one out. the boot bar looked smooth in code but felt jittery visually, ended up rewriting it with requestAnimationFrame timed against actual elapsed time instead of random setInterval increments. what i’m proud of: it actually feels like an OS. the boot sequence, the wallpaper picker before you even see the desktop, the tray for minimized windows, the way the guide hint pops up and points at the right icon. none of that was in the original mission brief, i just kept adding things because it didn’t feel done yet. to test it: wait for it to boot, pick any wallpaper, click around the dock. right click the empty desktop for shortcuts. open the terminal and try “hey jarvis, help” to see what it can do. if you want to see the projects window, click the folder icon or say “hey jarvis, open projects.”", "repo": "https://github.com/officiallyrivaan/rinoOS", "demo": "https://officiallyrivaan.github.io/rinoOS/"}]...
|
[{"post_id": 12906, "ts": "202 [{"post_id": 12906, "ts": "2026-06-21T04:09:06Z", "hours": 0.0, "text": "Last thing before this is finished. Added an actual learning guide for the OS, rather than having to figure it out by trial and error. There’s now a Guide app, with a teal icon located at the start of the dock. It launches into a window that takes you through all the basics, like opening applications, resizing and moving windows, what the three buttons for windows do, the context menu, talking to Jarvis in the terminal. When you first land on the desktop, a tooltip will pop up that shows you where the Guide icon is, and says “New here? Click Guide to get to know the OS.” Also, I added the context menu on the desktop. Just do a right-click on any empty space on your desktop and there will be quick access to such things as opening terminal, creating a sticky note, opening guides, changing wallpapers. However, you won’t see this menu when you perform the same action over an opened application, it is only visible on an empty desktop. I had to deal with some bugs that not many people are even going to notice, but which were crucial for my program. After I implemented the resizing functionality, the dragging became somewhat slow, which resulted from a css transition intended only for maximizing an application being applied to dragging and resizing as well. and there was another issue with the hint bubble being pointed to the guide icon. That one was a strange one, it turned out that a transform on the dock’s container element broke the position:fixed styling of everything within it, so the bubble was aligning itself to the center of the dock rather than the screen. Moved it outside of it and it now perfectly aligns with the icon, double checked on different screen sizes. Finally, the boot sequence needed some work too. The animation itself was smooth enough, but at the total duration of 2.6 seconds, it just felt like skipping through rather than loading 5 messages. Slowed it down to about 4 seconds and added a smooth crossfade in between each message instead of the abrupt change, and now it feels like an actual boot sequence, not just random colors. That is all I have for now for rinoOS. Boot up, choose a background, click around, talk to jarvis when bored. Live the rino life 🟣"}, {"post_id": 12450, "ts": "2026-06-20T09:50:01Z", "hours": 0.0, "text": "picking up from devlog #1. last time the three window buttons just sat there doing nothing, red worked but yellow and green were dead weight. fixed that.minimize now actually minimizes. click yellow and the window shrinks down and tucks itself into a little tray right next to the dock, like a real taskbar. click the tile and it pops back open exactly where it was.fullscreen works too. green button blows the window up to fill the whole desktop, click again and it snaps back to wherever it was sitting before. sticky notes is finally here. it’s its own app in the dock now, click the + tile and a new note shows up, type whatever, delete it with the x in the corner. they’re scattered at slight angles so it actually looks like sticky notes and not a grid.also made every window resizable from the bottom right corner, figured if you’re gonna explore my OS you should be able to make a window bigger to actually read stuff instead of squinting. ran into one annoying bug along the way: dragging windows around started feeling laggy and weird after i added resizing, turned out a css transition meant only for the maximize animation was quietly applying to every drag and resize too, so windows were animating toward your cursor instead of just following it. fixed by only turning that transition on for the maximize snap and keeping drag/resize completely instant. one more update coming next."}, {"post_id": 11220, "ts": "2026-06-18T11:24:52Z", "hours": 0.0, "text": "so the mission was basically: build a personal website, but make it actually interesting instead of the usual “hi, here’s my resume” page nobody reads. my first instinct was to do the safe thing, a simple portfolio site, projects listed top to bottom, done in an hour. but that felt like the laziest version of the mission. anyone can make a list of stuff they built.so instead i made rinoOS, (rino being my digital identity) live like rino. the idea: instead of reading about me, you boot into a whole fake OS and explore it like it’s actually mine. you start on a boot screen that fake loads stuff like “syncing f1 telemetry… brewing chai…” then you pick a wallpaper before you even see the desktop. after that you’re dropped into a real desktop with draggable windows, a dock, and a working clock, and you click around to find out who i am instead of scrolling a page.i built most of this outside the repo first, just working on the html locally and testing it as i went, then finally moved everything over once it actually worked.what’s in it so far: 8 wallpapers, pick your vibe before you boot in. windows for About, Projects, Skills, F1 Fan Zone, and Contact. a Jarvis terminal you can actually type commands into, like hey jarvis, open projects.the projects window has my real stuff: Jarvis, a voice assistant i built with whisper and ollama, a live F1 telemetry dashboard, and Time Debt, a roblox game where you’re racing the clock to collect as much as possible before time runs out. biggest issue so far: it looked perfect locally, then i pushed it to github pages and got a blank readme instead of my site. turns out pages only serves a file named exactly index.html. dumb mistake, learned it fast. next up: a sticky notes app and proper minimize to dock animations. live like rino 🟣"}]...
|
Title: rinoOS by @justrivaan | Stardance
Devlogs: Title: rinoOS by @justrivaan | Stardance
Devlogs:
so the mission was basically: build a personal website, but make it actually interesting instead of the usual “hi, here’s my resume” page nobody reads. my first instinct was to do the safe thing, a simple portfolio site, projects listed top to bottom, done in an hour. but that felt like the laziest version of the mission. anyone can make a list of stuff they built.so instead i made rinoOS, (rino being my digital identity) live like rino. the idea: instead of reading about me, you boot into a whole fake OS and explore it like it’s actually mine. you start on a boot screen that fake loads stuff like “syncing f1 telemetry… brewing chai…” then you pick a wallpaper before you even see the desktop. after that you’re dropped into a real desktop with draggable windows, a dock, and a working clock, and you click around to find out who i am instead of scrolling a page.i built most of this outside the repo first, just working on the html locally and testing it as i went, then finally moved everything over once it actually worked.what’s in it so far: 8 wallpapers, pick your vibe before you boot in. windows for About, Projects, Skills, F1 Fan Zone, and Contact. a Jarvis terminal you can actually type commands into, like hey jarvis, open projects.the projects window has my real stuff: Jarvis, a voice assistant i built with whisper and ollama, a live F1 telemetry dashboard, and Time Debt, a roblox game where you’re racing the clock to collect as much as possible before time runs out. biggest issue so far: it looked perfect locally, then i pushed it to github pages and got a blank readme instead of my site. turns out pages only serves a file named exactly index.html. dumb mistake, learned it fast. next up: a sticky notes app and proper minimize to dock animations. live like rino 🟣
picking up from devlog #1. last time the three window buttons just sat there doing nothing, red worked but yellow and green were dead weight. fixed that.minimize now actually minimizes. click yellow and the window shrinks down and tucks itself into a little tray right next to the dock, like a real taskbar. click the tile and it pops back open exactly where it was.fullscreen works too. green button blows the window up to fill the whole desktop, click again and it snaps back to wherever it was sitting before. sticky notes is finally here. it’s its own app in the dock now, click the + tile and a new note shows up, type whatever, delete it with the x in the corner. they’re scattered at slight angles so it actually looks like sticky notes and not a grid.also made every window resizable from the bottom right corner, figured if you’re gonna explore my OS you should be able to make a window bigger to actually read stuff instead of squinting. ran into one annoying bug along the way: dragging windows around started feeling laggy and weird after i added resizing, turned out a css transition meant only for the maximize animation was quietly applying to every drag and resize too, so windows were animating toward your cursor instead of just following it. fixed by only turning that transition on for the maximize snap and keeping drag/resize completely instant. one more update coming next.
Last thing before this is finished. Added an actual learning guide for the OS, rather than having to figure it out by trial and error. There’s now a Guide app, with a teal icon located at the start of the dock. It launches into a window that takes you through all the basics, like opening applications, resizing and moving windows, what the three buttons for windows do, the context menu, talking to Jarvis in the terminal. When you first land on the desktop, a tooltip will pop up that shows you where the Guide icon is, and says “New here? Click Guide to get to know the OS.” Also, I added the context menu on the desktop. Just do a right-click on any empty space on your desktop and there will be quick access to such things as opening terminal, creating a sticky note, opening guides, changing wallpapers. However, you won’t see this menu when you perform the same action over an opened application, it is only visible on an empty desktop. I had to deal with some bugs that not many people are even going to notice, but which were crucial for my program. After I implemented the resizing functionality, the dragging became somewhat slow, which resulted from a css transition intended only for maximizing an application being applied to dragging and resizing as well. and there was another issue with the hint bubble being pointed to the guide icon. That one was a strange one, it turned out that a transform on the dock’s container element broke the position:fixed styling of everything within it, so the bubble was aligning itself to the center of the dock rather than the screen. Moved it outside of it and it now perfectly aligns with the icon, double checked on different screen sizes. Finally, the boot sequence needed some work too. The animation itself was smooth enough, but at the total duration of 2.6 seconds, it just felt like skipping through rather than loading 5 messages. Slowed it down to about 4 seconds and added a smooth crossfade in between each message instead of the abrupt change, and now it feels like an actual boot sequence, not just random colors. That is all I have for now for rinoOS. Boot up, choose a background, click around, talk to jarvis when bored. Live the rino life 🟣
Ships:
the mission said build a personal website. i didn’t want to do the usual thing, a page with my name, a list of projects, some links. that’s boring and nobody actually reads it. i wanted something where you actually have to explore to find out who i am. so instead of a website about me, i made an OS that feels like mine. live like rino. you boot in, pick a wallpaper from 8 presets, then land on a full desktop with a dock, draggable and resizable windows, a top bar with a live clock, and a right click menu on the desktop. there’s a guide app that walks you through how to get around, a sticky notes app you can actually type in, and a jarvis terminal where you type commands like “hey jarvis, open projects” and it actually does it. the windows have all three buttons working, red closes, yellow minimizes the window into a tray tile next to the dock, green fullscreens it. everything is one single html file, no frameworks, no libraries, no backend. what was challenging: a lot of small things that looked easy and weren’t. getting window drag and resize to not fight each other took a while. the guide hint bubble was floating to the wrong spot because a css transform on the dock was silently breaking position fixed for anything inside it, took actual debugging to figure that one out. the boot bar looked smooth in code but felt jittery visually, ended up rewriting it with requestAnimationFrame timed against actual elapsed time instead of random setInterval increments. what i’m proud of: it actually feels like an OS. the boot sequence, the wallpaper picker before you even see the desktop, the tray for minimized windows, the way the guide hint pops up and points at the right icon. none of that was in the original mission brief, i just kept adding things because it didn’t feel done yet. to test it: wait for it to boot, pick any wallpaper, click around the dock. right click the empty desktop for shortcuts. open the terminal and try “hey jarvis, help” to see what it can do. if you want to see the projects window, click the folder icon or say “hey jarvis, open projects.”...
|
1793775540.7351322
|
1794639540.7351322
|
|
18360
|
My first slack bot! by @Eram1 | Stardance
|
Eram1
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Eram1 | Stardance
|
1793494142.9949155
|
1794098942.9949155
|
|
18361
|
My first slack bot! by @xexex | Stardance
|
xexex
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @xexex | Stardance
|
1793487093.2668898
|
1794091893.2668898
|
|
18362
|
NovaOS by @RishitEncrypt | Stardance
|
RishitEncrypt
|
2
|
15.0
|
46
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T13:37:41Z", "hours": 3.0, "multiplier": 14.33, "payout": 46, "blessing": "neutral", "text": "NovaOS started as a small experiment. I wanted to see if I could recreate the feeling of using a desktop operating system entirely inside the browser. What I expected to be a quick side project ended up becoming something much bigger over the course of a few days. The goal was never to copy Windows or macOS. I wanted NovaOS to have its own identity while still feeling familiar enough that anyone could jump in and immediately understand how to use it. The result is a browser-based desktop environment complete with its own applications, taskbar, launcher, notifications, settings system, wallpapers, and window management. Since the first version, the project has grown quite a bit. NovaOS now includes Nova AI, Nova Command, Nova Music, Notes, Calculator, Explorer, Stellar Navigation, live wallpapers, onboarding screens, desktop widgets, custom application icons, system monitoring tools, and a number of smaller quality-of-life features. Version 1.0.2 focused heavily on improving the overall experience, redesigning parts of the interface, adding new applications, and making the desktop feel more cohesive. I used Claude throughout development as a tool to help generate parts of the CSS, experiment with interface ideas, and build some larger components. Nova Command was largely built with Claude’s assistance, along with several widgets and UI systems. Everything still required a lot of manual integration, debugging, redesigning, and refinement to fit together inside the project. The hardest part was never building individual features. A calculator, notes app, or music player can be built on their own. The real challenge was getting everything to work together without breaking something else. Wallpapers needed to communicate with settings, windows needed to interact correctly with the taskbar, notifications needed to work across applications, and every new feature introduced another opportunity for bugs. A large portion of development ended up being spent connecting systems together and solving unexpected problems. What I’m most proud of isn’t any individual feature. It’s the fact that the project actually reached a point where it feels complete and usable. Starting a project is exciting. Finishing one is much harder. There were plenty of moments where fixing one issue created two new ones, but seeing everything finally come together into something that genuinely feels like a desktop environment made the effort worthwhile. If you decide to try NovaOS, the best way to experience it is to explore. Open applications, customize the desktop, launch Stellar Navigation, experiment with Nova Command, play music, change wallpapers, and see what you can find. There are still features I want to add and areas I want to improve, but this version finally feels like the vision I had when I started. For now, NovaOS v1.0.2 marks the end of the first chapter of the project.", "repo": "https://github.com/rishitencrypt/Nova-Os", "demo": "https://nova-os-encrypt.netlify.app"}, {"ship_num": 2, "ts": "2026-06-16T09:29:31Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So this is NovaOS, my browser based desktop environment. I started this about 3 days ago as a small side project, and somehow it turned into something much bigger than I anticipated. My primary goal for this project was to create a desktop environment which was reminiscent of an actual desktop operating system, and still remained completely within the browser. Here are some of the features I ended up including: desktop, taskbar, launcher, windowing system, live wallpapers, notifications, settings, music player, notes app, file explorer, calculator, Nova AI, Nova Command. Although I could have tried to rebuild Windows or macOS, my true intention was to create something original and built entirely by me and help of Claude AI. i used claude to create me some css for the project, nova command app was entirely made using Claude , and the widget . I believe the largest obstacle I faced was getting all the features to interact with each other. Actually implementing a single feature is one aspect; getting all your apps, windows, settings, wallpapers and notifications working together smoothly is where almost all of my time went. There were definitely quite a few bugs, and plenty of issues with deployment, and fixing one bug would cause two more. This was pretty much a project in problem solving. The thing that I am the most proud of is the fact that I actually finished it. It is quite easy to start something because of the excitement of a new idea, however actually taking that idea all the way through to completion is much more difficult. Getting all the different pieces to work together in harmony, and to create something which actually felt like a desktop was a tremendous joy that made all the debugging worthwhile. If you decide to try out NovaOS, the best way to do it is to simply mess around with it. Open the apps, try the Nova Command, use Nova Music, change a wallpaper and check the settings. Although there are still quite a few areas that may seem a bit rough around the edges, given that it was built relatively quickly, I think it pretty much captures what I was looking to achieve. And after three days I think that NovaOS v1.0 is officially done.", "repo": "https://github.com/rishitencrypt/Nova-Os", "demo": "https://nova-os-encrypt.netlify.app"}]...
|
[{"post_id": 10610, "ts": "202 [{"post_id": 10610, "ts": "2026-06-17T13:33:43Z", "hours": 3.2414, "text": "NovaOS v1.0.2 With this release, the goal was to make NovaOS feel like an actual desktop environment instead of just browser windows piled up. This includes a redesign of the layout of the Explorer. The addition of the Stellar Navigation simulator gives users the ability to navigate a space ship using a simple, yet engaging simulation game. Icons for use on the desktop were redesigned and unified using a consistent design approach, instead of relying on placeholder art for each application. There have been several updates under the hood to further refine various aspects of NovaOS including window behavior, desktop arrangement, and application layout."}, {"post_id": 9839, "ts": "2026-06-16T09:16:44Z", "hours": 1.1064, "text": "That’s all for now. NovaOS v1.0 is done after 3 days of developing, breaking, fixing stuff, redesigning some half of the interface, and wasting a lot of time trying to find those weird bugs. It grew from being an experiment to a full-fledged desktop environment working inside the browser, equipped with its own applications, launcher, wallpaper options, notifications, music player, artificial intelligence, settings, and many other features. I especially liked implementing Nova Command, Nova Music, and making the whole desktop feel like an actual operating system. Working on this project definitely brought many insights and overall I’m quite satisfied with the result achieved in such little time. For everyone interested to see the result yourself: 🔗 Live Demo: https://nova-os-encrypt.netlify.app/ 🔗 GitHub: https://github.com/rishitencrypt/Nova-Os Thanks for following me during this journey. Next project incoming."}, {"post_id": 9748, "ts": "2026-06-16T05:23:38Z", "hours": 0.5169, "text": "Hi!! NovaOS is becoming very close to that point where I can say that it’s “usable” and not just “project”. The development of most of the key features is completed now, which means that I can finally start working on improving existing code rather than implementing new stuff. Right now, I’m working on cleaning up the user interface, making the windows behave better, redesigning Settings app, working on the taskbar and Nova Hub. Also, now novaOS supports multiple live wallpapers and I have started adding some improvements to the stock apps to make them more functional. Now, it’s almost all about bug fixing, UI adjustments and quality of life improvements."}, {"post_id": 9426, "ts": "2026-06-15T19:46:15Z", "hours": 0.7653, "text": "hi! Been working on NovaOS, a desktop environment I’m building in React. It’s not a real operating system, but more of a futuristic desktop experience with its own apps, live wallpapers, glassmorphism UI, and custom window system. So far I’ve built a taskbar, start menu (Nova Hub), Notes, Explorer, Calculator, Nova AI, Nova Command, Settings, boot animations, and support for live video wallpapers. Lately I’ve been focusing on making everything feel more polished and less like a prototype. Still plenty to improve, but it’s finally starting to feel like an actual desktop instead of a bunch of components thrown together."}, {"post_id": 9375, "ts": "2026-06-15T18:29:22Z", "hours": 3.5267, "text": "now that looks like an os that you would expect in a spaceship"}, {"post_id": 9135, "ts": "2026-06-15T09:07:41Z", "hours": 0.6517, "text": "looking wayyy better than befour still lot of stuff to do"}, {"post_id": 9095, "ts": "2026-06-15T06:10:19Z", "hours": 3.9794, "text": "a big jump"}, {"post_id": 8562, "ts": "2026-06-14T07:11:57Z", "hours": 0.3853, "text": "basic structure almost done"}, {"post_id": 8538, "ts": "2026-06-14T06:17:01Z", "hours": 1.3136, "text": "making the basic structure of OS"}]...
|
Title: NovaOS by @RishitEncrypt | Stardance
Devlo Title: NovaOS by @RishitEncrypt | Stardance
Devlogs:
making the basic structure of OS
basic structure almost done
a big jump
looking wayyy better than befour still lot of stuff to do
now that looks like an os that you would expect in a spaceship
hi! Been working on NovaOS, a desktop environment I’m building in React. It’s not a real operating system, but more of a futuristic desktop experience with its own apps, live wallpapers, glassmorphism UI, and custom window system. So far I’ve built a taskbar, start menu (Nova Hub), Notes, Explorer, Calculator, Nova AI, Nova Command, Settings, boot animations, and support for live video wallpapers. Lately I’ve been focusing on making everything feel more polished and less like a prototype. Still plenty to improve, but it’s finally starting to feel like an actual desktop instead of a bunch of components thrown together.
Hi!! NovaOS is becoming very close to that point where I can say that it’s “usable” and not just “project”. The development of most of the key features is completed now, which means that I can finally start working on improving existing code rather than implementing new stuff. Right now, I’m working on cleaning up the user interface, making the windows behave better, redesigning Settings app, working on the taskbar and Nova Hub. Also, now novaOS supports multiple live wallpapers and I have started adding some improvements to the stock apps to make them more functional. Now, it’s almost all about bug fixing, UI adjustments and quality of life improvements.
That’s all for now. NovaOS v1.0 is done after 3 days of developing, breaking, fixing stuff, redesigning some half of the interface, and wasting a lot of time trying to find those weird bugs. It grew from being an experiment to a full-fledged desktop environment working inside the browser, equipped with its own applications, launcher, wallpaper options, notifications, music player, artificial intelligence, settings, and many other features. I especially liked implementing Nova Command, Nova Music, and making the whole desktop feel like an actual operating system. Working on this project definitely brought many insights and overall I’m quite satisfied with the result achieved in such little time. For everyone interested to see the result yourself: 🔗 Live Demo: https://nova-os-encrypt.netlify.app/ 🔗 GitHub: https://github.com/rishitencrypt/Nova-Os Thanks for following me during this journey. Next project incoming.
NovaOS v1.0.2 With this release, the goal was to make NovaOS feel like an actual desktop environment instead of just browser windows piled up. This includes a redesign of the layout of the Explorer. The addition of the Stellar Navigation simulator gives users the ability to navigate a space ship using a simple, yet engaging simulation game. Icons for use on the desktop were redesigned and unified using a consistent design approach, instead of relying on placeholder art for each application. There have been several updates under the hood to further refine various aspects of NovaOS including window behavior, desktop arrangement, and application layout.
Ships:
So this is NovaOS, my browser based desktop environment. I started this about 3 days ago as a small side project, and somehow it turned into something much bigger than I anticipated. My primary goal for this project was to create a desktop environment which was reminiscent of an actual desktop operating system, and still remained completely within the browser. Here are some of the features I ended up including: desktop, taskbar, launcher, windowing system, live wallpapers, notifications, settings, music player, notes app, file explorer, calculator, Nova AI, Nova Command. Although I could have tried to rebuild Windows or macOS, my true intention was to create something original and built entirely by me and help of Claude AI. i used claude to create me some css for the project, nova command app was entirely made using Claude , and the widget . I believe the largest obstacle I faced was getting all the features to interact with each other. Actually implementing a single feature is one aspect; getting all your apps, windows, settings, wallpapers and notifications working together smoothly is where almost all of my time went. There were definitely quite a few bugs, and plenty of issues with deployment, and fixing one bug would cause two more. This was pretty much a project in problem solving. The thing that I am the most proud of is the fact that I actually finished it. It is quite easy to start something because of the excitement of a new idea, however actually taking that idea all the way through to completion is much more difficult. Getting all the different pieces to work together in harmony, and to create something which actually felt like a desktop was a tremendous joy that made all the debugging worthwhile. If you decide to try out NovaOS, the best way to do it is to simply mess around with it. Open the apps, try the Nova Command, use Nova Music, change a wallpaper and check the settings. Although there are still quite a few areas that may seem a bit rough around the edges, given that it was built relatively quickly, I think it pretty much captures what I was looking to achieve. And after three days I think that NovaOS v1.0 is officially done.
NovaOS started as a small experiment. I wanted to see if I could recreate the feeling of using a desktop operating system entirely inside the browser. What I expected to be a quick side project ended up becoming something much bigger over the course of a few days. The goal was never to copy Windows or macOS. I wanted NovaOS to have its own identity while still feeling familiar enough that anyone could jump in and immediately understand how to use it. The result is a browser-based desktop environment complete with its own applications, taskbar, launcher, notifications, settings system, wallpapers, and window management. Since the first version, the project has grown quite a bit. NovaOS now includes Nova AI, Nova Command, Nova Music, Notes, Calculator, Explorer, Stellar Navigation, live wallpapers, onboarding screens, desktop widgets, custom application icons, system monitoring tools, and a number of smaller quality-of-life features. Version 1.0.2 focused heavily on improving the overall experience, redesigning parts of the interface, adding new applications, and making the desktop feel more cohesive. I used Claude throughout development as a tool to help generate parts of the CSS, experiment with interface ideas, and build some larger components. Nova Command was largely built with Claude’s assistance, along with several widgets and UI systems. Everything still required a lot of manual integration, debugging, redesigning, and refinement to fit together inside the project. The hardest part was never building individual features. A calculator, notes app, or music player can be built on their own. The real challenge was getting everything to work together without breaking something else. Wallpapers needed to communicate with settings, windows needed to interact correctly with the taskbar, notifications needed to work across applications, and every new feature introduced another opportunity for bugs. A large portion of development ended up being spent connecting systems together and solving unexpected problems. What I’m most proud of isn’t any individual feature. It’s the fact that the project actually reached a point where it feels complete and usable. Starting a project is exciting. Finishing one is much harder. There were plenty of moments where fixing one issue created two new ones, but seeing everything finally come together into something that genuinely feels like a desktop environment made the effort worthwhile. If you decide to try NovaOS, the best way to experience it is to explore. Open applications, customize the desktop, launch Stellar Navigation, experiment with Nova Command, play music, change wallpapers, and see what you can find. There are still features I want to add and areas I want to improve, but this version finally feels like the vision I had when I started. For now, NovaOS v1.0.2 marks the end of the first chapter of the project....
|
1793915306.5213933
|
1794001706.5213933
|
|
18363
|
Grade Calculator by @manasp | Stardance
|
manasp
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Grade Calculator by @manasp | Stardance
|
1793958446.902525
|
1794822446.902525
|
|
18364
|
Frictionless by @2693varun | Stardance
|
2693varun
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @2693varun | Stardance
|
1793292512.2210531
|
1793897312.2210531
|
|
18365
|
My very own WebOS by @_neelitt | Stardance
|
_neelitt
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @_neelitt | Stardance
|
1793552227.4997187
|
1794157027.4997187
|
|
18366
|
Untitled by @Trvst9n | Stardance
|
Trvst9n
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Trvst9n | Stardance
|
1793523113.1077995
|
1794127913.1077995
|
|
18367
|
LumoraOS by @ahnafftahmidd | Stardance
|
ahnafftahmidd
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: LumoraOS by @ahnafftahmidd | Stardance
|
1793569785.0384948
|
1794174585.0384948
|
|
18368
|
Stardance Game (in prg) by @parijaatdhruv | Starda Stardance Game (in prg) by @parijaatdhruv | Stardance...
|
parijaatdhruv
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Stardance Game (in prg) by @parijaatdhruv | Title: Stardance Game (in prg) by @parijaatdhruv | Stardance...
|
1793814585.4743204
|
1794419385.4743204
|
|
18369
|
My very own WebOS by @parijaatdhruv | Stardance
|
parijaatdhruv
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @parijaatdhruv | Stard Title: My very own WebOS by @parijaatdhruv | Stardance...
|
1793566169.2430556
|
1794170969.2430556
|
|
18370
|
My awesome macropad! by @parijaatdhruv | Stardance
|
parijaatdhruv
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @parijaatdhruv | St Title: My awesome macropad! by @parijaatdhruv | Stardance...
|
1793857836.587496
|
1794462636.587496
|
|
18371
|
Sprocket by @amronos | Stardance
|
amronos
|
0
|
57.06
|
0
|
[]
|
[{"post_id": 36899, "ts": "202 [{"post_id": 36899, "ts": "2026-07-29T08:58:17Z", "hours": 8.6294, "text": "I forgot to devlog again :(. I first worked on creating a tool for the agent to ask the user questions. This is probably the best kind of question tool ever made. The agent can run it while working, stop it any time, continue working while asking a question, stop and ask a question, etc. It automatically adds a “Let me (the agent) decide” option, which is very good if you are completely into the vibes. I then also refactored a lot of code to make it less sloppy. During this I also made it so that projects are linked to git repositories when possible instead of a particular directory. This allows one to use multiple directories with the same project / change the project’s directory and makes the user experience much better. I also added the new kimi-k3 model from Moonshot to Sprocket -> it’s a very good, cheap, open-source model."}, {"post_id": 35022, "ts": "2026-07-26T05:37:13Z", "hours": 10.365, "text": "Nooooo, I forgot to devlog on time again. I made soooooo many improvements to the app. I properly released the app on npm by adding full release workflows for dev, canary, and latest. I worked on reducing the Convex db i/o as it was increasing very quickly which would have costed me a lot of money. There were also a whole bunch of problems with agent runs randomly ending or erroring out, I fixed all of them. I made it possible for the agent runs to continue even after you close the Sprocket browser tab. I added support for Claude Opus 5 and AWS bedrock mantle. I added support for agent skills, which you can store at ~/.agents/skills , ~/.sprocket/skills , and ./.sprocket/skills , alongside having skills built-in to Sprocket. There are no built-in skills yet, but I will be adding some soon. I also added context compaction to help reduce costs and make longer-running tasks possible. I also added light mode support and made the UI look better."}, {"post_id": 31204, "ts": "2026-07-19T12:39:17Z", "hours": 3.0789, "text": "I started using Sprocket to create Sprocket and discovered a few random crashes that needed fixing. After fixing them, I started working on getting the app ready for production. I added convex-test to the CI which allows me to add tests for convex functions that actually talk with the backend database. Alongside this, I also made convex deployments automatic for preview deployments on PRs and production deployments whenever something is merged into main. I also worked on improving the system prompt of the agent to make it work better, this mostly involved dividing everything into better sections and explicitly telling it to prefer the scrape_url tool over web_search as web_search is more expensive. I also worked on adding proper usage limits and subscription tiers. The subscription tiers only exist in the backend right now since I don’t have a way to accept payments fully set up. I also created a new page in the settings which shows the amount of usage left, when it resets, etc."}, {"post_id": 30575, "ts": "2026-07-18T08:35:15Z", "hours": 34.99, "text": "Ok, so apparently, I worked for 33h and 43m and completely forgot to devlog. I was sooo deep into making the project that I completely forgot about Stardance. I created around 30 PRs/commits with wayyyyy too much work done in them. I started this project before Stardance (during Flavortown) but never shipped it as it was barely complete. Before my current work, the project was just a vibe-coded experiment to see if it would even be possible for me to create my own coding/robotics AI agent that could actually beat what the frontier labs are making. The real work started with these 30 commits, I basically rewrote the entire app. The current features include a full AI coding agent which can run shell commands, edit files, surf the web, and fetch web pages as markdown. The app allows one to use the SOTA AI models from OpenAI, Anthropic, and xAI, switch between different reasoning and service tier modes, send images to the agent, run multiple agents/threads in parallel across multiple projects, and archive threads. The work featured solving various edge cases and bugs, and doing a ton of testing. Even after all this, for me personally, this project is only 1% done. There is so much more work that I want to do on this and improve it with. Here’s to more consistent devlogs! lol."}]...
|
Title: Sprocket by @amronos | Stardance
Devlogs:
Title: Sprocket by @amronos | Stardance
Devlogs:
Ok, so apparently, I worked for 33h and 43m and completely forgot to devlog. I was sooo deep into making the project that I completely forgot about Stardance. I created around 30 PRs/commits with wayyyyy too much work done in them. I started this project before Stardance (during Flavortown) but never shipped it as it was barely complete. Before my current work, the project was just a vibe-coded experiment to see if it would even be possible for me to create my own coding/robotics AI agent that could actually beat what the frontier labs are making. The real work started with these 30 commits, I basically rewrote the entire app. The current features include a full AI coding agent which can run shell commands, edit files, surf the web, and fetch web pages as markdown. The app allows one to use the SOTA AI models from OpenAI, Anthropic, and xAI, switch between different reasoning and service tier modes, send images to the agent, run multiple agents/threads in parallel across multiple projects, and archive threads. The work featured solving various edge cases and bugs, and doing a ton of testing. Even after all this, for me personally, this project is only 1% done. There is so much more work that I want to do on this and improve it with. Here’s to more consistent devlogs! lol.
I started using Sprocket to create Sprocket and discovered a few random crashes that needed fixing. After fixing them, I started working on getting the app ready for production. I added convex-test to the CI which allows me to add tests for convex functions that actually talk with the backend database. Alongside this, I also made convex deployments automatic for preview deployments on PRs and production deployments whenever something is merged into main. I also worked on improving the system prompt of the agent to make it work better, this mostly involved dividing everything into better sections and explicitly telling it to prefer the scrape_url tool over web_search as web_search is more expensive. I also worked on adding proper usage limits and subscription tiers. The subscription tiers only exist in the backend right now since I don’t have a way to accept payments fully set up. I also created a new page in the settings which shows the amount of usage left, when it resets, etc.
Nooooo, I forgot to devlog on time again. I made soooooo many improvements to the app. I properly released the app on npm by adding full release workflows for dev, canary, and latest. I worked on reducing the Convex db i/o as it was increasing very quickly which would have costed me a lot of money. There were also a whole bunch of problems with agent runs randomly ending or erroring out, I fixed all of them. I made it possible for the agent runs to continue even after you close the Sprocket browser tab. I added support for Claude Opus 5 and AWS bedrock mantle. I added support for agent skills, which you can store at ~/.agents/skills , ~/.sprocket/skills , and ./.sprocket/skills , alongside having skills built-in to Sprocket. There are no built-in skills yet, but I will be adding some soon. I also added context compaction to help reduce costs and make longer-running tasks possible. I also added light mode support and made the UI look better.
I forgot to devlog again :(. I first worked on creating a tool for the agent to ask the user questions. This is probably the best kind of question tool ever made. The agent can run it while working, stop it any time, continue working while asking a question, stop and ask a question, etc. It automatically adds a “Let me (the agent) decide” option, which is very good if you are completely into the vibes. I then also refactored a lot of code to make it less sloppy. During this I also made it so that projects are linked to git repositories when possible instead of a particular directory. This allows one to use multiple directories with the same project / change the project’s directory and makes the user experience much better. I also added the new kimi-k3 model from Moonshot to Sprocket -> it’s a very good, cheap, open-source model....
|
1793544809.2407832
|
1794149609.2407832
|
|
18372
|
My very own WebOS by @sahil_verma | Stardance
|
sahil_verma
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @sahil_verma | Stardan Title: My very own WebOS by @sahil_verma | Stardance...
|
1793530181.8565326
|
1794134981.8565326
|
|
18373
|
a custom flight computer by @nethupa | Stardance
|
nethupa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: a custom flight computer by @nethupa | Star Title: a custom flight computer by @nethupa | Stardance...
|
1793987248.28205
|
1794592048.28205
|
|
18374
|
Frictionless by @maceo_sweeney | Stardance
|
maceo_sweeney
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @maceo_sweeney | Stardance
|
1793447521.5604491
|
1794052321.5604491
|
|
18375
|
My awesome macropad! by @seyun-bae | Stardance
|
seyun-bae
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @seyun-bae | Starda Title: My awesome macropad! by @seyun-bae | Stardance...
|
1793443785.2094665
|
1794048585.2094665
|
|
18376
|
Untitled project by @ayush_vyk | Stardance
|
ayush_vyk
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @ayush_vyk | Stardance
|
1793933660.7009628
|
1794538460.7009628
|
|
18377
|
My first slack bot! by @danishz | Stardance
|
danishz
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @danishz | Stardance
|
1793879287.9595082
|
1794484087.9595082
|
|
18378
|
FlameForge by @johnandbenmcneill | Stardance
|
johnandbenmcneill
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: FlameForge by @johnandbenmcneill | Stardanc Title: FlameForge by @johnandbenmcneill | Stardance...
|
1793378855.4873044
|
1793983655.4873044
|
|
18379
|
My very own WebOS by @SourishWani | Stardance
|
SourishWani
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @SourishWani | Stardan Title: My very own WebOS by @SourishWani | Stardance...
|
1793846970.7947292
|
1794451770.7947292
|
|
18380
|
My very own WebOS by @shresthamitramustaphy | Star My very own WebOS by @shresthamitramustaphy | Stardance...
|
shresthamitramustaphy
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @shresthamitramustaphy Title: My very own WebOS by @shresthamitramustaphy | Stardance...
|
1793462217.3905394
|
1794067017.3905394
|
|
18381
|
My first slack bot! by @aditya_dhawan25 | Stardanc My first slack bot! by @aditya_dhawan25 | Stardance...
|
aditya_dhawan25
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @aditya_dhawan25 | S Title: My first slack bot! by @aditya_dhawan25 | Stardance...
|
1793328884.1402166
|
1793933684.1402166
|
|
18382
|
My very own WebOS by @polianaaqif | Stardance
|
polianaaqif
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @polianaaqif | Stardan Title: My very own WebOS by @polianaaqif | Stardance...
|
1793530398.4483573
|
1794135198.4483573
|
|
18383
|
Untitled by @ghastly | Stardance
|
ghastly
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @ghastly | Stardance
|
1793411584.6594157
|
1794016384.6594157
|
|
18384
|
My very own WebOS by @bookwormishita | Stardance
|
bookwormishita
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @bookwormishita | Star Title: My very own WebOS by @bookwormishita | Stardance...
|
1793397025.5802834
|
1794001825.5802834
|
|
18385
|
Untitled by @maceo_sweeney | Stardance
|
maceo_sweeney
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @maceo_sweeney | Stardance
|
1793818110.5697904
|
1794422910.5697904
|
|
18386
|
Real Time Space By A Phone by @SourishWani | Stard Real Time Space By A Phone by @SourishWani | Stardance...
|
SourishWani
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Real Time Space By A Phone by @SourishWani Title: Real Time Space By A Phone by @SourishWani | Stardance...
|
1793454616.9316766
|
1794059416.9316766
|
|
18387
|
Colab SDK by @shash | Stardance
|
shash
|
0
|
52.47
|
0
|
[]
|
[{"post_id": 24871, "ts": "202 [{"post_id": 24871, "ts": "2026-07-08T18:39:55Z", "hours": 1.2467, "text": "eesasas"}, {"post_id": 24169, "ts": "2026-07-07T15:49:48Z", "hours": 16.0564, "text": "devlog"}, {"post_id": 22438, "ts": "2026-07-04T22:10:44Z", "hours": 3.7983, "text": "devlog"}, {"post_id": 22071, "ts": "2026-07-04T10:01:31Z", "hours": 5.8742, "text": "devlog"}, {"post_id": 21510, "ts": "2026-07-03T14:33:59Z", "hours": 8.3436, "text": "devog"}, {"post_id": 21325, "ts": "2026-07-03T06:12:31Z", "hours": 5.33, "text": "devog"}, {"post_id": 9205, "ts": "2026-06-15T13:38:28Z", "hours": 11.8194, "text": "I’m not really accustomed to how devlogs work so I did not know that I was supposed to make devlogs at regular intervals. I have completed the project and now I will just narrate my entire journey in a very long single devlog. Basically this project helps me bypass the 5-hour Plot session limit. The way it works is that I have multiple accounts (more than 3) and all of them are on the free tier. Many times it’s urgent and I am using Plot but then the session has run out. The best thing I can literally do is switch the account but I’ll have to manually copy page-relevant information and then go to the next account, paste it, and make sure that the new Plot is caught up with everything I’m discussing. I thought about what if I could make a Chrome extension that basically tracks my users and shows me right there what is my users’ percentage so I’ll know when to stop the conversation and if I want to have a long conversation. There’s just a migrate account button where I can just click it. It’s automatically going to stop. It will switch accounts for me and it is going to use Haiku to take all the message contexts, summarize it, and inject it into Plot’s context so I can just resume literally resume with it. I basically decided to make this extension so: I simply added a user tracker which tells me users for my account. I added a switch user option where I could add multiple accounts and it just natively adds a switch account button in the settings so I can switch between all my accounts. There is an export and import option where I just get a full transcript of the entire chat, all the turns between me and Plot, and a markdown file. Lastly the most important thing is the migrate button which basically takes the current chat, exports it, and then imports it into the new account, summarizes everything so Plot can fit that context in its context window and just resume like nothing happened. It works exceptionally well. I can switch between accounts for hours and literally just have to wait for 30 seconds for it to switch every single time. I’m really proud of this project. This project has been uploaded to the Chrome web store, which means that literally anybody can go download it right now and it’s available for free for everybody. It does not send any data; it’s 100% local. The entire source code is on GitHub so you can go, take inspiration, and you can change it however you want. I hope you like my project. https://chromewebstore.google.com/detail/claude-session-migrator-a/alpcgnokbgenkmcahimcojhgabcldfko"}]...
|
Title: Colab SDK by @shash | Stardance
Devlogs:
I Title: Colab SDK by @shash | Stardance
Devlogs:
I’m not really accustomed to how devlogs work so I did not know that I was supposed to make devlogs at regular intervals. I have completed the project and now I will just narrate my entire journey in a very long single devlog. Basically this project helps me bypass the 5-hour Plot session limit. The way it works is that I have multiple accounts (more than 3) and all of them are on the free tier. Many times it’s urgent and I am using Plot but then the session has run out. The best thing I can literally do is switch the account but I’ll have to manually copy page-relevant information and then go to the next account, paste it, and make sure that the new Plot is caught up with everything I’m discussing. I thought about what if I could make a Chrome extension that basically tracks my users and shows me right there what is my users’ percentage so I’ll know when to stop the conversation and if I want to have a long conversation. There’s just a migrate account button where I can just click it. It’s automatically going to stop. It will switch accounts for me and it is going to use Haiku to take all the message contexts, summarize it, and inject it into Plot’s context so I can just resume literally resume with it. I basically decided to make this extension so: I simply added a user tracker which tells me users for my account. I added a switch user option where I could add multiple accounts and it just natively adds a switch account button in the settings so I can switch between all my accounts. There is an export and import option where I just get a full transcript of the entire chat, all the turns between me and Plot, and a markdown file. Lastly the most important thing is the migrate button which basically takes the current chat, exports it, and then imports it into the new account, summarizes everything so Plot can fit that context in its context window and just resume like nothing happened. It works exceptionally well. I can switch between accounts for hours and literally just have to wait for 30 seconds for it to switch every single time. I’m really proud of this project. This project has been uploaded to the Chrome web store, which means that literally anybody can go download it right now and it’s available for free for everybody. It does not send any data; it’s 100% local. The entire source code is on GitHub so you can go, take inspiration, and you can change it however you want. I hope you like my project. https://chromewebstore.google.com/detail/claude-session-migrator-a/alpcgnokbgenkmcahimcojhgabcldfko
devog
devog
devlog
devlog
devlog
eesasas...
|
1793562976.1041865
|
1794167776.1041865
|
|
18388
|
k by @peguindeva26 | Stardance
|
peguindeva26
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: k by @peguindeva26 | Stardance
|
1793425919.3344443
|
1794030719.3344443
|
|
18389
|
Terminator-Dogs-5 by @sudhanshu_Nigam | Stardance
|
sudhanshu_Nigam
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Terminator-Dogs-5 by @sudhanshu_Nigam | Sta Title: Terminator-Dogs-5 by @sudhanshu_Nigam | Stardance...
|
1793879309.9058714
|
1794484109.9058714
|
|
18390
|
ISS-Tracker by @maceo_sweeney | Stardance
|
maceo_sweeney
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: ISS-Tracker by @maceo_sweeney | Stardance
|
1793562959.2515252
|
1794167759.2515252
|
|
18391
|
Gesture Control Photo Taker by @lcna013 | Stardanc Gesture Control Photo Taker by @lcna013 | Stardance...
|
lcna013
|
1
|
29.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-28T01:13:54Z", "hours": 29.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This project is a gesture control system. It has so many applications, but in particular it was created for a bookstore. I used TKinter to create this GUI, and MEDIAPIPE API for the gesture recognition, as well as Open CV for accessing the camera. This was such an amazing project to work on, and I feel like my knowledge had really expanded after this project!!!!", "repo": "https://github.com/lcna013-hue/SAT_Project", "demo": "https://github.com/lcna013-hue/SAT_Project/blob/main/README.md"}]...
|
[{"post_id": 83477, "ts": "202 [{"post_id": 83477, "ts": "2026-10-28T01:10:37Z", "hours": 6.6742, "text": "EVERYTHING IS COMPLETE!! I changed a lot of the code structure to ensure it is easy to read (for other coders) but also easy to debug. I did this by making a LOT of classes and using OOP to make it all very neat. I am SO VERY HAPPY and PROUD with how this project turned out and have learn such an extraordinary amount from it."}, {"post_id": 33897, "ts": "2026-07-24T05:33:55Z", "hours": 16.6561, "text": "Gestures are able to control the screens!! When the certain gesture is shows the screen changes to the next one."}, {"post_id": 19778, "ts": "2026-07-01T05:07:46Z", "hours": 2.085, "text": "DevLog_4 I have created the GUI for the next screen two screens, as well as trying to fix the camera. The image bellow is of the final screen that shows the saved book and how many of the book have been added to the database, as well as the option to add another book."}, {"post_id": 8614, "ts": "2026-06-14T09:55:12Z", "hours": 0.7733, "text": "DevLog_3 The camera has successfully been integrated into the GUI!! Colours and border boxes have also been added."}, {"post_id": 8573, "ts": "2026-06-14T07:51:42Z", "hours": 0.5969, "text": "DevLog_2 All elements are in position for HOME page"}, {"post_id": 8534, "ts": "2026-06-14T06:07:26Z", "hours": 2.5761, "text": "DevLog_1 Using Tkinter to make a GUI (graphical user interface) for the screen UI. The one I’m currently working on is the home page. It’s the instructions telling the user what to do. Still need to fix the layout."}]...
|
Title: Gesture Control Photo Taker by @lcna013 | S Title: Gesture Control Photo Taker by @lcna013 | Stardance
Devlogs:
DevLog_1 Using Tkinter to make a GUI (graphical user interface) for the screen UI. The one I’m currently working on is the home page. It’s the instructions telling the user what to do. Still need to fix the layout.
DevLog_2 All elements are in position for HOME page
DevLog_3 The camera has successfully been integrated into the GUI!! Colours and border boxes have also been added.
DevLog_4 I have created the GUI for the next screen two screens, as well as trying to fix the camera. The image bellow is of the final screen that shows the saved book and how many of the book have been added to the database, as well as the option to add another book.
Gestures are able to control the screens!! When the certain gesture is shows the screen changes to the next one.
EVERYTHING IS COMPLETE!! I changed a lot of the code structure to ensure it is easy to read (for other coders) but also easy to debug. I did this by making a LOT of classes and using OOP to make it all very neat. I am SO VERY HAPPY and PROUD with how this project turned out and have learn such an extraordinary amount from it.
Ships:
This project is a gesture control system. It has so many applications, but in particular it was created for a bookstore. I used TKinter to create this GUI, and MEDIAPIPE API for the gesture recognition, as well as Open CV for accessing the camera. This was such an amazing project to work on, and I feel like my knowledge had really expanded after this project!!!!...
|
1793850483.7925708
|
1793936883.7925708
|
|
18392
|
My very own WebOS by @tejas_ch | Stardance
|
tejas_ch
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @tejas_ch | Stardance
|
1793879361.0655868
|
1794484161.0655868
|
|
18393
|
IonoForecast: An ML-Ready Ionospheric Disturbance IonoForecast: An ML-Ready Ionospheric Disturbance Dataset and Short-Term Forecasting System by @Wafi | Stardance...
|
Wafi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: IonoForecast: An ML-Ready Ionospheric Distu Title: IonoForecast: An ML-Ready Ionospheric Disturbance Dataset and Short-Term Forecasting System by @Wafi | Stardance...
|
1793558962.756604
|
1794163762.756604
|
|
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!...
|
1793789477.6756747
|
1793875877.6756747
|
|
18395
|
Untitled project by @Aar | Stardance
|
Aar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Aar | Stardance
|
1793422344.7644818
|
1794027144.7644818
|
|
18396
|
My very own WebOS by @cjaj_10 | Stardance
|
cjaj_10
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @cjaj_10 | Stardance
|
1793299843.2907872
|
1793904643.2907872
|
|
18397
|
My first slack bot! by @thamidueshan200 | Stardanc My first slack bot! by @thamidueshan200 | Stardance...
|
thamidueshan200
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @thamidueshan200 | S Title: My first slack bot! by @thamidueshan200 | Stardance...
|
1793901367.3945398
|
1794506167.3945398
|
|
18398
|
My awesome macropad! by @SANAJAIN | Stardance
|
SANAJAIN
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @SANAJAIN | Stardan Title: My awesome macropad! by @SANAJAIN | Stardance...
|
1793361042.599509
|
1793965842.599509
|
|
18399
|
My first slack bot! by @JosephDola | Stardance
|
JosephDola
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @JosephDola | Starda Title: My first slack bot! by @JosephDola | Stardance...
|
1793814793.880564
|
1794419593.880564
|
|
18400
|
The HackroPad by @aashvik | Stardance
|
aashvik
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T08:25:55Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I loved creating my first macropad! The hardest part was getting the 3D model to actually show up on the website because of file paths, GitHub Pages setup, and weird JavaScript/module errors, but I mainly built it to make coding faster and to learn how a full hardware project comes together end to end. I made it because i wanted to create an efficient way to type code faster to speed up production of code!", "repo": "https://github.com/koditra/hackropad", "demo": ""}]...
|
[{"post_id": 8568, "ts": "2026 [{"post_id": 8568, "ts": "2026-06-14T07:40:39Z", "hours": 3.4578, "text": "I wanted to make a macropod and thought that it might be a rlly cool idea if i can use it to speed up coding by adding pre build code that is frequently used by hack clubbers. I started with the KMK firmware and wrote the keymap for the Seeeduino XIAO. I set up three inputs on D10, D9, and D8, then assigned macros to each key: an if/else block, a for loop, and a debug print statement. The macros are designed to insert the full snippet and move the cursor into the correct position inside the code. After firmware, I moved to the PCB design in KiCad. I created a simple schematic (following the tutorial) using the XIAO and three push buttons, then routed the connections directly to the GPIO pins used in the firmware. Finally, I designed a basic 3D case with a top and bottom shell. The case was modeled around the PCB footprint, with cutouts for the switches and USB port, and basic tolerances for fit. It was annoying that the plate generator wouldn’t generate the correct size that would fit with the rest of my build, so I resized it and broke it into and extra piece for simplicity. At the end, I organized everything into the required repository structure, including firmware, PCB files, and CAD exports. I’m rlly proud of this project, and hope that I can use it to create other projects too! :)"}]...
|
Title: The HackroPad by @aashvik | Stardance
Devl Title: The HackroPad by @aashvik | Stardance
Devlogs:
I wanted to make a macropod and thought that it might be a rlly cool idea if i can use it to speed up coding by adding pre build code that is frequently used by hack clubbers. I started with the KMK firmware and wrote the keymap for the Seeeduino XIAO. I set up three inputs on D10, D9, and D8, then assigned macros to each key: an if/else block, a for loop, and a debug print statement. The macros are designed to insert the full snippet and move the cursor into the correct position inside the code. After firmware, I moved to the PCB design in KiCad. I created a simple schematic (following the tutorial) using the XIAO and three push buttons, then routed the connections directly to the GPIO pins used in the firmware. Finally, I designed a basic 3D case with a top and bottom shell. The case was modeled around the PCB footprint, with cutouts for the switches and USB port, and basic tolerances for fit. It was annoying that the plate generator wouldn’t generate the correct size that would fit with the rest of my build, so I resized it and broke it into and extra piece for simplicity. At the end, I organized everything into the required repository structure, including firmware, PCB files, and CAD exports. I’m rlly proud of this project, and hope that I can use it to create other projects too! :)
Ships:
I loved creating my first macropad! The hardest part was getting the 3D model to actually show up on the website because of file paths, GitHub Pages setup, and weird JavaScript/module errors, but I mainly built it to make coding faster and to learn how a full hardware project comes together end to end. I made it because i wanted to create an efficient way to type code faster to speed up production of code!...
|
1793911879.6554615
|
1793998279.6554615
|