|
13601
|
My awesome macropad! by @nishi_p | Stardance
|
nishi_p
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @nishi_p | Stardanc Title: My awesome macropad! by @nishi_p | Stardance...
|
1793541300.0395224
|
1794146100.0395224
|
|
13602
|
My awesome macropad! by @saisam | Stardance
|
saisam
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @saisam | Stardance
|
1793440306.117638
|
1794045106.117638
|
|
13603
|
vibe.fm by @IMP3RIAL4TW | Stardance
|
IMP3RIAL4TW
|
1
|
6.0
|
27
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T22:46:26Z", "hours": 6.0, "multiplier": 4.97, "payout": 27, "blessing": "neutral", "text": "vibe.fm is an ai music curator that generates a youtube playlist based on what you’re currently doing. the hard part was getting the ai to stop recommending 1 hour mixtape compilations and actually pick real songs lol. proudest moment was when i typed “melancholic” and it pulled frank ocean, james blake and billie eilish without me telling it to. to test it just describe what you’re doing or how you’re feeling, the more specific the better, “studying for exams at midnight” hits different than just “study music” And also the ai api I’m using is quite outdated a you’ll see it in the devlogs…..So enjoy the nostalgia Thanks. Xoxo, IMP3RIAL", "repo": "https://github.com/SznImperial/vibe.fm", "demo": "https://fmvibe.netlify.app/"}]...
|
[{"post_id": 8786, "ts": "2026 [{"post_id": 8786, "ts": "2026-06-14T16:24:37Z", "hours": 2.1881, "text": "Been sick for two days, but now I’m back stronger I tried styling it to the best of my ability and the picture attached is the end product. All working perfectly, product is ready to be shipped butttt I have one concern the AI is delivering but it’s not updated in the sense that the Ai model I’m using is a 2024 model so it doesn’t drop music later than december 2024 so I’m considering a model change to Gemini 3.5 Flash or 2.5 but I’m also considering the cost but whatever it is I’ll keep y’all posted. Thanks Xoxo, IMP3RIAL."}, {"post_id": 7167, "ts": "2026-06-11T23:35:12Z", "hours": 1.1494, "text": "Vibe.fm getting better, I initially planned to use spotify’s API but then realized that it won’t be effective because it would require the user to have a spotify account which isn’t ease for the user, instead I tweaked the prompt that goes to the groq api to get better pulls now it returns only artist’s music and not mixtapes and best of, also extended the playlist catalog to return 20 songs to get the user engaged and lastly I added auto play which makes the music continue without the users having to tap the next music themselves UI updates next and a little bit tweaking till ship Thanks, Xoxo IMP3RIAL"}, {"post_id": 7047, "ts": "2026-06-11T20:16:21Z", "hours": 1.7336, "text": "Acheived a working prototype The groq api can now successfully analyse the vibe and draw data from Youtube through the Youtube API I have commited the lastest update which can now be viewed on the github repo attached to the project . Next I want to test a Spotify API to draw actual artist music because the youtube is returning mostly mixtapes which I initially expected So expect these in the next Devlog and also expect a better UI as this UI is just to acheive a working prototype Thanks, Xoxo IMP3RIAL"}, {"post_id": 6557, "ts": "2026-06-11T00:36:16Z", "hours": 0.8789, "text": "api routes done, groq analyzing context and pulling youtube results in one shot. frontend tomorrow 🎵"}]...
|
Title: vibe.fm by @IMP3RIAL4TW | Stardance
Devlog Title: vibe.fm by @IMP3RIAL4TW | Stardance
Devlogs:
api routes done, groq analyzing context and pulling youtube results in one shot. frontend tomorrow 🎵
Acheived a working prototype The groq api can now successfully analyse the vibe and draw data from Youtube through the Youtube API I have commited the lastest update which can now be viewed on the github repo attached to the project . Next I want to test a Spotify API to draw actual artist music because the youtube is returning mostly mixtapes which I initially expected So expect these in the next Devlog and also expect a better UI as this UI is just to acheive a working prototype Thanks, Xoxo IMP3RIAL
Vibe.fm getting better, I initially planned to use spotify’s API but then realized that it won’t be effective because it would require the user to have a spotify account which isn’t ease for the user, instead I tweaked the prompt that goes to the groq api to get better pulls now it returns only artist’s music and not mixtapes and best of, also extended the playlist catalog to return 20 songs to get the user engaged and lastly I added auto play which makes the music continue without the users having to tap the next music themselves UI updates next and a little bit tweaking till ship Thanks, Xoxo IMP3RIAL
Been sick for two days, but now I’m back stronger I tried styling it to the best of my ability and the picture attached is the end product. All working perfectly, product is ready to be shipped butttt I have one concern the AI is delivering but it’s not updated in the sense that the Ai model I’m using is a 2024 model so it doesn’t drop music later than december 2024 so I’m considering a model change to Gemini 3.5 Flash or 2.5 but I’m also considering the cost but whatever it is I’ll keep y’all posted. Thanks Xoxo, IMP3RIAL.
Ships:
vibe.fm is an ai music curator that generates a youtube playlist based on what you’re currently doing. the hard part was getting the ai to stop recommending 1 hour mixtape compilations and actually pick real songs lol. proudest moment was when i typed “melancholic” and it pulled frank ocean, james blake and billie eilish without me telling it to. to test it just describe what you’re doing or how you’re feeling, the more specific the better, “studying for exams at midnight” hits different than just “study music” And also the ai api I’m using is quite outdated a you’ll see it in the devlogs…..So enjoy the nostalgia Thanks. Xoxo, IMP3RIAL...
|
1793472881.2078583
|
1793559281.2078583
|
|
13604
|
My awesome slack bot! by @alexmtesla325 | Stardanc My awesome slack bot! by @alexmtesla325 | Stardance...
|
alexmtesla325
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome slack bot! by @alexmtesla325 | S Title: My awesome slack bot! by @alexmtesla325 | Stardance...
|
1793404054.4510703
|
1794008854.4510703
|
|
13605
|
My first slack bot! by @Ahyoung | Stardance
|
Ahyoung
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Ahyoung | Stardance
|
1793512542.1488492
|
1794117342.1488492
|
|
13606
|
"yo does this got stick drift??" by @Enter "yo does this got stick drift??" by @Enterro | Stardance...
|
Enterro
|
0
|
2.53
|
0
|
[]
|
[{"post_id": 5965, "ts": "2026 [{"post_id": 5965, "ts": "2026-06-09T23:57:18Z", "hours": 1.8764, "text": "passed the two hour mark and things have not really changed much, i’d say expect a fully working bare-bones app at the 3 or 4 hour mark, depending on what i plan to add and the code needed. as said in my README, i plan to give this website a lot of features once i pass the bare-bones mark, such as a vibration check, gyroscope tracking, haptics checking, and potential color changes for when a DualSense controller is connected. rather than me planning this to be a Hack Club project, i’d like to see this app try to take off a little further, maybe becoming a general controller testing/configuration program. but for now, i’ll focus on actually getting this done."}, {"post_id": 5430, "ts": "2026-06-09T06:20:22Z", "hours": 0.6497, "text": "after submitting some projects onto macondo, i decided to give stardance a try since it seemed popular im building a small website OR application (currently pending what I wanna do) that is just a general controller checker. checks your triggs, sticks, and flicks, whole bundle! kinda new to this but im kinda just going with the wind lol currently a lot of back and forthing between deciding to name some of my code gamepad and controller since i want my code to look nice and having ‘controller’ spammed everywhere makes it look odd i can expect a test to be working by around the 1-2 hour mark depending on how i do this"}]...
|
Title: "yo does this got stick drift??" by Title: "yo does this got stick drift??" by @Enterro | Stardance
Devlogs:
after submitting some projects onto macondo, i decided to give stardance a try since it seemed popular im building a small website OR application (currently pending what I wanna do) that is just a general controller checker. checks your triggs, sticks, and flicks, whole bundle! kinda new to this but im kinda just going with the wind lol currently a lot of back and forthing between deciding to name some of my code gamepad and controller since i want my code to look nice and having ‘controller’ spammed everywhere makes it look odd i can expect a test to be working by around the 1-2 hour mark depending on how i do this
passed the two hour mark and things have not really changed much, i’d say expect a fully working bare-bones app at the 3 or 4 hour mark, depending on what i plan to add and the code needed. as said in my README, i plan to give this website a lot of features once i pass the bare-bones mark, such as a vibration check, gyroscope tracking, haptics checking, and potential color changes for when a DualSense controller is connected. rather than me planning this to be a Hack Club project, i’d like to see this app try to take off a little further, maybe becoming a general controller testing/configuration program. but for now, i’ll focus on actually getting this done....
|
1793526614.0638435
|
1794131414.0638435
|
|
13607
|
Untitled project by @KyleTrent11 | Stardance
|
KyleTrent11
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @KyleTrent11 | Stardanc Title: Untitled project by @KyleTrent11 | Stardance...
|
1793433200.139462
|
1794038000.139462
|
|
13608
|
Search and Rescue Drone by @Shreeg | Stardance
|
Shreeg
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Search and Rescue Drone by @Shreeg | Starda Title: Search and Rescue Drone by @Shreeg | Stardance...
|
1793148842.130686
|
1793753642.130686
|
|
13609
|
My very own WebOS by @ILoveBeingForcedToDoThings | My very own WebOS by @ILoveBeingForcedToDoThings | Stardance...
|
ILoveBeingForcedToDoThings
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @ILoveBeingForcedToDoT Title: My very own WebOS by @ILoveBeingForcedToDoThings | Stardance...
|
1793192062.1838696
|
1793796862.1838696
|
|
13610
|
super duper website by @wizard | Stardance
|
wizard
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: super duper website by @wizard | Stardance
|
1793458572.0459006
|
1794063372.0459006
|
|
13611
|
THE MediaPad by @Berat | Stardance
|
Berat
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: THE MediaPad by @Berat | Stardance
|
1793318159.790719
|
1793922959.790719
|
|
13612
|
My very own WebOS by @Joey | Stardance
|
Joey
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @Joey | Stardance
|
1793339826.3013027
|
1793944626.3013027
|
|
13613
|
Untitled by @KyleTrent11 | Stardance
|
KyleTrent11
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @KyleTrent11 | Stardance
|
1793134170.8985507
|
1793738970.8985507
|
|
13614
|
StopWatch by @B754a | Stardance
|
B754a
|
0
|
1.95
|
0
|
[]
|
[{"post_id": 5943, "ts": "2026 [{"post_id": 5943, "ts": "2026-06-09T22:55:27Z", "hours": 1.95, "text": "A Stopwatch that work’s"}]...
|
Title: StopWatch by @B754a | Stardance
Devlogs:
A Title: StopWatch by @B754a | Stardance
Devlogs:
A Stopwatch that work’s...
|
1793274644.6225996
|
1793879444.6225996
|
|
13615
|
My very own WebOS by @KyleTrent11 | Stardance
|
KyleTrent11
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @KyleTrent11 | Stardan Title: My very own WebOS by @KyleTrent11 | Stardance...
|
1793303305.9209378
|
1793908105.9209378
|
|
13616
|
My very own WebOS by @mrthomasingham | Stardance
|
mrthomasingham
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @mrthomasingham | Star Title: My very own WebOS by @mrthomasingham | Stardance...
|
1793454614.152154
|
1794059414.152154
|
|
13617
|
RiceguardAI by @joel_l_laggui_4624 | Stardance
|
joel_l_laggui_4624
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: RiceguardAI by @joel_l_laggui_4624 | Starda Title: RiceguardAI by @joel_l_laggui_4624 | Stardance...
|
1793278487.356719
|
1793883287.356719
|
|
13618
|
My awesome macropad! by @vamshikrishnaramasamy | S My awesome macropad! by @vamshikrishnaramasamy | Stardance...
|
vamshikrishnaramasamy
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @vamshikrishnaramas Title: My awesome macropad! by @vamshikrishnaramasamy | Stardance...
|
1792918109.8547885
|
1793782109.8547885
|
|
13619
|
tourcraft by @tillus | Stardance
|
tillus
|
0
|
1.18
|
0
|
[]
|
[{"post_id": 6990, "ts": "2026 [{"post_id": 6990, "ts": "2026-06-11T18:48:52Z", "hours": 0.6506, "text": "I did some UI improvements and added Apple Private Cloud Compute Capabilities to enable the use of advanced Apple Intelligence features."}, {"post_id": 5795, "ts": "2026-06-09T18:32:14Z", "hours": 0.5317, "text": "Today I created the basic structure of the home view."}]...
|
Title: tourcraft by @tillus | Stardance
Devlogs:
Title: tourcraft by @tillus | Stardance
Devlogs:
Today I created the basic structure of the home view.
I did some UI improvements and added Apple Private Cloud Compute Capabilities to enable the use of advanced Apple Intelligence features....
|
1793267264.901789
|
1793872064.901789
|
|
13620
|
Rocket by @jaijai | Stardance
|
jaijai
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Rocket by @jaijai | Stardance
|
1793534150.070557
|
1794138950.070557
|
|
13621
|
flappy bird with bevy!! by @Unknown | Stardance
|
Unknown
|
0
|
6.43
|
0
|
[]
|
[{"post_id": 6404, "ts": "2026 [{"post_id": 6404, "ts": "2026-06-10T19:33:29Z", "hours": 0.5675, "text": "Quick devlog time!!! i have just added the pipe now i will work on the gap gen for pipes. YAY!!"}, {"post_id": 6375, "ts": "2026-06-10T18:51:16Z", "hours": 5.8672, "text": "Well i was learning for like 10 hrs but i have 6 hrs of time. Anyways so this will be my first project with bevy and i will be learning as i go currently i have the main frame setup like a bird which is….. Flapping duhh and a single a single pipe. Umm i passed the pipe while flapping so you will NOT BE ABLE TO SEE IT :)"}]...
|
Title: flappy bird with bevy!! by @Unknown | Stard Title: flappy bird with bevy!! by @Unknown | Stardance
Devlogs:
Well i was learning for like 10 hrs but i have 6 hrs of time. Anyways so this will be my first project with bevy and i will be learning as i go currently i have the main frame setup like a bird which is….. Flapping duhh and a single a single pipe. Umm i passed the pipe while flapping so you will NOT BE ABLE TO SEE IT :)
Quick devlog time!!! i have just added the pipe now i will work on the gap gen for pipes. YAY!!...
|
1793181355.8430521
|
1793786155.8430521
|
|
13622
|
My first slack bot! by @MOHAMEDTAHA | Stardance
|
MOHAMEDTAHA
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @MOHAMEDTAHA | Stard Title: My first slack bot! by @MOHAMEDTAHA | Stardance...
|
1793177466.8901517
|
1793782266.8901517
|
|
13623
|
Self balancing Robot by @BobbyDelacour | Stardance
|
BobbyDelacour
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Self balancing Robot by @BobbyDelacour | St Title: Self balancing Robot by @BobbyDelacour | Stardance...
|
1793206527.2358959
|
1793811327.2358959
|
|
13624
|
LoRa ESP32 device by @Kirill | Stardance
|
Kirill
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: LoRa ESP32 device by @Kirill | Stardance
|
1793350394.506952
|
1793955194.506952
|
|
13625
|
OmarOS by @Omar4lifex | Stardance
|
Omar4lifex
|
4
|
20.0
|
156
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T16:58:59Z", "hours": 9.0, "multiplier": 10.62, "payout": 108, "blessing": "neutral", "text": "Massive update for OmarOS! I completely overhauled the UI across all mini-apps with modern rounded edges, crisp window icons, and smooth fullscreen + minimize button animations so windows glide fluidly instead of just snapping. I also added a “Save as PNG” export button to the pixel art app so you can download drawings straight to your device, built a custom wallpaper upload feature using FileReader and localStorage so your background sticks around across page reloads, added a full File Explorer mini-app to browse through “My Projects”, and coded a brand-new Decision Wheel random decision maker app with custom option tags and an animated spinning loop. (Took a ton of debugging to get the layouts and animations behaving properly, but it looks so clean now!) P.S: for the video test, see my latest devlog or try it out here: https://omar-web-os.vercel.app/", "repo": "https://github.com/Omar4life/OmarOS", "demo": "https://omar-web-os.vercel.app/"}, {"ship_num": 2, "ts": "2026-07-02T15:04:16Z", "hours": 3.0, "multiplier": 14.71, "payout": 38, "blessing": "neutral", "text": "I added a new terminal app which has 9 commands (use -help to see them), this took me pretty long cuz I ran into a lot of errors, also changed the background cuz it looks better like this Ship 3: I added a new terminal app which has 9 commands (use -help to see them) and also changed the background", "repo": "https://github.com/Omar4life/OmarOS", "demo": "https://omar-web-os.vercel.app/"}, {"ship_num": 3, "ts": "2026-06-18T10:02:08Z", "hours": 4.0, "multiplier": 2.98, "payout": 10, "blessing": "neutral", "text": "This is version 2 of my OS: New features: Pixel art mini-app What it includes: Color picker, canvas, eraser, clear whole canvas, save your projects + access them", "repo": "https://github.com/Omar4life/OmarOS", "demo": "https://omar-web-os.vercel.app/"}, {"ship_num": 4, "ts": "2026-06-13T19:37:02Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is the first version of my OmarOS which includes these features Updating timer + date My social links Draggable window + close and open tab It was built using HTML/CSS and Javascript", "repo": "https://github.com/Omar4life/OmarOS", "demo": "https://omar-web-os.vercel.app/"}]...
|
[{"post_id": 48309, "ts": "202 [{"post_id": 48309, "ts": "2026-08-16T16:52:05Z", "hours": 8.5175, "text": "Massive update for OmarOS! I completely overhauled the UI across all mini-apps with modern rounded edges, crisp window icons, and smooth fullscreen + minimize button animations so windows glide fluidly instead of just snapping. I also added a “Save as PNG” export button to the pixel art app so you can download drawings straight to your device, built a custom wallpaper upload feature using FileReader and localStorage so your background sticks around across page reloads, added a full File Explorer mini-app to browse through “My Projects”, and coded a brand-new Decision Wheel random decision maker app with custom option tags and an animated spinning loop. (Took a ton of debugging to get the layouts and animations behaving properly, but it looks so clean now!)"}, {"post_id": 14321, "ts": "2026-06-23T12:31:19Z", "hours": 2.57, "text": "I added a new terminal app which has 9 commands (use -help to see them), this took me pretty long cuz I ran into a lot of errors, also changed the background cuz it looks better like this"}, {"post_id": 8887, "ts": "2026-06-14T20:01:10Z", "hours": 1.1519, "text": "I fixed the canvas grid cuz the lines were kinda rectangular and not square, I added a save button and a saved projects dropdown (using localStorage), also made the “clear canvas” text just “clear” because it was too long and went out of bounds (Spent some very long time to adjust the 4 buttons to be aligned like for example the whole pixel art tab was taking up the whole screen at one point just because I made the width from 540px to 600px, almost ragequit lol)"}, {"post_id": 8700, "ts": "2026-06-14T13:35:52Z", "hours": 0.9236, "text": "I am now about like 95% done with the pixel art, I added the canvas grid, clear canvas + eraser button, I’m just gonna fix a bit of spacing between the color picker, eraser and clear canvas and then we should be good for the pixel arts tab"}, {"post_id": 8419, "ts": "2026-06-14T00:08:40Z", "hours": 0.5981, "text": "I’m now working on a new mini-app which is gonna be a pixel art canvas, I currently just added the icon, changed the color and border type, gonna make the actual pixel canvas soon"}, {"post_id": 8369, "ts": "2026-06-13T22:19:49Z", "hours": 0.8744, "text": "I fixed the border because before that I could just drag the button out and I would need to refresh the page to move it, so now I added a border. I used the “moveElement” function to constantly check the window’s position against the screen’s size and lock it to the edges if it tries to slide out of bounds"}, {"post_id": 8049, "ts": "2026-06-13T12:57:36Z", "hours": 0.4614, "text": "I added a close button + a reopen button which is the OmarOS on the left hand side, I’m also gonna work soon on doing a barrier as for example if I drag the box to the bottom I gotta refresh the page to reset it as the button doesn’t work"}, {"post_id": 7752, "ts": "2026-06-12T23:02:42Z", "hours": 1.1736, "text": "I added a little bar on top where you can drag the page only in that bar, if you try to drag it from the middle or something it won’t work, I’m now working on the opening + closing tabs button"}, {"post_id": 6090, "ts": "2026-06-10T07:33:17Z", "hours": 0.6789, "text": "I’ve added a profile picture with a border around it, I also added a background, centered the border, and made sure that the background of the border is white so that it doesn’t fit with the background"}, {"post_id": 5920, "ts": "2026-06-09T22:00:17Z", "hours": 1.4347, "text": "I am trying to make my own WebOS, for now I’ve made just the base, I also added a pretty cool border and real time that updates every second, and last but not least, I added my github + linkedin account"}]...
|
Title: OmarOS by @Omar4lifex | Stardance
Devlogs: Title: OmarOS by @Omar4lifex | Stardance
Devlogs:
I am trying to make my own WebOS, for now I’ve made just the base, I also added a pretty cool border and real time that updates every second, and last but not least, I added my github + linkedin account
I’ve added a profile picture with a border around it, I also added a background, centered the border, and made sure that the background of the border is white so that it doesn’t fit with the background
I added a little bar on top where you can drag the page only in that bar, if you try to drag it from the middle or something it won’t work, I’m now working on the opening + closing tabs button
I added a close button + a reopen button which is the OmarOS on the left hand side, I’m also gonna work soon on doing a barrier as for example if I drag the box to the bottom I gotta refresh the page to reset it as the button doesn’t work
I fixed the border because before that I could just drag the button out and I would need to refresh the page to move it, so now I added a border. I used the “moveElement” function to constantly check the window’s position against the screen’s size and lock it to the edges if it tries to slide out of bounds
I’m now working on a new mini-app which is gonna be a pixel art canvas, I currently just added the icon, changed the color and border type, gonna make the actual pixel canvas soon
I am now about like 95% done with the pixel art, I added the canvas grid, clear canvas + eraser button, I’m just gonna fix a bit of spacing between the color picker, eraser and clear canvas and then we should be good for the pixel arts tab
I fixed the canvas grid cuz the lines were kinda rectangular and not square, I added a save button and a saved projects dropdown (using localStorage), also made the “clear canvas” text just “clear” because it was too long and went out of bounds (Spent some very long time to adjust the 4 buttons to be aligned like for example the whole pixel art tab was taking up the whole screen at one point just because I made the width from 540px to 600px, almost ragequit lol)
I added a new terminal app which has 9 commands (use -help to see them), this took me pretty long cuz I ran into a lot of errors, also changed the background cuz it looks better like this
Massive update for OmarOS! I completely overhauled the UI across all mini-apps with modern rounded edges, crisp window icons, and smooth fullscreen + minimize button animations so windows glide fluidly instead of just snapping. I also added a “Save as PNG” export button to the pixel art app so you can download drawings straight to your device, built a custom wallpaper upload feature using FileReader and localStorage so your background sticks around across page reloads, added a full File Explorer mini-app to browse through “My Projects”, and coded a brand-new Decision Wheel random decision maker app with custom option tags and an animated spinning loop. (Took a ton of debugging to get the layouts and animations behaving properly, but it looks so clean now!)
Ships:
This is the first version of my OmarOS which includes these features Updating timer + date My social links Draggable window + close and open tab It was built using HTML/CSS and Javascript
This is version 2 of my OS: New features: Pixel art mini-app What it includes: Color picker, canvas, eraser, clear whole canvas, save your projects + access them
I added a new terminal app which has 9 commands (use -help to see them), this took me pretty long cuz I ran into a lot of errors, also changed the background cuz it looks better like this Ship 3: I added a new terminal app which has 9 commands (use -help to see them) and also changed the background
Massive update for OmarOS! I completely overhauled the UI across all mini-apps with modern rounded edges, crisp window icons, and smooth fullscreen + minimize button animations so windows glide fluidly instead of just snapping. I also added a “Save as PNG” export button to the pixel art app so you can download drawings straight to your device, built a custom wallpaper upload feature using FileReader and localStorage so your background sticks around across page reloads, added a full File Explorer mini-app to browse through “My Projects”, and coded a brand-new Decision Wheel random decision maker app with custom option tags and an animated spinning loop. (Took a ton of debugging to get the layouts and animations behaving properly, but it looks so clean now!) P.S: for the video test, see my latest devlog or try it out here: https://omar-web-os.vercel.app/...
|
1792878665.395777
|
1793742665.395777
|
|
13626
|
Untitled by @indiesealdev | Stardance
|
indiesealdev
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @indiesealdev | Stardance
|
1792932796.1006155
|
1793796796.1006155
|
|
13627
|
My first slack bot! by @DJshelfmushroom | Stardanc My first slack bot! by @DJshelfmushroom | Stardance...
|
DJshelfmushroom
|
1
|
6.0
|
30
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T00:35:30Z", "hours": 6.0, "multiplier": 4.97, "payout": 30, "blessing": "neutral", "text": "This was a lot harder than I thought it would be, but honestly not that bad overall. I am not used to making projects that will actually go out into the world, so this is a first for me! Otherwise all features look to be good to go, so out into the world this slack bot goes!", "repo": "https://github.com/DJshelfmushroom/stardance-slackbot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BA48WFSKD"}]...
|
[{"post_id": 7787, "ts": "2026 [{"post_id": 7787, "ts": "2026-06-13T00:23:56Z", "hours": 0.7544, "text": "Unsubscribing works, time to ship!"}, {"post_id": 7749, "ts": "2026-06-12T22:58:48Z", "hours": 4.2503, "text": "Scheduled cat messages working, time to make it possible to unsubscribe (like you would ever want to) This took way longer than it should’ve, Slack Bolt’s documentation is nonexistent."}, {"post_id": 5473, "ts": "2026-06-09T08:24:25Z", "hours": 0.3597, "text": "Got it up on Nest, running 24/7 now!"}, {"post_id": 5281, "ts": "2026-06-09T00:12:39Z", "hours": 0.3167, "text": "Damn I love cats. Random cat images!"}, {"post_id": 5259, "ts": "2026-06-08T23:41:26Z", "hours": 0.2744, "text": "Got the first command working, gonna add some of my own features next!"}]...
|
Title: My first slack bot! by @DJshelfmushroom | S Title: My first slack bot! by @DJshelfmushroom | Stardance
Devlogs:
Got the first command working, gonna add some of my own features next!
Damn I love cats. Random cat images!
Got it up on Nest, running 24/7 now!
Scheduled cat messages working, time to make it possible to unsubscribe (like you would ever want to) This took way longer than it should’ve, Slack Bolt’s documentation is nonexistent.
Unsubscribing works, time to ship!
Ships:
This was a lot harder than I thought it would be, but honestly not that bad overall. I am not used to making projects that will actually go out into the world, so this is a first for me! Otherwise all features look to be good to go, so out into the world this slack bot goes!...
|
1793562568.7650144
|
1793648968.7650144
|
|
13628
|
GRAViOLUS by @RandomizedAlias | Stardance
|
RandomizedAlias
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: GRAViOLUS by @RandomizedAlias | Stardance
|
1793559301.4504006
|
1794164101.4504006
|
|
13629
|
Kestrel by @Maci | Stardance
|
Maci
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Kestrel by @Maci | Stardance
|
1793256464.389935
|
1793861264.389935
|
|
13630
|
My very own WebOS by @Meaghan | Stardance
|
Meaghan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @Meaghan | Stardance
|
1793180997.5759237
|
1793785797.5759237
|
|
13631
|
wire snipping game by @aalex | Stardance
|
aalex
|
1
|
4.0
|
18
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T19:07:55Z", "hours": 4.0, "multiplier": 5.0, "payout": 18, "blessing": "neutral", "text": "I made a bomb defusal game featuring snipable wires, a customed designed spraying mechanism, and a case to go around the ardunio which doubles as a holder for the beeper. this project made me get comfortable with modeling around real objects, and writing ardunio code. check out the video of the project in action and let me know and please send any suggestions or feedback. thank you!", "repo": "https://github.com/icelolcream4-beep/bombdefusal", "demo": ""}]...
|
[{"post_id": 9618, "ts": "2026 [{"post_id": 9618, "ts": "2026-06-16T00:44:31Z", "hours": 0.8683, "text": "the core of the project is done! using the updated code and a hot glued support below the main servo holder the project just needs a case to hide the electronics."}, {"post_id": 8445, "ts": "2026-06-14T01:23:37Z", "hours": 1.7161, "text": "just finished the mount for the spray bottle/servo aswell as polishing the code."}, {"post_id": 5323, "ts": "2026-06-09T01:51:42Z", "hours": 1.0922, "text": "i just finished finished a rough draft of detecting when wires are disconnected."}]...
|
Title: wire snipping game by @aalex | Stardance
D Title: wire snipping game by @aalex | Stardance
Devlogs:
i just finished finished a rough draft of detecting when wires are disconnected.
just finished the mount for the spray bottle/servo aswell as polishing the code.
the core of the project is done! using the updated code and a hot glued support below the main servo holder the project just needs a case to hide the electronics.
Ships:
I made a bomb defusal game featuring snipable wires, a customed designed spraying mechanism, and a case to go around the ardunio which doubles as a holder for the beeper. this project made me get comfortable with modeling around real objects, and writing ardunio code. check out the video of the project in action and let me know and please send any suggestions or feedback. thank you!...
|
1793570132.9182653
|
1793656532.9182653
|
|
13632
|
PrismaOS by @reimunyancat | Stardance
|
reimunyancat
|
2
|
22.0
|
67
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-06T00:48:44Z", "hours": 6.0, "multiplier": 11.17, "payout": 67, "blessing": "neutral", "text": "PrismaOS is a desktop OS that runs in a browser tab. It was already a working shell after WebOS 1, so this round I went after the things that made it feel like a demo instead of a system: settings you can actually change, a way to get anywhere without the mouse, real files, and windows that behave. There are four new things since WebOS 1. Settings. A real preferences app. Four themes, four wallpapers (liquid, mesh, grid, solid), a custom accent color, and a lite mode that kills blur and background animation for weak machines. Everything writes to localStorage and restores before the first paint, so there is no flash of the wrong theme on reload. Spotlight. Press ctrl + K anywhere and you get fuzzy search over apps, themes and wallpapers. Arrow keys and enter, escape to close. It turned out to be the fastest way to use the whole OS and I now open everything with it. A virtual filesystem. There is an actual tree in memory with a Files app on top of it, and the terminal talks to the same tree. pwd, ls, cd, cat and open all work, and open hands the file to the Files app. One source of truth for two very different interfaces was the part I enjoyed most. Window snapping and global shortcuts. Drag a window to a screen edge and it snaps to half or a quarter with a preview overlay first. Plus keyboard shortcuts for closing, minimizing, cycling and resetting the layout. The hardest part was window state. Saved layouts only stored x and y, so on restore the width and height came back undefined and every clamp turned into NaN. Windows loaded at zero size in the top left corner and I stared at it for a while before I understood what I was looking at. The fix was merging saved values over the defaults instead of replacing them, and bumping the storage key. To test it: open the site, hit ctrl + K and type anything. Try the terminal with ls and cd System, then cat version. Drag a window into the left edge and let go. Open Settings and switch the wallpaper to liquid, then turn on lite mode and watch the blur disappear. If the layout ever gets messy, Settings has a reset button.", "repo": "https://github.com/reimunyancat/PrismaOS", "demo": "https://prisma-os-gamma.vercel.app/"}, {"ship_num": 2, "ts": "2026-08-01T16:41:24Z", "hours": 16.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built PrismaOS, a portfolio that boots and runs like a desktop OS inside a browser tab. Instead of a normal scrolling page, you get a boot sequence, a wallpaper, a menu bar with a live clock, and a dock. Every app opens as a real window you can drag around, focus, resize, and minimize, and the layout you leave behind is remembered. I didn’t want it to look like the guide, so I built my own visual language around a prism theme and shipped four switchable themes: aqua, graphite, midnight, and aurora. The dock has macOS-style cursor magnification, and the whole shell has its own glass look rather than the default one from the walkthrough. The feature the guide didn’t ask for is a working terminal. It’s not a prop. It runs help, about, projects, ls, open, theme, and fastfetch, it keeps command history, and it talks to the OS through a small syscall module so open terminal and theme aurora actually reach into the window manager and theme state. There are also two easter eggs in there for anyone who pokes around. My goal is to further develop it later into a portfolio site worthy of being featured on my GitHub profile.", "repo": "https://github.com/reimunyancat/PrismaOS", "demo": "https://prisma-os-gamma.vercel.app/"}]...
|
[{"post_id": 41646, "ts": "202 [{"post_id": 41646, "ts": "2026-08-06T00:25:20Z", "hours": 3.0592, "text": "Devlog #6 Last time I promised a virtual filesystem. It’s here — plus window snapping, which sneaked in because I got tired of dragging windows into place by hand. One tree, two apps The whole filesystem is a single fs.ts file: a nested tree of directories and files, no disk involved. What makes it worth building is that Files and the terminal both read from that same tree. Click into ~/Projects in Files, then type cd ~/Projects in the terminal, and you’re looking at the same list. Neither app owns the data, so they can’t drift apart. Files ended up as a three-pane Finder: places sidebar, listing, preview at the bottom. Folders are sorted before files, hidden dotfiles are filtered out unless you ask. App bundles carry an app field, so selecting Terminal.app and hitting “Open in app” launches the real window — the fake filesystem reaches back into the real OS, which is a nicer trick than it has any right to be. The terminal grew pwd , ls , cd , cat , and a smarter open . Path handling is the part nobody sees: one normalizePath swallows ~ , . , .. , and relative paths, spits out a clean absolute path, and every command routes through it. Write that once and cd ../../Users/nyancat just works. Skip it and you’re writing string hacks forever. I also stash the current directory on every input line, so scrolling back up shows the prompt exactly as it was — prism ~/Projects $ and not a rewritten one. Small thing. Feels wrong immediately when it’s missing. Throwing windows at walls Snapping turned out to be a two-line idea buried under a plumbing problem. Drop a window near the left edge and it fills the left half; right edge, right half; top edge, full screen. The catch: the drag hook only knew where the window ended up, not where the cursor was. Those are different by however far from the titlebar’s corner you happened to grab. Drag by the right side of the titlebar and the window’s own x never gets close to the left edge, so nothing snaps and you sit there wondering if you broke it. Fix was to pass the pointer coordinates along with the final position and judge the zone by the cursor. The bug I found while I was in there Opening the window manager back up, I noticed the layout restore was saved ?? app.initial — and move() only writes {x, y} . So move a window, close it, reopen: the saved partial wins, width and height come back undefined , Math.min(undefined, vw) gives NaN , and the window collapses to the size of its own text. It only shows up if you move a window without ever resizing it, which is why it survived this long. Merging over the defaults instead of replacing them fixes it, and I bumped the storage key to prisma-layout-v2 so old broken entries get ignored rather than restored. Where PrismaOS stands Virtual filesystem shared by Files and the terminal — same paths, same contents Files app: sidebar, listing, preview, and launching apps straight from bundles Terminal: pwd , ls (with -a ), cd , cat , open <app|file> Window snapping to left, right, and full screen, plus the layout NaN fix Next up Wrapping up. Version bump to 0.3.0, a pass over the leftovers, and shipping the whole thing."}, {"post_id": 40807, "ts": "2026-08-04T15:53:27Z", "hours": 1.4222, "text": "Devlog #5 Told you Spotlight was next. ctrl + K now pulls a command palette up over the desktop, and a set of global shortcuts came along for the ride. What I built Spotlight is one input that searches apps, themes, and wallpapers at the same time. The matching isn’t substring — it’s subsequence. Your letters just have to show up in order, so prj lands on Projects and mdn finds “Theme — midnight”. Type less, get more. That’s the whole pitch. It also isn’t a window. It’s an overlay sitting above the desktop, so it skips the window manager entirely — no z-index fights, no traffic lights, just a backdrop you click away from. Arrow keys move, Enter runs, Esc bails. Boringly predictable, which is exactly what a launcher should be. Same session added global hotkeys through a small useHotkeys hook: ctrl + K for Spotlight, ctrl + W closes the front window, ctrl + M minimizes it, ctrl + , opens Settings, and ctrl + ` cycles through windows. One listener registered on mount, handlers kept in a ref so nothing goes stale. The shortcut minefield Picking key combos for a web app is mostly a game of “what am I not allowed to touch”. ctrl + Tab and ctrl + N belong to the browser, period. That’s how window cycling ended up on the backtick — looks odd, but it sits right above Tab, so your finger barely moves. Accidentally ergonomic. Where PrismaOS stands ctrl + K palette: fuzzy search over apps, themes, wallpapers Global hotkeys: close, minimize, Settings, window cycling Spotlight is an overlay, not a window — the window manager never sees it Next up A virtual filesystem. One tree shared by a Finder-style Files app and the terminal, so cd -ing around and clicking through folders show you the exact same places."}, {"post_id": 40502, "ts": "2026-08-04T02:27:48Z", "hours": 1.5411, "text": "Devlog #4 WebOS 1 shipped, so now I’m on WebOS 2: four new features on top of the 0.2.0 baseline. First one up is a proper Settings app. Until now, the only way to reskin the desktop was typing theme aurora into the terminal like it’s 1995. Charming, but not exactly something you can show people. What I built The Settings window has five sections: theme, wallpaper, accent color, performance, and window layout. Everything routes through os.ts , the little kernel module that owns the document.documentElement attributes and localStorage — so whatever you pick survives a refresh, and restores before the first paint. The wallpaper system was the fun part. The desktop background is just a stack of CSS gradients, so switching wallpapers means flipping one data-wallpaper attribute and letting App.css restyle the whole thing. I added three new ones (mesh, grid, solid) on top of the default liquid. The accent picker is even lazier: it overrides a single --accent variable on top of whatever theme is active, so any accent mixes with any theme for free. I also gave lite mode (blur off, animations off) a manual override. It used to be purely automatic, based on hardware detection. Now if you flip it yourself, your choice wins over the heuristic. The facepalm Also settled something small but important: all UI strings ship in English by default, since this is a public portfolio. A language toggle can come later — English stays the default either way. Where PrismaOS stands Settings app: themes, wallpapers, accent colors, lite mode, layout reset Every choice persists via localStorage and restores before first paint New wallpapers: mesh, grid, solid (liquid stays the default) Next up Spotlight. ctrl + K, fuzzy search over apps, themes, and wallpapers — because clicking is effort."}, {"post_id": 38977, "ts": "2026-08-01T16:25:32Z", "hours": 7.0089, "text": "Devlog #3 Devlog #2 ended with a shell that read as a desktop but a dock where every icon opened a placeholder. This time I filled it in: the real apps, a terminal that can actually drive the OS, and the boot screen I said I’d redo. About, Projects, and Music are real windows now, all registered in one place and opened through the window manager. An app is just an entry — id, title, icon, component — so the dock, the terminal, and the logo menu all launch through the same path. Projects is the one with real structure: a card grid and a detail view off a single useState . I made the cards <button> instead of <div> after realizing I couldn’t tab to a project; that brought focus and Enter/Space back for free. The terminal was the part I cared about most. help , about , projects , ls , open , theme , fastfetch , clear , plus two easter eggs. Parsing was nothing — a split and a switch. The annoying part was that open terminal needs the window manager and theme aurora needs the theme state, both living way above the terminal. I didn’t want to prop-drill the whole WM into a leaf, so the shell talks to src/os.ts instead: import { launchApp , listApps , setTheme , THEMES } from \" ../os \" ; Small module, handlers registered at mount. open returns false for a missing app so I can print no such app instead of failing silently. Command history took two tries — the first walked off the end of the array and left undefined in the input; fix was making -1 mean “not browsing”. Boot screen: the old one was a pulsing logo and a 2400ms bar that measured nothing, opening into a shell with glass and a live clock. Now it prints staged log lines as the bar crosses them (mount display, load tokens, start WM, register apps, start prism-sh), the logo sits on a slow refraction sweep, and any click or key skips it. It only plays once per tab via sessionStorage , and prefers-reduced-motion takes the same fast path. Two bugs turned up prepping the build. npm run build died instantly: src/hooks/useWindows.ts(1,10): error TS6133: 'use' is declared but never read. An autocomplete import { use, ... } I never called. dev doesn’t typecheck, but build is tsc --noEmit && vite build with noUnusedLocals , so the first real build was the first warning. Six characters. The other: About’s only link was href=\"https//github.com/...\" — missing colon, so it read as a relative path and 404’d inside my own site. Clicked past it a dozen times."}, {"post_id": 35217, "ts": "2026-07-26T14:33:42Z", "hours": 2.8786, "text": "Devlog #2 Building my portfolio as an operating system that runs in a browser tab. Picking up from Devlog #1, where the desktop finally had bones — windows you could drag, focus, resize, and minimize — but nothing around them. An empty wallpaper with floating rectangles isn’t an OS; it’s a screensaver. This milestone is about the two pieces of chrome that make it read as a real desktop the instant it loads: the menu bar across the top and the dock along the bottom. A menu bar The menu bar is mostly static — a logo that drops open into an “About / Restart” menu, and the usual File / Edit / View / Help labels that don’t do much yet. The one part that has to feel alive is the clock in the top-right corner. A frozen clock immediately breaks the illusion, so it ticks once a second Nothing fancy — a setInterval that recomputes the formatted string every second and clears itself on unmount. The formatting is where I tripped. The crash that ate the whole screen I wanted the clock in Korean — “7월 26일 (일) 오후 11:24” — so I reached for the browser’s built-in localization instead of hand-formatting dates: const date = d . toLocaleDateString ( \" ko-KR \" , { month : \" short \" , day : \" numeric \" , weekday : \" short \" }) const time = d . toLocaleTimeString ( \" ko_KR \" , { hour : \" 2-digit \" , minute : \" 2-digit \" }) And the app went white. Not a subtly-wrong date — the entire MenuBar component threw and took the tree down with it: Uncaught RangeError: invalid language tag: \"ko_KR\" formatNow MenuBar.tsx:74 It took me an embarrassing minute because the two lines look identical at a glance. Look again: the date says ko-KR , the time says ko_KR . A hyphen on one line, an underscore on the next. The fix was one keystroke — underscore to hyphen — and the shell came back. Lesson filed away: locale tags are hyphenated, always, and Intl validates them strictly enough to crash. Two things to fix properly later — normalize the locale in one constant so I can’t typo it twice, and wrap the shell in an error boundary so a single throw dims one widget instead of nuking the screen. The dock The dock is the fun part. I wanted the macOS-style effect where icons swell as the cursor passes over them and the neighbors ease up too, so it feels like the row is being pushed under a magnifying glass rather than icons popping one at a time. On a trackpad-less touch screen there’s no hover state, so a finger tap would otherwise make the whole dock lurch to wherever you touched. Gating on pointerType === \"mouse\" keeps touch calm and leaves the magnification as a mouse-only flourish, which is exactly where it belongs. Where stands Menu bar with a working logo menu and a live, once-a-second clock. Clock is localized through Intl — after learning the hard way that the tag must be ko-KR , not ko_KR . Dock with smooth Gaussian cursor magnification and a subtle lift, mouse-only. The desktop finally reads as a desktop at first glance, even before any real apps exist. Next up The apps themselves — About and Projects as real windows wired into the window manager, replacing the placeholder stand-ins the dock currently launches. And, not incidentally, the boot sequence needs a proper redesign; the current one is placeholder-grade and doesn’t match the polish of the shell it opens into."}, {"post_id": 33791, "ts": "2026-07-24T00:13:15Z", "hours": 6.5044, "text": "Devlog #1 Building my portfolio as an operating system that runs in a browser tab. Why this exists When I first saw the brief, I honestly just planned to knock something out — the minimum that clears the requirements and move on. But somewhere between the first commit and the second, I changed my mind. If I’m going to build a website anyway, why not make it the website — my actual portfolio. So I decided to treat PrismaOS as the real thing and pour everything I have into it: a portfolio site that is itself the project. Every window, every pixel of the shell, is something I want to be proud to show. That reframing is why this repo suddenly has design tokens, four themes, and a genie animation nobody asked for. The concept: instead of a scrolling landing page, the visitor boots into a tiny web desktop — a menu bar, a dock, draggable windows — and explores my work the way you’d poke around someone’s actual computer. This milestone: the window manager Devlog #1 covers the skeleton — the part that makes it feel like an OS rather One source of truth Every window’s position, size, focus order (z-index), and minimized state lives in a single hook, useWindows . Components never track their own coordinates. Opening, closing, focusing, moving, and resizing all route through that one place. Dragging without dropping frames The naive approach — call setState on every pointer move — makes windows stutter because React re-renders on every pixel. So during a drag I don’t touch state at all. I mutate the DOM node directly ( el.style.left/top ) for a smooth 60fps, and only commit the final position to state when the pointer is released. The other trick is setPointerCapture . Once the pointer is captured, the drag keeps working even if the cursor flies outside the window — or outside the browser entirely. Touch gets the same behavior for free, since Pointer Events unify mouse and touch. handle . setPointerCapture ( e . pointerId ) // ...move: write to el.style directly (no re-render) // ...up: commit once via onDragEnd() Resizing from the bottom-right corner uses the exact same pattern: capture, mutate the DOM live, commit on release. Bug I caught Clicking any window brings it to the front by bumping a z-counter."}]...
|
Title: PrismaOS by @reimunyancat | Stardance
Devl Title: PrismaOS by @reimunyancat | Stardance
Devlogs:
Devlog #1 Building my portfolio as an operating system that runs in a browser tab. Why this exists When I first saw the brief, I honestly just planned to knock something out — the minimum that clears the requirements and move on. But somewhere between the first commit and the second, I changed my mind. If I’m going to build a website anyway, why not make it the website — my actual portfolio. So I decided to treat PrismaOS as the real thing and pour everything I have into it: a portfolio site that is itself the project. Every window, every pixel of the shell, is something I want to be proud to show. That reframing is why this repo suddenly has design tokens, four themes, and a genie animation nobody asked for. The concept: instead of a scrolling landing page, the visitor boots into a tiny web desktop — a menu bar, a dock, draggable windows — and explores my work the way you’d poke around someone’s actual computer. This milestone: the window manager Devlog #1 covers the skeleton — the part that makes it feel like an OS rather One source of truth Every window’s position, size, focus order (z-index), and minimized state lives in a single hook, useWindows . Components never track their own coordinates. Opening, closing, focusing, moving, and resizing all route through that one place. Dragging without dropping frames The naive approach — call setState on every pointer move — makes windows stutter because React re-renders on every pixel. So during a drag I don’t touch state at all. I mutate the DOM node directly ( el.style.left/top ) for a smooth 60fps, and only commit the final position to state when the pointer is released. The other trick is setPointerCapture . Once the pointer is captured, the drag keeps working even if the cursor flies outside the window — or outside the browser entirely. Touch gets the same behavior for free, since Pointer Events unify mouse and touch. handle . setPointerCapture ( e . pointerId ) // ...move: write to el.style directly (no re-render) // ...up: commit once via onDragEnd() Resizing from the bottom-right corner uses the exact same pattern: capture, mutate the DOM live, commit on release. Bug I caught Clicking any window brings it to the front by bumping a z-counter.
Devlog #2 Building my portfolio as an operating system that runs in a browser tab. Picking up from Devlog #1, where the desktop finally had bones — windows you could drag, focus, resize, and minimize — but nothing around them. An empty wallpaper with floating rectangles isn’t an OS; it’s a screensaver. This milestone is about the two pieces of chrome that make it read as a real desktop the instant it loads: the menu bar across the top and the dock along the bottom. A menu bar The menu bar is mostly static — a logo that drops open into an “About / Restart” menu, and the usual File / Edit / View / Help labels that don’t do much yet. The one part that has to feel alive is the clock in the top-right corner. A frozen clock immediately breaks the illusion, so it ticks once a second Nothing fancy — a setInterval that recomputes the formatted string every second and clears itself on unmount. The formatting is where I tripped. The crash that ate the whole screen I wanted the clock in Korean — “7월 26일 (일) 오후 11:24” — so I reached for the browser’s built-in localization instead of hand-formatting dates: const date = d . toLocaleDateString ( " ko-KR " , { month : " short " , day : " numeric " , weekday : " short " }) const time = d . toLocaleTimeString ( " ko_KR " , { hour : " 2-digit " , minute : " 2-digit " }) And the app went white. Not a subtly-wrong date — the entire MenuBar component threw and took the tree down with it: Uncaught RangeError: invalid language tag: "ko_KR" formatNow MenuBar.tsx:74 It took me an embarrassing minute because the two lines look identical at a glance. Look again: the date says ko-KR , the time says ko_KR . A hyphen on one line, an underscore on the next. The fix was one keystroke — underscore to hyphen — and the shell came back. Lesson filed away: locale tags are hyphenated, always, and Intl validates them strictly enough to crash. Two things to fix properly later — normalize the locale in one constant so I can’t typo it twice, and wrap the shell in an error boundary so a single throw dims one widget instead of nuking the screen. The dock The dock is the fun part. I wanted the macOS-style effect where icons swell as the cursor passes over them and the neighbors ease up too, so it feels like the row is being pushed under a magnifying glass rather than icons popping one at a time. On a trackpad-less touch screen there’s no hover state, so a finger tap would otherwise make the whole dock lurch to wherever you touched. Gating on pointerType === "mouse" keeps touch calm and leaves the magnification as a mouse-only flourish, which is exactly where it belongs. Where stands Menu bar with a working logo menu and a live, once-a-second clock. Clock is localized through Intl — after learning the hard way that the tag must be ko-KR , not ko_KR . Dock with smooth Gaussian cursor magnification and a subtle lift, mouse-only. The desktop finally reads as a desktop at first glance, even before any real apps exist. Next up The apps themselves — About and Projects as real windows wired into the window manager, replacing the placeholder stand-ins the dock currently launches. And, not incidentally, the boot sequence needs a proper redesign; the current one is placeholder-grade and doesn’t match the polish of the shell it opens into.
Devlog #3 Devlog #2 ended with a shell that read as a desktop but a dock where every icon opened a placeholder. This time I filled it in: the real apps, a terminal that can actually drive the OS, and the boot screen I said I’d redo. About, Projects, and Music are real windows now, all registered in one place and opened through the window manager. An app is just an entry — id, title, icon, component — so the dock, the terminal, and the logo menu all launch through the same path. Projects is the one with real structure: a card grid and a detail view off a single useState . I made the cards <button> instead of <div> after realizing I couldn’t tab to a project; that brought focus and Enter/Space back for free. The terminal was the part I cared about most. help , about , projects , ls , open , theme , fastfetch , clear , plus two easter eggs. Parsing was nothing — a split and a switch. The annoying part was that open terminal needs the window manager and theme aurora needs the theme state, both living way above the terminal. I didn’t want to prop-drill the whole WM into a leaf, so the shell talks to src/os.ts instead: import { launchApp , listApps , setTheme , THEMES } from " ../os " ; Small module, handlers registered at mount. open returns false for a missing app so I can print no such app instead of failing silently. Command history took two tries — the first walked off the end of the array and left undefined in the input; fix was making -1 mean “not browsing”. Boot screen: the old one was a pulsing logo and a 2400ms bar that measured nothing, opening into a shell with glass and a live clock. Now it prints staged log lines as the bar crosses them (mount display, load tokens, start WM, register apps, start prism-sh), the logo sits on a slow refraction sweep, and any click or key skips it. It only plays once per tab via sessionStorage , and prefers-reduced-motion takes the same fast path. Two bugs turned up prepping the build. npm run build died instantly: src/hooks/useWindows.ts(1,10): error TS6133: 'use' is declared but never read. An autocomplete import { use, ... } I never called. dev doesn’t typecheck, but build is tsc --noEmit && vite build with noUnusedLocals , so the first real build was the first warning. Six characters. The other: About’s only link was href="https//github.com/..." — missing colon, so it read as a relative path and 404’d inside my own site. Clicked past it a dozen times.
Devlog #4 WebOS 1 shipped, so now I’m on WebOS 2: four new features on top of the 0.2.0 baseline. First one up is a proper Settings app. Until now, the only way to reskin the desktop was typing theme aurora into the terminal like it’s 1995. Charming, but not exactly something you can show people. What I built The Settings window has five sections: theme, wallpaper, accent color, performance, and window layout. Everything routes through os.ts , the little kernel module that owns the document.documentElement attributes and localStorage — so whatever you pick survives a refresh, and restores before the first paint. The wallpaper system was the fun part. The desktop background is just a stack of CSS gradients, so switching wallpapers means flipping one data-wallpaper attribute and letting App.css restyle the whole thing. I added three new ones (mesh, grid, solid) on top of the default liquid. The accent picker is even lazier: it overrides a single --accent variable on top of whatever theme is active, so any accent mixes with any theme for free. I also gave lite mode (blur off, animations off) a manual override. It used to be purely automatic, based on hardware detection. Now if you flip it yourself, your choice wins over the heuristic. The facepalm Also settled something small but important: all UI strings ship in English by default, since this is a public portfolio. A language toggle can come later — English stays the default either way. Where PrismaOS stands Settings app: themes, wallpapers, accent colors, lite mode, layout reset Every choice persists via localStorage and restores before first paint New wallpapers: mesh, grid, solid (liquid stays the default) Next up Spotlight. ctrl + K, fuzzy search over apps, themes, and wallpapers — because clicking is effort.
Devlog #5 Told you Spotlight was next. ctrl + K now pulls a command palette up over the desktop, and a set of global shortcuts came along for the ride. What I built Spotlight is one input that searches apps, themes, and wallpapers at the same time. The matching isn’t substring — it’s subsequence. Your letters just have to show up in order, so prj lands on Projects and mdn finds “Theme — midnight”. Type less, get more. That’s the whole pitch. It also isn’t a window. It’s an overlay sitting above the desktop, so it skips the window manager entirely — no z-index fights, no traffic lights, just a backdrop you click away from. Arrow keys move, Enter runs, Esc bails. Boringly predictable, which is exactly what a launcher should be. Same session added global hotkeys through a small useHotkeys hook: ctrl + K for Spotlight, ctrl + W closes the front window, ctrl + M minimizes it, ctrl + , opens Settings, and ctrl + ` cycles through windows. One listener registered on mount, handlers kept in a ref so nothing goes stale. The shortcut minefield Picking key combos for a web app is mostly a game of “what am I not allowed to touch”. ctrl + Tab and ctrl + N belong to the browser, period. That’s how window cycling ended up on the backtick — looks odd, but it sits right above Tab, so your finger barely moves. Accidentally ergonomic. Where PrismaOS stands ctrl + K palette: fuzzy search over apps, themes, wallpapers Global hotkeys: close, minimize, Settings, window cycling Spotlight is an overlay, not a window — the window manager never sees it Next up A virtual filesystem. One tree shared by a Finder-style Files app and the terminal, so cd -ing around and clicking through folders show you the exact same places.
Devlog #6 Last time I promised a virtual filesystem. It’s here — plus window snapping, which sneaked in because I got tired of dragging windows into place by hand. One tree, two apps The whole filesystem is a single fs.ts file: a nested tree of directories and files, no disk involved. What makes it worth building is that Files and the terminal both read from that same tree. Click into ~/Projects in Files, then type cd ~/Projects in the terminal, and you’re looking at the same list. Neither app owns the data, so they can’t drift apart. Files ended up as a three-pane Finder: places sidebar, listing, preview at the bottom. Folders are sorted before files, hidden dotfiles are filtered out unless you ask. App bundles carry an app field, so selecting Terminal.app and hitting “Open in app” launches the real window — the fake filesystem reaches back into the real OS, which is a nicer trick than it has any right to be. The terminal grew pwd , ls , cd , cat , and a smarter open . Path handling is the part nobody sees: one normalizePath swallows ~ , . , .. , and relative paths, spits out a clean absolute path, and every command routes through it. Write that once and cd ../../Users/nyancat just works. Skip it and you’re writing string hacks forever. I also stash the current directory on every input line, so scrolling back up shows the prompt exactly as it was — prism ~/Projects $ and not a rewritten one. Small thing. Feels wrong immediately when it’s missing. Throwing windows at walls Snapping turned out to be a two-line idea buried under a plumbing problem. Drop a window near the left edge and it fills the left half; right edge, right half; top edge, full screen. The catch: the drag hook only knew where the window ended up, not where the cursor was. Those are different by however far from the titlebar’s corner you happened to grab. Drag by the right side of the titlebar and the window’s own x never gets close to the left edge, so nothing snaps and you sit there wondering if you broke it. Fix was to pass the pointer coordinates along with the final position and judge the zone by the cursor. The bug I found while I was in there Opening the window manager back up, I noticed the layout restore was saved ?? app.initial — and move() only writes {x, y} . So move a window, close it, reopen: the saved partial wins, width and height come back undefined , Math.min(undefined, vw) gives NaN , and the window collapses to the size of its own text. It only shows up if you move a window without ever resizing it, which is why it survived this long. Merging over the defaults instead of replacing them fixes it, and I bumped the storage key to prisma-layout-v2 so old broken entries get ignored rather than restored. Where PrismaOS stands Virtual filesystem shared by Files and the terminal — same paths, same contents Files app: sidebar, listing, preview, and launching apps straight from bundles Terminal: pwd , ls (with -a ), cd , cat , open <app|file> Window snapping to left, right, and full screen, plus the layout NaN fix Next up Wrapping up. Version bump to 0.3.0, a pass over the leftovers, and shipping the whole thing.
Ships:
I built PrismaOS, a portfolio that boots and runs like a desktop OS inside a browser tab. Instead of a normal scrolling page, you get a boot sequence, a wallpaper, a menu bar with a live clock, and a dock. Every app opens as a real window you can drag around, focus, resize, and minimize, and the layout you leave behind is remembered. I didn’t want it to look like the guide, so I built my own visual language around a prism theme and shipped four switchable themes: aqua, graphite, midnight, and aurora. The dock has macOS-style cursor magnification, and the whole shell has its own glass look rather than the default one from the walkthrough. The feature the guide didn’t ask for is a working terminal. It’s not a prop. It runs help, about, projects, ls, open, theme, and fastfetch, it keeps command history, and it talks to the OS through a small syscall module so open terminal and theme aurora actually reach into the window manager and theme state. There are also two easter eggs in there for anyone who pokes around. My goal is to further develop it later into a portfolio site worthy of being featured on my GitHub profile.
PrismaOS is a desktop OS that runs in a browser tab. It was already a working shell after WebOS 1, so this round I went after the things that made it feel like a demo instead of a system: settings you can actually change, a way to get anywhere without the mouse, real files, and windows that behave. There are four new things since WebOS 1. Settings. A real preferences app. Four themes, four wallpapers (liquid, mesh, grid, solid), a custom accent color, and a lite mode that kills blur and background animation for weak machines. Everything writes to localStorage and restores before the first paint, so there is no flash of the wrong theme on reload. Spotlight. Press ctrl + K anywhere and you get fuzzy search over apps, themes and wallpapers. Arrow keys and enter, escape to close. It turned out to be the fastest way to use the whole OS and I now open everything with it. A virtual filesystem. There is an actual tree in memory with a Files app on top of it, and the terminal talks to the same tree. pwd, ls, cd, cat and open all work, and open hands the file to the Files app. One source of truth for two very different interfaces was the part I enjoyed most. Window snapping and global shortcuts. Drag a window to a screen edge and it snaps to half or a quarter with a preview overlay first. Plus keyboard shortcuts for closing, minimizing, cycling and resetting the layout. The hardest part was window state. Saved layouts only stored x and y, so on restore the width and height came back undefined and every clamp turned into NaN. Windows loaded at zero size in the top left corner and I stared at it for a while before I understood what I was looking at. The fix was merging saved values over the defaults instead of replacing them, and bumping the storage key. To test it: open the site, hit ctrl + K and type anything. Try the terminal with ls and cd System, then cat version. Drag a window into the left edge and let go. Open Settings and switch the wallpaper to liquid, then turn on lite mode and watch the blur disappear. If the layout ever gets messy, Settings has a reset button....
|
1792878685.3973277
|
1793742685.3973277
|
|
13633
|
ConeOS by @Cone | Stardance
|
Cone
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: ConeOS by @Cone | Stardance
|
1793134156.6927032
|
1793738956.6927032
|
|
13634
|
hackpad by @reimunyancat | Stardance
|
reimunyancat
|
1
|
8.23
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T07:30:08Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Designing the case was a real chore; it was so difficult. I haven’t completely decided on the keymap yet, but I plan to think about the firmware after I receive and assemble it.", "repo": "https://github.com/reimunyancat/hackpad", "demo": ""}]...
|
[{"post_id": 45490, "ts": "202 [{"post_id": 45490, "ts": "2026-08-12T00:52:29Z", "hours": 4.2317, "text": "Since I was installing the module myself, the fit wasn’t quite right, so I had to make adjustments while going back and forth between the PCB and the case. It was truly difficult, but… I managed to pull it off."}, {"post_id": 12594, "ts": "2026-06-20T15:55:22Z", "hours": 1.5261, "text": "Finished the PCB, so this round was all about the case. I went with a sandwich design: a bottom shell that holds the PCB and a top plate with 14mm cutouts the switches snap into, bolted together with M3×16 screws into heatset inserts.I modeled the whole thing myself in Fusion 360 — bottom case, top plate, and the full assembly. Everything’s dimensioned around the real part measurements: 0.2mm tolerance on the mating surfaces, a USB-C cutout on the side wall for the XIAO, and openings for the encoder knob and the OLED. Six standoffs inside keep the board from flexing.Exported all three parts as .STEP (Bottom.STEP, Top.STEP, assembled-model.STEP) — STEP keeps the exact geometry, and the print team converts to STL on their end. Whole thing fits well within the 200×200×100mm limit.Case = done. Next up: firmware."}, {"post_id": 7499, "ts": "2026-06-12T14:39:09Z", "hours": 1.5156, "text": "I installed Fusion to design a case for the PCB; I calculated the dimensions and entered them into the parameters list to streamline future work."}, {"post_id": 5425, "ts": "2026-06-09T05:57:59Z", "hours": 0.6561, "text": "I have finished designing the PCB board. It was my first time doing this, so it was tough constantly searching and asking AI, but I am glad to have completed it anyway."}, {"post_id": 5386, "ts": "2026-06-09T04:04:34Z", "hours": 0.3842, "text": "Start PCB layout — Create a 19.05mm custom grid and arrange 9 switches in a 3x3 configuration, placing diodes D1 through D9 below each switch in the same direction. Place the XIAO, encoder (SW10), and OLED header (J1) around the grid (detailed positioning in progress)."}]...
|
Title: hackpad by @reimunyancat | Stardance
Devlo Title: hackpad by @reimunyancat | Stardance
Devlogs:
Start PCB layout — Create a 19.05mm custom grid and arrange 9 switches in a 3x3 configuration, placing diodes D1 through D9 below each switch in the same direction. Place the XIAO, encoder (SW10), and OLED header (J1) around the grid (detailed positioning in progress).
I have finished designing the PCB board. It was my first time doing this, so it was tough constantly searching and asking AI, but I am glad to have completed it anyway.
I installed Fusion to design a case for the PCB; I calculated the dimensions and entered them into the parameters list to streamline future work.
Finished the PCB, so this round was all about the case. I went with a sandwich design: a bottom shell that holds the PCB and a top plate with 14mm cutouts the switches snap into, bolted together with M3×16 screws into heatset inserts.I modeled the whole thing myself in Fusion 360 — bottom case, top plate, and the full assembly. Everything’s dimensioned around the real part measurements: 0.2mm tolerance on the mating surfaces, a USB-C cutout on the side wall for the XIAO, and openings for the encoder knob and the OLED. Six standoffs inside keep the board from flexing.Exported all three parts as .STEP (Bottom.STEP, Top.STEP, assembled-model.STEP) — STEP keeps the exact geometry, and the print team converts to STL on their end. Whole thing fits well within the 200×200×100mm limit.Case = done. Next up: firmware.
Since I was installing the module myself, the fit wasn’t quite right, so I had to make adjustments while going back and forth between the PCB and the case. It was truly difficult, but… I managed to pull it off.
Ships:
Designing the case was a real chore; it was so difficult. I haven’t completely decided on the keymap yet, but I plan to think about the firmware after I receive and assemble it....
|
1792878559.763728
|
1793742559.763728
|
|
13635
|
My awesome macropad! by @Krokked0 | Stardance
|
Krokked0
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Krokked0 | Stardan Title: My awesome macropad! by @Krokked0 | Stardance...
|
1793537772.812
|
1794142572.812
|
|
13636
|
My awesome macropad! by @freya | Stardance
|
freya
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @freya | Stardance
|
1793321735.8091443
|
1793926535.8091443
|
|
13637
|
My first slack bot! by @anna_bincovich | Stardance
|
anna_bincovich
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @anna_bincovich | St Title: My first slack bot! by @anna_bincovich | Stardance...
|
1793267387.6634965
|
1793872187.6634965
|
|
13638
|
Chloride Sensor by @Jimmy | Stardance
|
Jimmy
|
0
|
0.3
|
0
|
[]
|
[{"post_id": 5364, "ts": "2026 [{"post_id": 5364, "ts": "2026-06-09T03:14:18Z", "hours": 0.2958, "text": "Started working on chloride data plotting"}]...
|
Title: Chloride Sensor by @Jimmy | Stardance
Devl Title: Chloride Sensor by @Jimmy | Stardance
Devlogs:
Started working on chloride data plotting...
|
1793220812.8505414
|
1793825612.8505414
|
|
13639
|
AntiVirus the game by @NolanV | Stardance
|
NolanV
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: AntiVirus the game by @NolanV | Stardance
|
1793134336.93202
|
1793739136.93202
|
|
13640
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792947281.3261063
|
1793811281.3261063
|
|
13641
|
Untitled project by @KarTH57 | Stardance
|
KarTH57
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @KarTH57 | Stardance
|
1793397316.7819424
|
1794002116.7819424
|
|
13642
|
Arduino LED heart display by @lcna013 | Stardance
|
lcna013
|
0
|
5.06
|
0
|
[]
|
[{"post_id": 18933, "ts": "202 [{"post_id": 18933, "ts": "2026-06-30T03:34:28Z", "hours": 1.7167, "text": "#DevLog_3 Working on the hardware elements. Putting all the components on a bread board and wiring it up. Also worked on some test code, just to check that my wiring was correct and the LEDs turned on when the button was pressed"}, {"post_id": 17360, "ts": "2026-06-28T03:36:20Z", "hours": 2.0669, "text": "#DevLog_2 All wiring is complete!! I also added a push button so people can change that mode with a button. This also makes it interactive as it requires user input. I also worked on some code example for each mode."}, {"post_id": 16696, "ts": "2026-06-27T03:57:50Z", "hours": 1.2808, "text": "#DevLog_1 I have started to figure out the wiring for the circuit. I used Tinkercad to do this. I ran into the main problem of it not all fitting onto in breadboard, and some of the LEDs didn’t light up. Also the wires look really messy, but I plant to sort that out after it all works!!"}]...
|
Title: Arduino LED heart display by @lcna013 | Sta Title: Arduino LED heart display by @lcna013 | Stardance
Devlogs:
#DevLog_1 I have started to figure out the wiring for the circuit. I used Tinkercad to do this. I ran into the main problem of it not all fitting onto in breadboard, and some of the LEDs didn’t light up. Also the wires look really messy, but I plant to sort that out after it all works!!
#DevLog_2 All wiring is complete!! I also added a push button so people can change that mode with a button. This also makes it interactive as it requires user input. I also worked on some code example for each mode.
#DevLog_3 Working on the hardware elements. Putting all the components on a bread board and wiring it up. Also worked on some test code, just to check that my wiring was correct and the LEDs turned on when the button was pressed...
|
1793224169.8026607
|
1793828969.8026607
|
|
13643
|
imposterGame by @catlover125r | Stardance
|
catlover125r
|
1
|
1.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T21:06:57Z", "hours": 1.0, "multiplier": 2.87, "payout": 3, "blessing": "neutral", "text": "I made a fun interactive game where you can play the viral imposter game with your friends online or on one device", "repo": "https://github.com/catlover125r/imposterGame", "demo": "https://secretimposter.com/"}]...
|
[{"post_id": 5254, "ts": "2026 [{"post_id": 5254, "ts": "2026-06-08T23:30:15Z", "hours": 0.8872, "text": "THE SITE IS LIVE. Go play now!"}]...
|
Title: imposterGame by @catlover125r | Stardance
Title: imposterGame by @catlover125r | Stardance
Devlogs:
THE SITE IS LIVE. Go play now!
Ships:
I made a fun interactive game where you can play the viral imposter game with your friends online or on one device...
|
1793476574.9488404
|
1793562974.9488404
|
|
13644
|
My first slack bot! by @Honque | Stardance
|
Honque
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Honque | Stardance
|
1793458539.0262234
|
1794063339.0262234
|
|
13645
|
Top Chatter - a discord bot by @muhamm38 | Stardan Top Chatter - a discord bot by @muhamm38 | Stardance...
|
muhamm38
|
1
|
7.0
|
52
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-08T19:48:44Z", "hours": 7.0, "multiplier": 7.76, "payout": 52, "blessing": "neutral", "text": "I made Top Chatter , a discord bot that tracks message data on servers and ranks people by who talks the most in the server. It has multiple commands so you can see who talked the most throughout different time periods. You can see in the last month, last week, last day, and all time who has the most messages. It is running Python using the discord.py library. It uses a sqlite3 database to store messages so the commands can run instantly. Instead of using Discord API’s to scrape the messages which takes very long and can crash easily, I made it so when the bot joins the server it sends a dm to the owner asking permission to scan the entire server for its previous message data, then it adds it to its database. If for some reason the dm isn’t sent (bot is offline or owner’s dms are closed) if you try to do a command like /all-time it tells you the bot has not scanned the past messages and you need to have an admin do the /setup command to have it get all the previous message data. Challenges Some challenges I went through were these: Transition to database storage. Initially every command was using discord apis to get the message data and display them in a leaderboard, that took very long and crashed very often. To solve this I switched to using a local sqlite3 database. When building the feature to scan old messages, the bot was accidentally wiping out data from previous channels as it moved to the next one. I had to completely rewrite the logic so the bot compiled everything across the entire server into a Python tracking dictionary first, and then saved it all to the database at the very end. Deploying the server had some issues but with the help of AI (yes I know ai everyone hates it but I had too) I was able to figure it out and get it hoted. How to Test Click the link to invite the bot to a discord server. If you are the owner it should dm you and then click the setup button to get it setup. 2.5 If owner has dm’s closed or isn’t responding to it, if you’re an admin, run the /setup command to set it up manually Type / to see the full UI menu of commands, ranging from /last-100-messages to /all-time, enjoy!", "repo": "https://github.com/iloveallah123/top-chatter-discord-bot", "demo": "https://discord.gg/g87c4mmTg"}]...
|
[{"post_id": 24907, "ts": "202 [{"post_id": 24907, "ts": "2026-07-08T19:34:07Z", "hours": 1.9919, "text": "Devlog 4 I finally moved all the time-based commands like /last-hour , /last-day , and /last-week to pull directly from the SQLite database instead of using the discord api to scrape thousands of messages. This makes the bot way faster and more reliable since it doesn’t have to calculate everything on the fly anymore. I was also able to add a brand new /last-month command. I also worked on polishing the experience and making the initial message scanning easier. Sometimes server owners have their DMs closed, so the bot would fail to send the automatic setup button when it joined. To fix this, I added a manual /setup command. Now, if the bot misses the DM, someone can just run the command themselves to start the background scan. It makes the onboarding process a lot smoother and prevents the bot from getting stuck. I finally got the bot hosted on a server! I moved it off my local computer and onto Hack Club Nest. I used PM2 to keep it running in the background permanently. This will probably be my final devlog as to be honest I’ve accomplished everything I wanted to with this bot and I feel very good about it because it has 1 core purpose and it does that purpose very well. I want to move on to other projects so I will probably ship it. If you want to try the bot out for yourself and add it to your server you can use this link: ( https://discord.com/oauth2/authorize?client_id=1514369908085887037&permissions=8&integration_type=0&scope=bot+applications.commands )"}, {"post_id": 23110, "ts": "2026-07-05T21:19:15Z", "hours": 1.8086, "text": "Devlog 3: I’ve made a lot of progress on the bot and changed how it tracks server activity and message data! I moved the bot away from using the Discord API to scrape the data because that took way too long and wasn’t efficient. For the all-time command, it now dms the owner of the server to ask them for permission to get the data from the server (using discord api) then it adds that data into an sqlite database. I set up an automatic table layout that tracks users by their permanent Discord user_id rather than their display name. This completely prevents leaderboard tracking bugs if a user decides to change their server nickname. Next, I added into the real-time event system. The bot now logs and adds to message counts instantly as they are sent in real-time, meaning we don’t have to wait for slow api scrapes anymore. I also updated the /all-time command to pull directly from this local database instantly. I might update the other commands but for now its just using the discord api. To make the system scaleable, I added a full-server data sync. When the bot joins a new server, it sends a DM to the owner with a green setup button. Clicking it runs a background scan across all text channels to build the database. I ran into two big bugs while setting this up: The bot was accidentally wiping out data from previous channels as it moved to the next one. I fixed this by making the bot compile everything across the entire server into a tracking dictionary first, and then saving it all to the database at the very end. I had to restructure the database schema to use a combined primary key of (guild_id, user_id). This keeps counts completely isolated so a user’s stats on one server never leak into another server. Lastly, I added stats.db to the .gitignore file so it isn’t committed to github. Next steps: I might just ship it with these core features (definitely not for a sticker or anything 😂 🙏) I will try and continue to work on it and somehow find away to integrate VC support. This would need me to: Build a VC tracking system to see who spends the most time in voice channels over days, weeks, and all-time. I might also in the future update the leaderboard messages from the commands to have embeds so it looks cleaner and more professional using discord embeds. Thank you for reading my 3rd devlog! Edit: OH YEAH I just remembered I’m gonna host it on a server so I don’t need it running locally all the time."}, {"post_id": 11381, "ts": "2026-06-18T16:57:56Z", "hours": 1.6392, "text": "Devlog 2: I finally finished adding the core message tracking features! I made some slash commands that let users track the top chatters over different time periods. I created the /last-hour , /last-day , and /last-week commands. I used Python’s datetime module to calculate an exact time period and then look back through the channel history to count up the messages. I also added a defer() function to each command so the bot can safely process the data without timing out or breaking. When implementing the /all-time command, I realized that downloading every single message ever sent could easily crash the bot. To fix this, I built a custom warning button using. Now, the bot sends a warning message with a Confirm & Run button, and it will only start the process if a user explicitly clicks it. I ran into a frustrating issue with Git where my .env file kept getting included in my commits even though it was listed in my .gitignore . I learned that because Git tracked the file early on, it was ignoring the ignore rules. I used the terminal to untrack it and was able to keep it ignored. Next I will be working on moving the bot away from API scraping and into local storage. I will be working on the following thiings: Setting up a SQLite database within the project. Logging and counting messages in real-time as they are sent. Rewriting the leaderboard commands to pull from the database instead of loading history from discord APIs. Thank you for reading my 2nd devlog!"}, {"post_id": 9000, "ts": "2026-06-15T00:18:52Z", "hours": 1.2375, "text": "Devlog 1: I was able to get the discord bot online and running! Set up the basic framework using Python and the discord.py library. I got it connected to discord and online and made it print a confirmation message to terminal when it’s online. I also used canva to make some custom art for the discord profile picture and the banner to make it look more professional and give it some personality. I ran into some SSL certificate verification errors when running the bot which was annoying to debug and fix. I used Github Copilot to help me debug and solve the issues and I figured out that I had to point Python to the certifi certificate bundle. Once I restarted and ran it again, the bot connected successfully. Next I will be working on the core features of the bot which are: A command that lets you see who has the most messages in a server within the last day. A command for most within the last week. A command for most messages all time in the server. These are the core basic features I plan to implement, I have other ideas like commands to see who spent time in vc (voice chat) in the same pattern as the messages commands and more things like that. Thank you for reading my 1st devlog!"}]...
|
Title: Top Chatter - a discord bot by @muhamm38 | Title: Top Chatter - a discord bot by @muhamm38 | Stardance
Devlogs:
Devlog 1: I was able to get the discord bot online and running! Set up the basic framework using Python and the discord.py library. I got it connected to discord and online and made it print a confirmation message to terminal when it’s online. I also used canva to make some custom art for the discord profile picture and the banner to make it look more professional and give it some personality. I ran into some SSL certificate verification errors when running the bot which was annoying to debug and fix. I used Github Copilot to help me debug and solve the issues and I figured out that I had to point Python to the certifi certificate bundle. Once I restarted and ran it again, the bot connected successfully. Next I will be working on the core features of the bot which are: A command that lets you see who has the most messages in a server within the last day. A command for most within the last week. A command for most messages all time in the server. These are the core basic features I plan to implement, I have other ideas like commands to see who spent time in vc (voice chat) in the same pattern as the messages commands and more things like that. Thank you for reading my 1st devlog!
Devlog 2: I finally finished adding the core message tracking features! I made some slash commands that let users track the top chatters over different time periods. I created the /last-hour , /last-day , and /last-week commands. I used Python’s datetime module to calculate an exact time period and then look back through the channel history to count up the messages. I also added a defer() function to each command so the bot can safely process the data without timing out or breaking. When implementing the /all-time command, I realized that downloading every single message ever sent could easily crash the bot. To fix this, I built a custom warning button using. Now, the bot sends a warning message with a Confirm & Run button, and it will only start the process if a user explicitly clicks it. I ran into a frustrating issue with Git where my .env file kept getting included in my commits even though it was listed in my .gitignore . I learned that because Git tracked the file early on, it was ignoring the ignore rules. I used the terminal to untrack it and was able to keep it ignored. Next I will be working on moving the bot away from API scraping and into local storage. I will be working on the following thiings: Setting up a SQLite database within the project. Logging and counting messages in real-time as they are sent. Rewriting the leaderboard commands to pull from the database instead of loading history from discord APIs. Thank you for reading my 2nd devlog!
Devlog 3: I’ve made a lot of progress on the bot and changed how it tracks server activity and message data! I moved the bot away from using the Discord API to scrape the data because that took way too long and wasn’t efficient. For the all-time command, it now dms the owner of the server to ask them for permission to get the data from the server (using discord api) then it adds that data into an sqlite database. I set up an automatic table layout that tracks users by their permanent Discord user_id rather than their display name. This completely prevents leaderboard tracking bugs if a user decides to change their server nickname. Next, I added into the real-time event system. The bot now logs and adds to message counts instantly as they are sent in real-time, meaning we don’t have to wait for slow api scrapes anymore. I also updated the /all-time command to pull directly from this local database instantly. I might update the other commands but for now its just using the discord api. To make the system scaleable, I added a full-server data sync. When the bot joins a new server, it sends a DM to the owner with a green setup button. Clicking it runs a background scan across all text channels to build the database. I ran into two big bugs while setting this up: The bot was accidentally wiping out data from previous channels as it moved to the next one. I fixed this by making the bot compile everything across the entire server into a tracking dictionary first, and then saving it all to the database at the very end. I had to restructure the database schema to use a combined primary key of (guild_id, user_id). This keeps counts completely isolated so a user’s stats on one server never leak into another server. Lastly, I added stats.db to the .gitignore file so it isn’t committed to github. Next steps: I might just ship it with these core features (definitely not for a sticker or anything 😂 🙏) I will try and continue to work on it and somehow find away to integrate VC support. This would need me to: Build a VC tracking system to see who spends the most time in voice channels over days, weeks, and all-time. I might also in the future update the leaderboard messages from the commands to have embeds so it looks cleaner and more professional using discord embeds. Thank you for reading my 3rd devlog! Edit: OH YEAH I just remembered I’m gonna host it on a server so I don’t need it running locally all the time.
Devlog 4 I finally moved all the time-based commands like /last-hour , /last-day , and /last-week to pull directly from the SQLite database instead of using the discord api to scrape thousands of messages. This makes the bot way faster and more reliable since it doesn’t have to calculate everything on the fly anymore. I was also able to add a brand new /last-month command. I also worked on polishing the experience and making the initial message scanning easier. Sometimes server owners have their DMs closed, so the bot would fail to send the automatic setup button when it joined. To fix this, I added a manual /setup command. Now, if the bot misses the DM, someone can just run the command themselves to start the background scan. It makes the onboarding process a lot smoother and prevents the bot from getting stuck. I finally got the bot hosted on a server! I moved it off my local computer and onto Hack Club Nest. I used PM2 to keep it running in the background permanently. This will probably be my final devlog as to be honest I’ve accomplished everything I wanted to with this bot and I feel very good about it because it has 1 core purpose and it does that purpose very well. I want to move on to other projects so I will probably ship it. If you want to try the bot out for yourself and add it to your server you can use this link: ( https://discord.com/oauth2/authorize?client_id=1514369908085887037&permissions=8&integration_type=0&scope=bot+applications.commands )
Ships:
I made Top Chatter , a discord bot that tracks message data on servers and ranks people by who talks the most in the server. It has multiple commands so you can see who talked the most throughout different time periods. You can see in the last month, last week, last day, and all time who has the most messages. It is running Python using the discord.py library. It uses a sqlite3 database to store messages so the commands can run instantly. Instead of using Discord API’s to scrape the messages which takes very long and can crash easily, I made it so when the bot joins the server it sends a dm to the owner asking permission to scan the entire server for its previous message data, then it adds it to its database. If for some reason the dm isn’t sent (bot is offline or owner’s dms are closed) if you try to do a command like /all-time it tells you the bot has not scanned the past messages and you need to have an admin do the /setup command to have it get all the previous message data. Challenges Some challenges I went through were these: Transition to database storage. Initially every command was using discord apis to get the message data and display them in a leaderboard, that took very long and crashed very often. To solve this I switched to using a local sqlite3 database. When building the feature to scan old messages, the bot was accidentally wiping out data from previous channels as it moved to the next one. I had to completely rewrite the logic so the bot compiled everything across the entire server into a Python tracking dictionary first, and then saved it all to the database at the very end. Deploying the server had some issues but with the help of AI (yes I know ai everyone hates it but I had too) I was able to figure it out and get it hoted. How to Test Click the link to invite the bot to a discord server. If you are the owner it should dm you and then click the setup button to get it setup. 2.5 If owner has dm’s closed or isn’t responding to it, if you’re an admin, run the /setup command to set it up manually Type / to see the full UI menu of commands, ranging from /last-100-messages to /all-time, enjoy!...
|
1793537708.178301
|
1793624108.178301
|
|
13646
|
DuckyWOS by @ZiggyZonko | Stardance
|
ZiggyZonko
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: DuckyWOS by @ZiggyZonko | Stardance
|
1793505223.069731
|
1794110023.069731
|
|
13647
|
My awesome macropad! by @Ally | Stardance
|
Ally
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Ally | Stardance
|
1793213714.8075504
|
1793818514.8075504
|
|
13648
|
Untitled by @Willgob | Stardance
|
Willgob
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Willgob | Stardance
|
1793353862.391307
|
1793958662.391307
|
|
13649
|
NeptoPad by @Calbe | Stardance
|
Calbe
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: NeptoPad by @Calbe | Stardance
|
1793501297.3028948
|
1794106097.3028948
|
|
13650
|
My very own WebOS by @BoltyPlays | Stardance
|
BoltyPlays
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @BoltyPlays | Stardanc Title: My very own WebOS by @BoltyPlays | Stardance...
|
1793361001.0320637
|
1793965801.0320637
|