|
13651
|
Ladybug by @miles | Stardance
|
miles
|
0
|
2.24
|
0
|
[]
|
[{"post_id": 5854, "ts": "2026 [{"post_id": 5854, "ts": "2026-06-09T20:01:44Z", "hours": 0.6953, "text": "Did some outlining of the code, as well as got very frustrated at vercel!"}, {"post_id": 5665, "ts": "2026-06-09T15:21:41Z", "hours": 1.54, "text": "Devlog features: Captcha start with loading symbol Some slight node.js so far for getting pictures from unsplash"}]...
|
Title: Ladybug by @miles | Stardance
Devlogs:
Dev Title: Ladybug by @miles | Stardance
Devlogs:
Devlog features: Captcha start with loading symbol Some slight node.js so far for getting pictures from unsplash
Did some outlining of the code, as well as got very frustrated at vercel!...
|
1793425933.1259685
|
1794030733.1259685
|
|
13652
|
My first slack bot! by @QibliTheDragon | Stardance
|
QibliTheDragon
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @QibliTheDragon | St Title: My first slack bot! by @QibliTheDragon | Stardance...
|
1793249514.7429695
|
1793854314.7429695
|
|
13653
|
Untitled project by @barnacle20 | Stardance
|
barnacle20
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @barnacle20 | Stardance
|
1793436890.432722
|
1794041690.432722
|
|
13654
|
My awesome macropad! by @Beye | Stardance
|
Beye
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Beye | Stardance
|
1793490708.3167334
|
1794095508.3167334
|
|
13655
|
My awesome macropad! by @Fiwa | Stardance
|
Fiwa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Fiwa | Stardance
|
1793443773.3660274
|
1794048573.3660274
|
|
13656
|
Self Tutor by @Minnow_brained | Stardance
|
Minnow_brained
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Self Tutor by @Minnow_brained | Stardance
|
1793526904.7951884
|
1794131704.7951884
|
|
13657
|
TonalliOS by @Alan | Stardance
|
Alan
|
0
|
5.15
|
0
|
[]
|
[{"post_id": 13540, "ts": "202 [{"post_id": 13540, "ts": "2026-06-22T04:49:10Z", "hours": 1.2256, "text": "What is up my fellow awesomesauce stardancers. So, I’ve been working on this thing for a while now, and I simply just forgot to post a devlog for it. I got the hang of how to use the curses library in python, so I was able to create this UI, which in its own is based around an old bulletin board systems kinda vibe. Really interesting to research and learn how to use. Right now the UI doesn’t do anything, just buttons that say “launching x”, so now I’m going to be focusing on implementing some action for each of the buttons. Furthermore, the fake boot sequence is more refined and uses a print and delete loop to create the effect of the “press Enter to continue”. It’s worth noting that the logo is not centered “in” the center of the screen, so I’m gonna try and fix that for the next devlog."}, {"post_id": 8364, "ts": "2026-06-13T22:06:30Z", "hours": 3.9294, "text": "Oh wow, my first devlog. Cool. So, I’ve had this idea in my mind for a while of building my own cyberdeck. I wanted something simple. Like, just a Pi connected to a monitor in a basic case, enough to scratch the itch. But then I kept adding ideas on top of ideas, until eventually I thought: what if I just built a Python program that made the terminal look and feel like a fake operating system? And thats when TonalliOS was created, or, at least, that’s what I want it to be. Right now it’s nothing really, but I plan to keep expanding it with cool stuff like a weather app, a news reader, and even a local AI chatbot if the Pi I end up getting can handle it. We’ll see. The name comes from wanting to connect this project to my country, México, and to the color of the terminal itself, which is this warm amber that everything is written in. Tonalli is a word from Nahuatl, which is a language that dates back to around 2000 B.C. and is still spoken today by over a million people in México. Like a lot of Nahuatl words, Tonalli carries more than one meaning depending on context. But, the one that really tied the name together was this one: “The tonalli was a sort of soul, located in the crown of the head, that regulated body temperature and growth and played a major role in determining a person’s character and fate. Tonalli loss resulted in illness and, if healing ceremonies were not performed, death.” In simpler terms, Tonalli was the flame inside a person. A solar-driven life force that gave them vitality, and, in a way, I liked that concept. An OS named after something that keeps you alive, running warm, glowing amber. Something that fades and cools off when you shut it down, like, let’s say, i don’t know… a computer? So, now that the lore behind the name was cleared up, now it’s time to get into what I actually built this week, which it’s basically just a wall of fake system messages that scroll rapidly before the OS loads, ending with a blinking “Press ENTER to continue” prompt. When you do, the screen clears and the TonalliOS logo reveals itself line by line before a progress bar loads the launcher. Really simple. It actually took me more time to figure out what I wanted to name the program than to build it. Fun fact: Tonalli’s Aztec visual lexicon is a star, which directly ties to it’s more literal meaning, the sun. So for them, in a way, the sun was the thing that gave you power and vitality. So maybe, adding a couple solar panels to the eventual cyberdeck build wouldn’t be so bad of an idea…"}]...
|
Title: TonalliOS by @Alan | Stardance
Devlogs:
Oh Title: TonalliOS by @Alan | Stardance
Devlogs:
Oh wow, my first devlog. Cool. So, I’ve had this idea in my mind for a while of building my own cyberdeck. I wanted something simple. Like, just a Pi connected to a monitor in a basic case, enough to scratch the itch. But then I kept adding ideas on top of ideas, until eventually I thought: what if I just built a Python program that made the terminal look and feel like a fake operating system? And thats when TonalliOS was created, or, at least, that’s what I want it to be. Right now it’s nothing really, but I plan to keep expanding it with cool stuff like a weather app, a news reader, and even a local AI chatbot if the Pi I end up getting can handle it. We’ll see. The name comes from wanting to connect this project to my country, México, and to the color of the terminal itself, which is this warm amber that everything is written in. Tonalli is a word from Nahuatl, which is a language that dates back to around 2000 B.C. and is still spoken today by over a million people in México. Like a lot of Nahuatl words, Tonalli carries more than one meaning depending on context. But, the one that really tied the name together was this one: “The tonalli was a sort of soul, located in the crown of the head, that regulated body temperature and growth and played a major role in determining a person’s character and fate. Tonalli loss resulted in illness and, if healing ceremonies were not performed, death.” In simpler terms, Tonalli was the flame inside a person. A solar-driven life force that gave them vitality, and, in a way, I liked that concept. An OS named after something that keeps you alive, running warm, glowing amber. Something that fades and cools off when you shut it down, like, let’s say, i don’t know… a computer? So, now that the lore behind the name was cleared up, now it’s time to get into what I actually built this week, which it’s basically just a wall of fake system messages that scroll rapidly before the OS loads, ending with a blinking “Press ENTER to continue” prompt. When you do, the screen clears and the TonalliOS logo reveals itself line by line before a progress bar loads the launcher. Really simple. It actually took me more time to figure out what I wanted to name the program than to build it. Fun fact: Tonalli’s Aztec visual lexicon is a star, which directly ties to it’s more literal meaning, the sun. So for them, in a way, the sun was the thing that gave you power and vitality. So maybe, adding a couple solar panels to the eventual cyberdeck build wouldn’t be so bad of an idea…
What is up my fellow awesomesauce stardancers. So, I’ve been working on this thing for a while now, and I simply just forgot to post a devlog for it. I got the hang of how to use the curses library in python, so I was able to create this UI, which in its own is based around an old bulletin board systems kinda vibe. Really interesting to research and learn how to use. Right now the UI doesn’t do anything, just buttons that say “launching x”, so now I’m going to be focusing on implementing some action for each of the buttons. Furthermore, the fake boot sequence is more refined and uses a print and delete loop to create the effect of the “press Enter to continue”. It’s worth noting that the logo is not centered “in” the center of the screen, so I’m gonna try and fix that for the next devlog....
|
1793494506.081799
|
1794099306.081799
|
|
13658
|
My awesome macropad! by @Beye123 | Stardance
|
Beye123
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Beye123 | Stardanc Title: My awesome macropad! by @Beye123 | Stardance...
|
1793526871.690325
|
1794131671.690325
|
|
13659
|
the designers macropad! by @Carson | Stardance
|
Carson
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: the designers macropad! by @Carson | Starda Title: the designers macropad! by @Carson | Stardance...
|
1792918079.4707272
|
1793782079.4707272
|
|
13660
|
WorldPlane by @world | Stardance
|
world
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: WorldPlane by @world | Stardance
|
1793447666.003601
|
1794052466.003601
|
|
13661
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943442.4647043
|
1793807442.4647043
|
|
13662
|
My awesome macropad! by @mysmic | Stardance
|
mysmic
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @mysmic | Stardance
|
1793249703.2171373
|
1793854503.2171373
|
|
13663
|
Code Art Studio by @aminrabhi | Stardance
|
aminrabhi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Code Art Studio by @aminrabhi | Stardance
|
1793364579.1202033
|
1793969379.1202033
|
|
13664
|
The Void by @Alan | Stardance
|
Alan
|
1
|
11.0
|
137
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-24T00:47:03Z", "hours": 11.0, "multiplier": 16.35, "payout": 137, "blessing": "neutral", "text": "What did I make? The Void is an anonymous thought delivery system for Stardancers. You write something, once a day, and it gets delivered to a random Stardancer somewhere. They can dissolve it forever or release it back into the void for someone else to find. No names, no likes, no algorithm. Just thoughts drifting between strangers. It has a WebGL vortex shader background, HCA login so only real Stardancers can enter, AI content moderation through Groq, and a full delivery system backed by Supabase. What was challenging? Honestly, almost everything on the backend. OAuth flows are really painful, specially when there’s like 0 documentation for how to actually use them, or atleast on my. case. Getting HCA login to work across three different URLs (the main site, the callback page, and a Vercel serverless function) took longer than building the entire frontend. CORS errors, mismatched redirect URIs, req.body being undefined for no obvious reason, a Groq model getting decommissioned mid-development. Honestly, The hardest parts where the ones where I eventually gave up and recurred to the usage of AI. It’s not really a bad thing in my opinion. People think it’s wrong to use it, but how I see it is, if you can understand your code, but you need help fix it, but there is no one available to help you with it, just use AI to understand and fix it. It is a tool for your mind, not a replacement. What am I proud of? The moment it actually worked end to end for the first time. I sent a thought from one account, opened another window as a second account, clicked “[ void speaks ]”, and saw my own words appear on screen in the color I had chosen. That moment felt like something. The vortex shader is also something I’m genuinely proud of. I had never touched WebGL or GLSL before this project and learned it from scratch specifically for this, so I feel like it’s really neat how after all this time, it has been put together in a rough beta really nice. What should people know to test it? Go to https://the-void-dusky.vercel.app and log in with your Hack Club account. Give yourself a name and pick a color. Write something true and hit release. Then come back tomorrow. If other Stardancers are using it, something will drift your way eventually. The void speaks button appears in the bottom right corner when you have a pending thought. Check back. It might take a little while for the void to find you. Honestly, I just can’t believe how this project turned out. Well, the beta at least. There is still tons of work to do. Polishing is now the only thing between the beta, and the good first public release. I plan to run the project up until the end of the event, and then in the Slack maybe even make a post with the top leaderboard of the thoughts with the highest released count, who knows!", "repo": "https://github.com/Just-Alan/The-Void", "demo": "https://the-void-dusky.vercel.app"}]...
|
[{"post_id": 33793, "ts": "202 [{"post_id": 33793, "ts": "2026-07-24T00:16:13Z", "hours": 2.1767, "text": "devlog #6 of The Void: NO WAY IT WORKS Hello, Stardancers. I’m sure the three or four people following this project will be very glad to know that, as of today July 23rd, The Void is officially open to beta!!!!!!! It’s a rough draft of the eventual thing. Missing art, sound, music, and basically everything that would make it feel polished. But right now, with this build, it is everything I could have asked for and more. So now, what was so revolucionary that it finally is on a beta status? On a very short tl;dr, the thought and delivery system finally came to life. The gist of it is as follows. You open The Void. You type something, anything, what’s weighing on you, what you can’t say out loud, whatever. You hit release. It drifts into the database, tagged with the color you chose when you first arrived. Somewhere, another Stardancer opens The Void. A small button appears in the corner of their screen. “[ void speaks ]”. They click it. Your words materialize on their screen, glowing in your color. They have two choices: dissolve it forever, or release it back into the void for someone else to find. That’s it. That’s the whole thing. And it’s so awesomesauce omg. what is happening behind the scenes: The moderation system runs every thought through Groq’s AI before it reaches anyone. If it contains hate speech or harmful content, the void rejects it. It took an embarrassingly long time to get working, mostly because the model I was using got decommissioned mid-development and nobody told me. The delivery system picks a random Stardancer from the database every time a thought is released. If they release it again, it goes to someone new. A thought that keeps getting released glows a little brighter every time, though most people won’t notice that yet. So… what’s next? Well, really glad you asked random person idk anything about! What I’m planning for the roadwork ahead is to add sound design, some visual polish, and Supabase Realtime so you actually get notified when a thought arrives without having to refresh. I just can’t believe that this idea is finally coming to life. I’ve been wanting to make it for a while, but between some complications and going to places with no way of working in, I took a long 21 day break. But now, finally, I’m ready to make my actual first project and ship it!"}, {"post_id": 20082, "ts": "2026-07-01T16:30:57Z", "hours": 2.4047, "text": "devlog #5 of The Void She star on my dance till I say hello everyone new devlog woo. Ok, so the flow of how the void works has now been updated! To keep things short, I will assume that the other devlog has already been read, and I will just add on on the new stuff. But, for a really basic tl;dr: When you press enter, the void opens the HCA login website, where you… well login. This is to both keep track of the users in the users table of data, and to know if you are a certified Stardancer™ or not. Then, it’ll promptly take you to the callback site, where it uses a code that the HCA gives in order to identify you. If succesful, the page will say “the void recognizes you” as per the video, and you will log into the void. If not, it will say “something went wrong. the void rejects you.” Simple enough. Now onto the new stuff that was added: When the callback website successfully registers your HCA code, it will take you back to The Void, now new stuff appears. You are able to choose your name, 6 characters only, and your thought color, which will be the color that your… well thoughts are in. Really self explanatory. All that info is saved in the Supabase table of users, just for a more simpler way of being able to save all the data. Now, whenever you enter the main site, it’ll check if you are already logged in. If you are, you will automatically be thrown into the main page of the void (which is the one that just says phase 5 coming soon for now). So, to summarize the technical side of stuff about what everything is doing so far: The Void itself runs on HTML, CSS and JS. Supabase is used for the database. Vercel is used for its serverless functions for the auth backend. And finally, HCA (Hack Club Auth) api is used for the login. And that’s all folks. Honestly, all of this was more easily said than done. I spent like at least 40 minutes trying to fix the connection issues between the sites. But, in the end, it worked as intended, and that’s the best I can hope for. As of moving forward, the next phase will definitely be the hardest one, which is to make the entire thought and delivery system as well as finding a way of testing it with another person. So, yeah thats cool. If anyone is reading to the bottom of this, and is cool with testing, stay updated for the next devlog where I think I will finally be able to post and ship the beta of The Void! Sleep tight everyone, don’t let the bed bugs bite."}, {"post_id": 15969, "ts": "2026-06-25T22:43:30Z", "hours": 2.1331, "text": "The voices in my head say hi stardancers. So, this is kind of a big one. Basically, the hardest problem right now was understanding how to use the HCA (Hack Club Auth) to make it so that the website recognizes that you are indeed a Stardance member. To basically skip all the hassle, it works like this: The moment you press enter, the button opens the HCA website. In my case, I was already logged in, but in browsers without a yet known Hack Club acc it will prompt to log in and use the verification code and what not. Then, when you do all that, it goes to the window in the video, where it tells you if you are sure to give that info to the website. What the website does with said info is it sends you to a callback website with a temporary code in the URL. Then, it sends said code to HCA, where it gives back a verification code that this user is indeed a hackclub certified member, more specifically, a Stardance member. After that, it uses that token to ask who is said user, where HCA responds with their ID and verif. status. If the account exist, and it’s a Stardance member, they will be let in. Otherwise, the page says “the void doesn’t recognize you” (I don’t really have a “way” of testing this, so just trust me on this one that it exists). Finally, the website saves said info, and lets you in The Void. That was more easy said than done, but with good work and like 3-4 hours later, it got done. But, on a really bad turn of events, the stardance timer didn’t get all that time, and instead logged in 2 hours only. But, it ain’t about the time spent (It actually is but what can i do honestly), but about it working, and if it works, then that’s a job well done (I guess). Oh yeah I forgot but I switched from github Pages to Vercel in order to hide my Client Secret from being pushed into the repo, which I… almost did. Like 3 times. Don’t forget to like and subscribe for future devlongs."}, {"post_id": 14474, "ts": "2026-06-23T16:36:34Z", "hours": 0.9419, "text": "What’s cooking my stardancers. I was able to put the vortex shader on the main file, so now the background for The Void is basically complete! Pure frontend as of now, so now I think it’s time to finally start working on the actual website instead of js vibes."}, {"post_id": 13544, "ts": "2026-06-22T05:05:33Z", "hours": 0.4189, "text": "Hi hello hi stardancers. Just made a very simple text sequence in a div with a button that does nothing at the bottom, nothing too fancy really. I’m just trying to get ideas captured instead of writing since I don’t really remember most of the time I write stuff? This is theorically just the intro the user would see only the first time they enter The Void. And, it’s still missing the sort of space vortex shader on the background, which I am learning to make as we speak."}, {"post_id": 11535, "ts": "2026-06-18T20:40:56Z", "hours": 2.5614, "text": "So, I had a thought. Started really simple with a small idea of making a way for people to talk with each other, but as it has developed, it has become more and more interesting and intricate. There isn’t much yet, just wanted to get an early devlog, so enjoy this simple particle code as the project goes on."}]...
|
Title: The Void by @Alan | Stardance
Devlogs:
So, Title: The Void by @Alan | Stardance
Devlogs:
So, I had a thought. Started really simple with a small idea of making a way for people to talk with each other, but as it has developed, it has become more and more interesting and intricate. There isn’t much yet, just wanted to get an early devlog, so enjoy this simple particle code as the project goes on.
Hi hello hi stardancers. Just made a very simple text sequence in a div with a button that does nothing at the bottom, nothing too fancy really. I’m just trying to get ideas captured instead of writing since I don’t really remember most of the time I write stuff? This is theorically just the intro the user would see only the first time they enter The Void. And, it’s still missing the sort of space vortex shader on the background, which I am learning to make as we speak.
What’s cooking my stardancers. I was able to put the vortex shader on the main file, so now the background for The Void is basically complete! Pure frontend as of now, so now I think it’s time to finally start working on the actual website instead of js vibes.
The voices in my head say hi stardancers. So, this is kind of a big one. Basically, the hardest problem right now was understanding how to use the HCA (Hack Club Auth) to make it so that the website recognizes that you are indeed a Stardance member. To basically skip all the hassle, it works like this: The moment you press enter, the button opens the HCA website. In my case, I was already logged in, but in browsers without a yet known Hack Club acc it will prompt to log in and use the verification code and what not. Then, when you do all that, it goes to the window in the video, where it tells you if you are sure to give that info to the website. What the website does with said info is it sends you to a callback website with a temporary code in the URL. Then, it sends said code to HCA, where it gives back a verification code that this user is indeed a hackclub certified member, more specifically, a Stardance member. After that, it uses that token to ask who is said user, where HCA responds with their ID and verif. status. If the account exist, and it’s a Stardance member, they will be let in. Otherwise, the page says “the void doesn’t recognize you” (I don’t really have a “way” of testing this, so just trust me on this one that it exists). Finally, the website saves said info, and lets you in The Void. That was more easy said than done, but with good work and like 3-4 hours later, it got done. But, on a really bad turn of events, the stardance timer didn’t get all that time, and instead logged in 2 hours only. But, it ain’t about the time spent (It actually is but what can i do honestly), but about it working, and if it works, then that’s a job well done (I guess). Oh yeah I forgot but I switched from github Pages to Vercel in order to hide my Client Secret from being pushed into the repo, which I… almost did. Like 3 times. Don’t forget to like and subscribe for future devlongs.
devlog #5 of The Void She star on my dance till I say hello everyone new devlog woo. Ok, so the flow of how the void works has now been updated! To keep things short, I will assume that the other devlog has already been read, and I will just add on on the new stuff. But, for a really basic tl;dr: When you press enter, the void opens the HCA login website, where you… well login. This is to both keep track of the users in the users table of data, and to know if you are a certified Stardancer™ or not. Then, it’ll promptly take you to the callback site, where it uses a code that the HCA gives in order to identify you. If succesful, the page will say “the void recognizes you” as per the video, and you will log into the void. If not, it will say “something went wrong. the void rejects you.” Simple enough. Now onto the new stuff that was added: When the callback website successfully registers your HCA code, it will take you back to The Void, now new stuff appears. You are able to choose your name, 6 characters only, and your thought color, which will be the color that your… well thoughts are in. Really self explanatory. All that info is saved in the Supabase table of users, just for a more simpler way of being able to save all the data. Now, whenever you enter the main site, it’ll check if you are already logged in. If you are, you will automatically be thrown into the main page of the void (which is the one that just says phase 5 coming soon for now). So, to summarize the technical side of stuff about what everything is doing so far: The Void itself runs on HTML, CSS and JS. Supabase is used for the database. Vercel is used for its serverless functions for the auth backend. And finally, HCA (Hack Club Auth) api is used for the login. And that’s all folks. Honestly, all of this was more easily said than done. I spent like at least 40 minutes trying to fix the connection issues between the sites. But, in the end, it worked as intended, and that’s the best I can hope for. As of moving forward, the next phase will definitely be the hardest one, which is to make the entire thought and delivery system as well as finding a way of testing it with another person. So, yeah thats cool. If anyone is reading to the bottom of this, and is cool with testing, stay updated for the next devlog where I think I will finally be able to post and ship the beta of The Void! Sleep tight everyone, don’t let the bed bugs bite.
devlog #6 of The Void: NO WAY IT WORKS Hello, Stardancers. I’m sure the three or four people following this project will be very glad to know that, as of today July 23rd, The Void is officially open to beta!!!!!!! It’s a rough draft of the eventual thing. Missing art, sound, music, and basically everything that would make it feel polished. But right now, with this build, it is everything I could have asked for and more. So now, what was so revolucionary that it finally is on a beta status? On a very short tl;dr, the thought and delivery system finally came to life. The gist of it is as follows. You open The Void. You type something, anything, what’s weighing on you, what you can’t say out loud, whatever. You hit release. It drifts into the database, tagged with the color you chose when you first arrived. Somewhere, another Stardancer opens The Void. A small button appears in the corner of their screen. “[ void speaks ]”. They click it. Your words materialize on their screen, glowing in your color. They have two choices: dissolve it forever, or release it back into the void for someone else to find. That’s it. That’s the whole thing. And it’s so awesomesauce omg. what is happening behind the scenes: The moderation system runs every thought through Groq’s AI before it reaches anyone. If it contains hate speech or harmful content, the void rejects it. It took an embarrassingly long time to get working, mostly because the model I was using got decommissioned mid-development and nobody told me. The delivery system picks a random Stardancer from the database every time a thought is released. If they release it again, it goes to someone new. A thought that keeps getting released glows a little brighter every time, though most people won’t notice that yet. So… what’s next? Well, really glad you asked random person idk anything about! What I’m planning for the roadwork ahead is to add sound design, some visual polish, and Supabase Realtime so you actually get notified when a thought arrives without having to refresh. I just can’t believe that this idea is finally coming to life. I’ve been wanting to make it for a while, but between some complications and going to places with no way of working in, I took a long 21 day break. But now, finally, I’m ready to make my actual first project and ship it!
Ships:
What did I make? The Void is an anonymous thought delivery system for Stardancers. You write something, once a day, and it gets delivered to a random Stardancer somewhere. They can dissolve it forever or release it back into the void for someone else to find. No names, no likes, no algorithm. Just thoughts drifting between strangers. It has a WebGL vortex shader background, HCA login so only real Stardancers can enter, AI content moderation through Groq, and a full delivery system backed by Supabase. What was challenging? Honestly, almost everything on the backend. OAuth flows are really painful, specially when there’s like 0 documentation for how to actually use them, or atleast on my. case. Getting HCA login to work across three different URLs (the main site, the callback page, and a Vercel serverless function) took longer than building the entire frontend. CORS errors, mismatched redirect URIs, req.body being undefined for no obvious reason, a Groq model getting decommissioned mid-development. Honestly, The hardest parts where the ones where I eventually gave up and recurred to the usage of AI. It’s not really a bad thing in my opinion. People think it’s wrong to use it, but how I see it is, if you can understand your code, but you need help fix it, but there is no one available to help you with it, just use AI to understand and fix it. It is a tool for your mind, not a replacement. What am I proud of? The moment it actually worked end to end for the first time. I sent a thought from one account, opened another window as a second account, clicked “[ void speaks ]”, and saw my own words appear on screen in the color I had chosen. That moment felt like something. The vortex shader is also something I’m genuinely proud of. I had never touched WebGL or GLSL before this project and learned it from scratch specifically for this, so I feel like it’s really neat how after all this time, it has been put together in a rough beta really nice. What should people know to test it? Go to https://the-void-dusky.vercel.app and log in with your Hack Club account. Give yourself a name and pick a color. Write something true and hit release. Then come back tomorrow. If other Stardancers are using it, something will drift your way eventually. The void speaks button appears in the bottom right corner when you have a pending thought. Check back. It might take a little while for the void to find you. Honestly, I just can’t believe how this project turned out. Well, the beta at least. There is still tons of work to do. Polishing is now the only thing between the beta, and the good first public release. I plan to run the project up until the end of the event, and then in the Slack maybe even make a post with the top leaderboard of the thoughts with the highest released count, who knows!...
|
1793595457.1947267
|
1793681857.1947267
|
|
13665
|
My very own WebOS by @mattheww | Stardance
|
mattheww
|
0
|
0.28
|
0
|
[]
|
[{"post_id": 5295, "ts": "2026 [{"post_id": 5295, "ts": "2026-06-09T00:48:57Z", "hours": 0.2839, "text": "started testing out random stuff with html lol"}]...
|
Title: My very own WebOS by @mattheww | Stardance
Title: My very own WebOS by @mattheww | Stardance
Devlogs:
started testing out random stuff with html lol...
|
1793393502.745281
|
1793998302.745281
|
|
13666
|
My very own WebOS by @starr | Stardance
|
starr
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T08:09:55Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have finally made my first webOS with a welcome window, notes app and stopwatch app. The most challenging part of this project was learning to use JavaScript and trying to code some of the logic myself (and debugging it too!!).", "repo": "https://github.com/userr73/First-WebOS", "demo": "https://userr73.github.io/First-WebOS/"}]...
|
[{"post_id": 73042, "ts": "202 [{"post_id": 73042, "ts": "2026-09-24T08:07:12Z", "hours": 0.4772, "text": "Made some quick updates to the desktop apps so that is is structured into a grid and also changed some content in the welcome and notes window"}, {"post_id": 71708, "ts": "2026-09-21T10:59:57Z", "hours": 0.9417, "text": "Stopwatch App I found a video tutorial for making a stopwatch in JS. The original vid had three separate buttons for START, STOP and RESET, but I changed this so that the START and STOP button are combined together."}, {"post_id": 68034, "ts": "2026-09-14T12:33:41Z", "hours": 1.1922, "text": "idk - Notes app content update + element exceeding window bug?? I updated the HTML so that I can add content through JavaScript so it does not need to be hard coded into the HTML file. I spent of bit of time debugging this as I couldn’t figure out why some of the content I added to the Notes app was disappearing when I clicked it. Turns out there were a few issues like calling the same function twice, but I also realised I added an event listener that ran the wrong function which was why some of the content was disappearing. Also, I did the ‘additional challenges’ in the guide, mainly the 4th point about the bug where windows can exceed the screen width and height. I used a bit of Gemini here to figure out how to get max and min values from a set of numbers (Maths.min and Maths.max) and also used W3Schools to get the window height and width as well as the div element’s own height and width. Using this, I implemented my own logic (with an if statement) to contain the element within the viewport height and width. This took a tiny bit of trial and error coz I kept getting confused on when to use min and when to use max but I got there eventually"}, {"post_id": 65925, "ts": "2026-09-11T11:55:43Z", "hours": 0.9047, "text": "Update JS code file structure + Creating the Notes app functionality I spent some time updating the structure of my js file by reordering some code and also creating functions for any repeated tasks such as initialising windows. I also worked on my Notes app and played around with some border and outline properties to see what combination of styles would make it easier for users to edit in the app. I ended up with going for a left border indicator type of thing (the colours in the screenshot below aren’t final since I haven’t worked on the overall style of my OS yet so I just went with grey and black)"}, {"post_id": 64728, "ts": "2026-09-09T11:13:39Z", "hours": 0.6311, "text": "Working with z-index Continuing with the guide, I’ve added code that ensures that whenever a window clicks, it rises to the top using the z-index property. I did the same for the top bar. Bugs An issue I faced was when I tried to use the function addWindowTapHandling() for my notes screen but I forgot that I defined the notesScreen variable later on in js file so the notes app disappeared from my OS screen for a bit. I also got really stuck on why my top bar wasn’t rising above the windows so I put my js file into Gemini and I realised it was because I had two openWindow() functions and the second one was the old version that did not have the added lines of code."}, {"post_id": 63485, "ts": "2026-09-07T11:20:20Z", "hours": 1.1106, "text": "Adding my second window I have begun working on my second window which will be a notes app. I continued to follow the guide and created an icon for the app and also a new window for it. It’s mostly taken a while to sort out the js file since I got confused with why the window wasn’t popping up at first (I didn’t name the classes and ids for the divs correctly). Here’s the update:"}, {"post_id": 61460, "ts": "2026-09-04T12:05:06Z", "hours": 2.1317, "text": "Setting up the background, top bar, window So far, I have followed the guide and created the background page with a top bar and created my first welcome page window (the content is random right now - I’ll update this later). The window is also draggable at the handle. I’m still working on what kind of style I want to aim for in my OS… Also, this is kinda my first devlog because I thought my devlogs were broken (turns out I just couldn’t figure out how to use this 💀)"}]...
|
Title: My very own WebOS by @starr | Stardance
De Title: My very own WebOS by @starr | Stardance
Devlogs:
Setting up the background, top bar, window So far, I have followed the guide and created the background page with a top bar and created my first welcome page window (the content is random right now - I’ll update this later). The window is also draggable at the handle. I’m still working on what kind of style I want to aim for in my OS… Also, this is kinda my first devlog because I thought my devlogs were broken (turns out I just couldn’t figure out how to use this 💀)
Adding my second window I have begun working on my second window which will be a notes app. I continued to follow the guide and created an icon for the app and also a new window for it. It’s mostly taken a while to sort out the js file since I got confused with why the window wasn’t popping up at first (I didn’t name the classes and ids for the divs correctly). Here’s the update:
Working with z-index Continuing with the guide, I’ve added code that ensures that whenever a window clicks, it rises to the top using the z-index property. I did the same for the top bar. Bugs An issue I faced was when I tried to use the function addWindowTapHandling() for my notes screen but I forgot that I defined the notesScreen variable later on in js file so the notes app disappeared from my OS screen for a bit. I also got really stuck on why my top bar wasn’t rising above the windows so I put my js file into Gemini and I realised it was because I had two openWindow() functions and the second one was the old version that did not have the added lines of code.
Update JS code file structure + Creating the Notes app functionality I spent some time updating the structure of my js file by reordering some code and also creating functions for any repeated tasks such as initialising windows. I also worked on my Notes app and played around with some border and outline properties to see what combination of styles would make it easier for users to edit in the app. I ended up with going for a left border indicator type of thing (the colours in the screenshot below aren’t final since I haven’t worked on the overall style of my OS yet so I just went with grey and black)
idk - Notes app content update + element exceeding window bug?? I updated the HTML so that I can add content through JavaScript so it does not need to be hard coded into the HTML file. I spent of bit of time debugging this as I couldn’t figure out why some of the content I added to the Notes app was disappearing when I clicked it. Turns out there were a few issues like calling the same function twice, but I also realised I added an event listener that ran the wrong function which was why some of the content was disappearing. Also, I did the ‘additional challenges’ in the guide, mainly the 4th point about the bug where windows can exceed the screen width and height. I used a bit of Gemini here to figure out how to get max and min values from a set of numbers (Maths.min and Maths.max) and also used W3Schools to get the window height and width as well as the div element’s own height and width. Using this, I implemented my own logic (with an if statement) to contain the element within the viewport height and width. This took a tiny bit of trial and error coz I kept getting confused on when to use min and when to use max but I got there eventually
Stopwatch App I found a video tutorial for making a stopwatch in JS. The original vid had three separate buttons for START, STOP and RESET, but I changed this so that the START and STOP button are combined together.
Made some quick updates to the desktop apps so that is is structured into a grid and also changed some content in the welcome and notes window
Ships:
I have finally made my first webOS with a welcome window, notes app and stopwatch app. The most challenging part of this project was learning to use JavaScript and trying to code some of the logic myself (and debugging it too!!)....
|
1793577461.8118844
|
1793663861.8118844
|
|
13667
|
dnp3 Parser and Simulator by @arnabm | Stardance
|
arnabm
|
1
|
104.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-11-01T03:47:21Z", "hours": 104.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? I built a partial implementation of DNP3 in C, along with a TCP client/server simulator and an interactive packet parser. DNP3 is a communication protocol used in SCADA systems, including power utilities and water management. It lets equipment at remote sites send measurements and status information to control centers. The protocol is decades old and widely used, but finding detailed, freely available documentation was surprisingly difficult. My project implements a small subset of it so you can generate data, exchange packets between programs, and inspect what those packets contain. Why was it challenging? The hardest part was turning the protocol’s packet layouts into working C code. DNP3 originated in serial communication, and carrying its frames over TCP meant handling the fact that one network read doesn’t necessarily equal one complete packet. This was also my first big C project. Coming from Java, I had to get comfortable with pointers, manual memory handling, sockets, and the difference between a struct’s layout in memory and the bytes a protocol expects. Struct padding caused a lot more trouble than I expected 😭. I also took a roughly two-month break. Returning to code I’d written while still learning C was a challenge of its own, especially where I hadn’t used consistent conventions or documented my decisions. What are you proud of? Mostly, that I stuck with it. This project pushed me through problems that initially felt impossible and taught me how to break them down, investigate them, and keep going. I understand memory layout, byte order, networking, and C much better now than when I started. Seeing the client request data, the server build a response, and the parser turn those bytes into readable fields made that work feel worth it. What should people know before using it? Read the README first! It explains how to build the programs, configure connections, and use the supported packet formats. This is a partial implementation, so it won’t interpret every DNP3 packet. For a quick demo: Start the server. Its default port is 48188. Choose Group 1, Variation 2 for binary values with flags, or Group 30, Variation 1 for analog values with flags. Use a small point range, such as 0–7. Start the client, enter port 48188, and enter 0 as the address to use localhost. Copy a complete reply from the client’s output into the parser. Join the hex bytes into one line and leave out the surrounding log messages. (certain consoles will do this automatically hint hint vscode", "repo": "https://github.com/arnabmondal-eg/dnp3", "demo": "https://github.com/arnabmondal-eg/dnp3/releases/tag/latest"}]...
|
[{"post_id": 86151, "ts": "202 [{"post_id": 86151, "ts": "2026-11-01T03:03:35Z", "hours": 11.1631, "text": "Just finished the Server-Client loop, as well as overhawling the parser binary. We are ready to SHIP!"}, {"post_id": 58550, "ts": "2026-08-31T00:08:09Z", "hours": 1.8961, "text": "Added the data generation, request creation, and response creation to the client and server. You can see a demo below. Not a giant change, just integrating the the new functions into the Client and Server."}, {"post_id": 57761, "ts": "2026-08-30T01:20:48Z", "hours": 10.5842, "text": "IM FREEEEE I FINALLY finished writing the write_data() function. Now full packet generation, with a request, and a reply is complete! Litterly the only thing left to do is make the ui. I AM DONE WITH THE BACKEND!!!!! I have included a handy guide to the output bellow. Instead of another picture of my terminal, you guys get to enjoy some color coded google docs!"}, {"post_id": 49396, "ts": "2026-08-18T06:12:20Z", "hours": 10.715, "text": "Im just going to appologize now, this devlog is not gonna be that great. I have been working the past few days on packet generation. Specifically on requesting data from a server, and writing that data to a packet as a server. As you can see by the time, this is much harder than it may seem. Though I did predict this a while ago. When the client request data from the server, a function is invoked that configures the group (data type; digital or analog) and the variation (presentation; packed format or with extra flags). When the server responds to this request, it invokes a function (technically 2) that refreshes the data it has (currently using a random number generator) and writes that to a packet. The packet is mostly a clone of the request, just with the source and destination switched, and the data added. Currently, I have both functions completed (or almost completed), but I still need to add crc to the reply form the server, and fix the many bugs that have arrisen from this change. Bellow I have an example request, no reply becuase the function is currently inoperable :( 05 64 0F C4 01 00 00 00 C8 E2 C1 C0 01 01 01 10 F7 03 00 0F 00 00 This request is asking for data from the server with address 1, data type 30 (digital), and the data points 3-15 Once again, very sorry for the poor quality dev log, but I just wanted to get an update out before I dug myself into an even deeper hole. See you guys later!"}, {"post_id": 45462, "ts": "2026-08-11T23:06:44Z", "hours": 6.2953, "text": "Been a busy 4 days. Worked on mostly modularity for the program, making sure that I am not repeating code that can be a function as part of a larger library The 2 libraries I implemented were the common/ and network/ libraries. These are used in both the client and server. Common includes functions like setting up connections, sending packets, receiving packets, interpreting them, and polling them for data The network library handles connecting to a server/client, and others. I also finally added the ability for the client (main stations/ems) to multiple servers (outstations/rtu). You can see a demo of all this working in the video. That’s it for now, goodbye!"}, {"post_id": 42903, "ts": "2026-08-07T21:11:13Z", "hours": 2.3822, "text": "More work on the logging system. Realized that we can use a global var with an init function to remove the need for each log call to pass the file pointer to the log Previous Method; // main log_err ( errno , \"client/main\" , fptr ); The fptr is a FILE* varible that points to the logging file New Method; // log.c static FILE * log_file = NULL ; int log_init ( const char * file_path ) { log_file = fopen ( file_path , \"a\" ); if ( log_file == NULL ) { log_err ( errno , \"log/log_init\" ); return - 1 ; } return 0 ; } // main log_init ( \"log/log.txt\" ); log_err ( errno , \"client/main\" ); The new method means all you have to pass is errno and the location of error. Super Simple!!! I also updated both client and server with this system. Bye"}, {"post_id": 41747, "ts": "2026-08-06T04:11:05Z", "hours": 0.5658, "text": "Small addition. Made log_info() a variadic function, like printf() . This means you can now do the same formatting like printf(\"hello %s\", \"world\") . This allows for easier logging to file and console, as both are just an arg in the funciton call! Yay!!!!"}, {"post_id": 41582, "ts": "2026-08-05T21:33:22Z", "hours": 2.0283, "text": "Finished adding the logging library I mentioned in the last post. It supports Colored text for warning and errors, time stamps, and better formatting. Ironically, the hardest part about this was figuring out how to use ANSI escape codes to support the colored text. This Medium article fromVitor Matias was super helpful! i also realized most people dont wanna read walls, so my updates will be smaller form now!"}, {"post_id": 41164, "ts": "2026-08-05T06:12:35Z", "hours": 6.4817, "text": "DevLog 15 Been busy the past couple of days with some school, so sorry I haven’t posted sooner, but I have also built out a couple more features.The Main additions are; Reusable frequent packet structures (acknowledge, negative acknowledge, reset link) Server Client loop 1. Ability to choose packet type to send to server (through TUI) in client 2. Server responds, and client is able to display response Better error handling, with more checks for errno and printing to log and console Better logging through file rather than just console The logging is proably my favorite new feature. It saves previous runs and even annotates the time and date the run took place. The error info is also much more helpful, and more often my program tells me why it crashed, instead of just ending or segfaulting client [ main]: Connection refused ^^^^ This now happens when you try to run the client with out a server on the configured adress or port Errors I ran into There actually wasn’t that much stuff going wrong, just took me pretty long as I had to edit a lot of functions and flows. A big issue i did run into was adding select() , also know as polling to the socket. Basicly, my code will loop checking the socket and parsing the data in it. But, a problem occurs if there is no data in the socket waiting. Polling allows my code to check if there actually is data, and if not wait/move on to the next task. But, I had incorrectly configured the function (the documentation for this function is especially confusing…), and this lead it to always report data in the socket. This then lead to errors with trying to map that data into a struct, and it just lead to catastrophy. Immediate Plans Have some stuff I’m going to / want to try and start before the next devlog; Logging Functions to simply logging to console and file * Something like log_note() , log_warn() , and log_error() * Currently just writing both fprintf() and perror() Add functionality to digital and analog requests * Need to add packet structures and creator functions for both Seperate network functionality like socket() , send() , etc… into its own library fucntions Seperate shared code between server and client into common library Media I thought I would include this section to explain some of things in the attached videos. These show all the features I implemented, including the client server loop, logging, and error handling Video 1 This just shows the current loop between the client and server, where the client sends a packet, a reset link packet in this case, and the server responds, in this case with a simple acknowledgement. It also shows how both programs log information about their runs in an assocaited text file. Btw, if you have some sugestions for making this better, please leave a comment . This is just about the simplest way to do logging, so other ideas are appreciated! Video 2 This shows an example of custom ports, error handling, and more logging. Both the client and server support custom ports (and server adresses in the case of the client) passed in as a launch argument. You can see when the client trys to connect to a server that either doesn’t exist on the current port, or isn’t active, an error message is displayed into the console and logged in the file. Alternatively, when both use the same port, the connection succeds, that port is logged as well. Wrap Up Lots of stuff to do still, and I am super excited to get started. Thank you to the few of you who have been following development since the beginning, and hello to anyone new!"}, {"post_id": 34839, "ts": "2026-07-25T21:21:26Z", "hours": 2.57, "text": "Manual Packet Creation and More! Just finished adding the ability to create a packet based on parameters rather than requiring a premade packet. Manual Packets Basicly, instead of needing something like , uint8_t input [] = { 0x05 , 0x64 , ... }; dnp3p_st packet_s = mkPacket ( input ); You can now just use a function and pass in parameters. Then, since this is just a fancy memory structure, a simple memcpy into an appropriately sized array will give you both! (The raw packet, and the structure) uint8_t packet [ 30 ] = { 0 }; // did some renaming, uses dnp3Lib for library funcs now dnp3p_st packet_s = dnp3Lib_mkPacket_manual ( 1 , 0 , 30 , 2 , 0 , 10 ); // params are: destination, source, group, variation, startIndex, and stopIndex memcpy ( & packet , & packet_s , 30 ); This will give you basicly the same thing as the first example, meaning you can create a packet based on a discription, rather than a discription based on a packet. This will be very useful when creating responses from to the client from the server, or vice versa. Should be noted that this is technically not very complete, but it is just an example for now. Pre-made Packets On the topic of creating a packet based on a discription, I also created some functions to create packets for common messages, including; Reset Link Required when creating a new connection Acknowledgement Negative Acknowledgment These will be useful when making connections, and sending responses to requests and replies. Wrap Up Still got a ways to go in terms of completion, but I’m hoping to ramp up my speed, been a little busy the past couple weeks."}, {"post_id": 31917, "ts": "2026-07-20T18:19:30Z", "hours": 1.1969, "text": "Added the ability to pick a custom socket or server ip. Also actualy pushed becuase I forgot last time"}, {"post_id": 31334, "ts": "2026-07-19T17:17:47Z", "hours": 4.9769, "text": "Just finished getting the client server connection working. Next thing to do is to interpret the packet on the server side, then create a reply based on the request."}, {"post_id": 26929, "ts": "2026-07-12T00:21:49Z", "hours": 3.2033, "text": "Dev log 11? I just pushed some changes and merged main and dev. This update I basically just made some fixes that should make the parser more accurate overall, but there are still a few lingering bugs. The main change I made was adding a system to clean the packet of any CRC bytes from within. Normally, a packet contains 2 bytes of CRC spread around it, with 2 after the end of the header, and after that 2 after every 16 bytes. This change will allow my data handler to not accidentally ingest CRC bytes, which would mess up the spacing of each data segment, and result in randomness. I also added a function to calculate the size of a packet based on the length information stored within it, rather than the physical memory size of it. This is better, as I can call it from any function and not have to pass in the size as a param. Overall, I am around 90% done with the backend, and just have a couple bugs to fix. I have attached a screen shot of some of the new features."}, {"post_id": 25364, "ts": "2026-07-09T16:42:47Z", "hours": 1.4706, "text": "Added parsing for more Objects Has not been very long but I am back with an update. I just finished adding in parsing for more object types, including Group 1 Varriation 1 Varriation 2 Group 30 Varriation 1 Varriation 2 I’ll also try and make more frequent posts here!"}, {"post_id": 25027, "ts": "2026-07-08T23:27:04Z", "hours": 9.7514, "text": "DNP3 Parser Update - Understanding a DNP3 Packet This week I finished parsing DNP3 Group 1 Variation 1 , the first object type supported by the parser. That means the parser can now decode binary input status values from real DNP3 traffic instead of just stopping at the object header. I also got some practice using GDB to debug my programs! Super useful as I ran into some segmentation faults that would have been impossible to fix without it! How a DNP3 Packet Works DNP3 (Distributed Network Protocol 3) is an industrial control protocol used by electric utilities, water systems, and other critical infrastructure. Communication happens between a Master (SCADA server) and one or more Outstations (RTUs, relays, PLCs, etc.). A packet is made up of several layers: Data Link Layer Transport Layer Application Header Object Header(s) Object Data Data Link Layer The packet always begins with the start bytes: 0x05 0x64 These identify the frame as DNP3. The rest of the link header contains: Length Control byte Destination address Source address CRC This layer is responsible for moving frames between devices and detecting transmission errors. Transport Layer The transport header is only one byte long, but it’s important because it: Marks the start and end of fragmented messages Provides a sequence number so fragments can be reassembled Application Layer The application header tells the receiver what operation is being requested. Examples include: Read Write Response Confirm It also contains application control flags and an application sequence number. Object Headers After the application header come one or more object headers. These tell the parser what type of data follows . An object header contains: Group number Variation number Qualifier For example: Group 1 Variation 1 represents packed binary input values. The qualifier then specifies how many objects are present and how they are indexed. Object Data Finally comes the actual payload. For Group 1 Variation 1, each bit represents the current state of a binary input: 1 = ON 0 = OFF The parser reads these bytes and expands them into individual points that can be displayed or analyzed. Completed Sections Data Link Layer parsing Transport Header parsing Application Header parsing Object Header parsing Group 1 Variation 1 object parsing Next up is adding support for additional object groups and variations so the parser can decode more real-world DNP3 traffic."}, {"post_id": 15996, "ts": "2026-06-25T23:42:02Z", "hours": 7.0044, "text": "Transport Header, Printing Updates, and Bug Fixes! Its once again that time. This week I worked on the object header, updated the printing on the DLC parsing, as well as fixing a couple big bugs. Transport Header The transport header consists of 5 parts, and its main job is to explains the format, and ordering of the data in the packet. Note that there are multiple object and data blocks in a single packet, but currently I can only parse 1 at most. Bugs Fixed Ran into a couple bugs, but I’ll just mention 2. When filling the range (part of the object header) I ran into some errors. It turns out that I had forgoten to initilize the space with 0s, and that ment that if less than 8 bytes were assigned, there was garbage memory sitting in the space. Fix was pretty easy, just zeroed out the space and then assigned the data Incorrect DLC data being printed. Another strange bug, not really sure what was causing it Fix was pretty simple, just rewrote the print statements (attached a picture) Wrap Up Thanks for enduring that yap fest. Next update will probably be when I add in data parsing, unless I make some major change.Hope you enjoyed it. Check out the GitHub: https://github.com/arnabmondal-eg/dnp3 And have a safe , fun, and patriotic Fourth of July !"}, {"post_id": 10044, "ts": "2026-06-16T16:44:41Z", "hours": 7.025, "text": "DNP3 Parser I genuinely dont know how its been 7 hours. I feel like the majority of my time is fixing bugs and trying to get my code to compile. Where I’ve Been It’s been a while since my last devlog, and I have spent the past 7 hours adding a good bit. Main thing is that almost the entire packet is now being parsed, or atleast the hard part. The entire header, dlc byte, transport header, and application header are parsed , so the only thing left is the Object headers and the data itself. I also created a new struct to hold all of these functions , so you can just pass in a hex and get all this data out, no need to call each portions functionality anymore. Whats Next Moving forward, I have a couple goals/milestones I have to hit before I can ship this project: Parse the rest of the packet Check validity on entire packet (using CRC bytes) Finish Parser UI (almost done, but still some more to be done) Create Control/Main Station UI Create RTU/Secondary Station UI Link backend and frontend using network sockets Create systems for creating packets (I believe this will be much more difficult than parsing them) Simulate “Conversations” between the main and outstations Create binaries for Windows, Mac, and Linux"}, {"post_id": 8365, "ts": "2026-06-13T22:07:59Z", "hours": 1.3322, "text": "Just did a little rework to move all header files to the inc/ folder. This should make it less cluttered, but we will see how this holds up. Next things on the chopping block are: Implement Transport Header Parsing Implement Application Header Parsing Check all CRC bytes in entire packet Check out the GitHub! https://github.com/arnabmondal-eg/dnp3"}, {"post_id": 7776, "ts": "2026-06-13T00:04:46Z", "hours": 5.6458, "text": "Its been a while… Hello! I have been working on the parser for a while. This post will be an explanation of where I am in the project so far. I wouldn’t go as far as to say that I am close to done yet, but I’m definitely nearing the halfway point. The past 2 days I have reworked how packets are interpreted, as well as adding some new helper utilities/functions to make future decoding easier. I also implemented a full bit-by-bit decomposition of the DLC byte in a header! This was super fun and rewarding as I learned a lot about bit-wise operations in C, as well as strengthening my understand of memory and how it is transferred through a program. I also learned I can’t spell! Wrote valid as “vaild” over 10 times! I also learned that C doesn’t pass the size of an array automatically! Super fun bugs! \\s Feel free to critique my code on the GitHub! https://github.com/arnabmondal-eg/dnp3"}, {"post_id": 6455, "ts": "2026-06-10T21:20:28Z", "hours": 1.3786, "text": "Finished reworking the Parser UI. It uses a split pane so you can get as much or as little space as you need. Features a text input area on the left with a parse button on the bottom, and a tree view on the right (to see the parsed packet contents) with a valid indicator on the bottom. Nothing is hooked up yet to logic, so that is coming up soon on the list! Swing is definitely kind of tedious to write though! Check out the github: https://github.com/arnabmondal-eg/dnp3"}, {"post_id": 5990, "ts": "2026-06-10T01:27:53Z", "hours": 2.5494, "text": "Just finished writing the final portion of the header validity checker, which uses a brand new CRC byte calculator! Very Fun to make, as I really got to dig deep into bit-wise operations for the first time, but definitely challenging! In terms of the backend, there is still much to do, but I am getting close to completion. The frontend still is in rough shape however. Making Good Progress!"}, {"post_id": 5857, "ts": "2026-06-09T20:07:09Z", "hours": 2.4053, "text": "Improved project structure, worked on README, added tasks to make compiling easier. Really want this to be usable, so I am putting in the work to make it simple to understand and use. Also I hated writing this project tree. Leme know if there is some tool i can use to do this automatically in the future"}, {"post_id": 5339, "ts": "2026-06-09T02:25:31Z", "hours": 1.3033, "text": "Working on the parser backend. Currently planning for all the backend to be in C, while I handle the frontend in Java using Swing. While this may seem like an ancient technology, most production SCADA applications use Swing for its long term support. And Java and C are obvious choices aswell. Heres a pic of the header part of the interpreter, and some work in progress ui. Much more work to come!"}]...
|
Title: dnp3 Parser and Simulator by @arnabm | Star Title: dnp3 Parser and Simulator by @arnabm | Stardance
Devlogs:
Working on the parser backend. Currently planning for all the backend to be in C, while I handle the frontend in Java using Swing. While this may seem like an ancient technology, most production SCADA applications use Swing for its long term support. And Java and C are obvious choices aswell. Heres a pic of the header part of the interpreter, and some work in progress ui. Much more work to come!
Improved project structure, worked on README, added tasks to make compiling easier. Really want this to be usable, so I am putting in the work to make it simple to understand and use. Also I hated writing this project tree. Leme know if there is some tool i can use to do this automatically in the future
Just finished writing the final portion of the header validity checker, which uses a brand new CRC byte calculator! Very Fun to make, as I really got to dig deep into bit-wise operations for the first time, but definitely challenging! In terms of the backend, there is still much to do, but I am getting close to completion. The frontend still is in rough shape however. Making Good Progress!
Finished reworking the Parser UI. It uses a split pane so you can get as much or as little space as you need. Features a text input area on the left with a parse button on the bottom, and a tree view on the right (to see the parsed packet contents) with a valid indicator on the bottom. Nothing is hooked up yet to logic, so that is coming up soon on the list! Swing is definitely kind of tedious to write though! Check out the github: https://github.com/arnabmondal-eg/dnp3
Its been a while… Hello! I have been working on the parser for a while. This post will be an explanation of where I am in the project so far. I wouldn’t go as far as to say that I am close to done yet, but I’m definitely nearing the halfway point. The past 2 days I have reworked how packets are interpreted, as well as adding some new helper utilities/functions to make future decoding easier. I also implemented a full bit-by-bit decomposition of the DLC byte in a header! This was super fun and rewarding as I learned a lot about bit-wise operations in C, as well as strengthening my understand of memory and how it is transferred through a program. I also learned I can’t spell! Wrote valid as “vaild” over 10 times! I also learned that C doesn’t pass the size of an array automatically! Super fun bugs! \s Feel free to critique my code on the GitHub! https://github.com/arnabmondal-eg/dnp3
Just did a little rework to move all header files to the inc/ folder. This should make it less cluttered, but we will see how this holds up. Next things on the chopping block are: Implement Transport Header Parsing Implement Application Header Parsing Check all CRC bytes in entire packet Check out the GitHub! https://github.com/arnabmondal-eg/dnp3
DNP3 Parser I genuinely dont know how its been 7 hours. I feel like the majority of my time is fixing bugs and trying to get my code to compile. Where I’ve Been It’s been a while since my last devlog, and I have spent the past 7 hours adding a good bit. Main thing is that almost the entire packet is now being parsed, or atleast the hard part. The entire header, dlc byte, transport header, and application header are parsed , so the only thing left is the Object headers and the data itself. I also created a new struct to hold all of these functions , so you can just pass in a hex and get all this data out, no need to call each portions functionality anymore. Whats Next Moving forward, I have a couple goals/milestones I have to hit before I can ship this project: Parse the rest of the packet Check validity on entire packet (using CRC bytes) Finish Parser UI (almost done, but still some more to be done) Create Control/Main Station UI Create RTU/Secondary Station UI Link backend and frontend using network sockets Create systems for creating packets (I believe this will be much more difficult than parsing them) Simulate “Conversations” between the main and outstations Create binaries for Windows, Mac, and Linux
Transport Header, Printing Updates, and Bug Fixes! Its once again that time. This week I worked on the object header, updated the printing on the DLC parsing, as well as fixing a couple big bugs. Transport Header The transport header consists of 5 parts, and its main job is to explains the format, and ordering of the data in the packet. Note that there are multiple object and data blocks in a single packet, but currently I can only parse 1 at most. Bugs Fixed Ran into a couple bugs, but I’ll just mention 2. When filling the range (part of the object header) I ran into some errors. It turns out that I had forgoten to initilize the space with 0s, and that ment that if less than 8 bytes were assigned, there was garbage memory sitting in the space. Fix was pretty easy, just zeroed out the space and then assigned the data Incorrect DLC data being printed. Another strange bug, not really sure what was causing it Fix was pretty simple, just rewrote the print statements (attached a picture) Wrap Up Thanks for enduring that yap fest. Next update will probably be when I add in data parsing, unless I make some major change.Hope you enjoyed it. Check out the GitHub: https://github.com/arnabmondal-eg/dnp3 And have a safe , fun, and patriotic Fourth of July !
DNP3 Parser Update - Understanding a DNP3 Packet This week I finished parsing DNP3 Group 1 Variation 1 , the first object type supported by the parser. That means the parser can now decode binary input status values from real DNP3 traffic instead of just stopping at the object header. I also got some practice using GDB to debug my programs! Super useful as I ran into some segmentation faults that would have been impossible to fix without it! How a DNP3 Packet Works DNP3 (Distributed Network Protocol 3) is an industrial control protocol used by electric utilities, water systems, and other critical infrastructure. Communication happens between a Master (SCADA server) and one or more Outstations (RTUs, relays, PLCs, etc.). A packet is made up of several layers: Data Link Layer Transport Layer Application Header Object Header(s) Object Data Data Link Layer The packet always begins with the start bytes: 0x05 0x64 These identify the frame as DNP3. The rest of the link header contains: Length Control byte Destination address Source address CRC This layer is responsible for moving frames between devices and detecting transmission errors. Transport Layer The transport header is only one byte long, but it’s important because it: Marks the start and end of fragmented messages Provides a sequence number so fragments can be reassembled Application Layer The application header tells the receiver what operation is being requested. Examples include: Read Write Response Confirm It also contains application control flags and an application sequence number. Object Headers After the application header come one or more object headers. These tell the parser what type of data follows . An object header contains: Group number Variation number Qualifier For example: Group 1 Variation 1 represents packed binary input values. The qualifier then specifies how many objects are present and how they are indexed. Object Data Finally comes the actual payload. For Group 1 Variation 1, each bit represents the current state of a binary input: 1 = ON 0 = OFF The parser reads these bytes and expands them into individual points that can be displayed or analyzed. Completed Sections Data Link Layer parsing Transport Header parsing Application Header parsing Object Header parsing Group 1 Variation 1 object parsing Next up is adding support for additional object groups and variations so the parser can decode more real-world DNP3 traffic.
Added parsing for more Objects Has not been very long but I am back with an update. I just finished adding in parsing for more object types, including Group 1 Varriation 1 Varriation 2 Group 30 Varriation 1 Varriation 2 I’ll also try and make more frequent posts here!
Dev log 11? I just pushed some changes and merged main and dev. This update I basically just made some fixes that should make the parser more accurate overall, but there are still a few lingering bugs. The main change I made was adding a system to clean the packet of any CRC bytes from within. Normally, a packet contains 2 bytes of CRC spread around it, with 2 after the end of the header, and after that 2 after every 16 bytes. This change will allow my data handler to not accidentally ingest CRC bytes, which would mess up the spacing of each data segment, and result in randomness. I also added a function to calculate the size of a packet based on the length information stored within it, rather than the physical memory size of it. This is better, as I can call it from any function and not have to pass in the size as a param. Overall, I am around 90% done with the backend, and just have a couple bugs to fix. I have attached a screen shot of some of the new features.
Just finished getting the client server connection working. Next thing to do is to interpret the packet on the server side, then create a reply based on the request.
Added the ability to pick a custom socket or server ip. Also actualy pushed becuase I forgot last time
Manual Packet Creation and More! Just finished adding the ability to create a packet based on parameters rather than requiring a premade packet. Manual Packets Basicly, instead of needing something like , uint8_t input [] = { 0x05 , 0x64 , ... }; dnp3p_st packet_s = mkPacket ( input ); You can now just use a function and pass in parameters. Then, since this is just a fancy memory structure, a simple memcpy into an appropriately sized array will give you both! (The raw packet, and the structure) uint8_t packet [ 30 ] = { 0 }; // did some renaming, uses dnp3Lib for library funcs now dnp3p_st packet_s = dnp3Lib_mkPacket_manual ( 1 , 0 , 30 , 2 , 0 , 10 ); // params are: destination, source, group, variation, startIndex, and stopIndex memcpy ( & packet , & packet_s , 30 ); This will give you basicly the same thing as the first example, meaning you can create a packet based on a discription, rather than a discription based on a packet. This will be very useful when creating responses from to the client from the server, or vice versa. Should be noted that this is technically not very complete, but it is just an example for now. Pre-made Packets On the topic of creating a packet based on a discription, I also created some functions to create packets for common messages, including; Reset Link Required when creating a new connection Acknowledgement Negative Acknowledgment These will be useful when making connections, and sending responses to requests and replies. Wrap Up Still got a ways to go in terms of completion, but I’m hoping to ramp up my speed, been a little busy the past couple weeks.
DevLog 15 Been busy the past couple of days with some school, so sorry I haven’t posted sooner, but I have also built out a couple more features.The Main additions are; Reusable frequent packet structures (acknowledge, negative acknowledge, reset link) Server Client loop 1. Ability to choose packet type to send to server (through TUI) in client 2. Server responds, and client is able to display response Better error handling, with more checks for errno and printing to log and console Better logging through file rather than just console The logging is proably my favorite new feature. It saves previous runs and even annotates the time and date the run took place. The error info is also much more helpful, and more often my program tells me why it crashed, instead of just ending or segfaulting client [ main]: Connection refused ^^^^ This now happens when you try to run the client with out a server on the configured adress or port Errors I ran into There actually wasn’t that much stuff going wrong, just took me pretty long as I had to edit a lot of functions and flows. A big issue i did run into was adding select() , also know as polling to the socket. Basicly, my code will loop checking the socket and parsing the data in it. But, a problem occurs if there is no data in the socket waiting. Polling allows my code to check if there actually is data, and if not wait/move on to the next task. But, I had incorrectly configured the function (the documentation for this function is especially confusing…), and this lead it to always report data in the socket. This then lead to errors with trying to map that data into a struct, and it just lead to catastrophy. Immediate Plans Have some stuff I’m going to / want to try and start before the next devlog; Logging Functions to simply logging to console and file * Something like log_note() , log_warn() , and log_error() * Currently just writing both fprintf() and perror() Add functionality to digital and analog requests * Need to add packet structures and creator functions for both Seperate network functionality like socket() , send() , etc… into its own library fucntions Seperate shared code between server and client into common library Media I thought I would include this section to explain some of things in the attached videos. These show all the features I implemented, including the client server loop, logging, and error handling Video 1 This just shows the current loop between the client and server, where the client sends a packet, a reset link packet in this case, and the server responds, in this case with a simple acknowledgement. It also shows how both programs log information about their runs in an assocaited text file. Btw, if you have some sugestions for making this better, please leave a comment . This is just about the simplest way to do logging, so other ideas are appreciated! Video 2 This shows an example of custom ports, error handling, and more logging. Both the client and server support custom ports (and server adresses in the case of the client) passed in as a launch argument. You can see when the client trys to connect to a server that either doesn’t exist on the current port, or isn’t active, an error message is displayed into the console and logged in the file. Alternatively, when both use the same port, the connection succeds, that port is logged as well. Wrap Up Lots of stuff to do still, and I am super excited to get started. Thank you to the few of you who have been following development since the beginning, and hello to anyone new!
Finished adding the logging library I mentioned in the last post. It supports Colored text for warning and errors, time stamps, and better formatting. Ironically, the hardest part about this was figuring out how to use ANSI escape codes to support the colored text. This Medium article fromVitor Matias was super helpful! i also realized most people dont wanna read walls, so my updates will be smaller form now!
Small addition. Made log_info() a variadic function, like printf() . This means you can now do the same formatting like printf("hello %s", "world") . This allows for easier logging to file and console, as both are just an arg in the funciton call! Yay!!!!
More work on the logging system. Realized that we can use a global var with an init function to remove the need for each log call to pass the file pointer to the log Previous Method; // main log_err ( errno , "client/main" , fptr ); The fptr is a FILE* varible that points to the logging file New Method; // log.c static FILE * log_file = NULL ; int log_init ( const char * file_path ) { log_file = fopen ( file_path , "a" ); if ( log_file == NULL ) { log_err ( errno , "log/log_init" ); return - 1 ; } return 0 ; } // main log_init ( "log/log.txt" ); log_err ( errno , "client/main" ); The new method means all you have to pass is errno and the location of error. Super Simple!!! I also updated both client and server with this system. Bye
Been a busy 4 days. Worked on mostly modularity for the program, making sure that I am not repeating code that can be a function as part of a larger library The 2 libraries I implemented were the common/ and network/ libraries. These are used in both the client and server. Common includes functions like setting up connections, sending packets, receiving packets, interpreting them, and polling them for data The network library handles connecting to a server/client, and others. I also finally added the ability for the client (main stations/ems) to multiple servers (outstations/rtu). You can see a demo of all this working in the video. That’s it for now, goodbye!
Im just going to appologize now, this devlog is not gonna be that great. I have been working the past few days on packet generation. Specifically on requesting data from a server, and writing that data to a packet as a server. As you can see by the time, this is much harder than it may seem. Though I did predict this a while ago. When the client request data from the server, a function is invoked that configures the group (data type; digital or analog) and the variation (presentation; packed format or with extra flags). When the server responds to this request, it invokes a function (technically 2) that refreshes the data it has (currently using a random number generator) and writes that to a packet. The packet is mostly a clone of the request, just with the source and destination switched, and the data added. Currently, I have both functions completed (or almost completed), but I still need to add crc to the reply form the server, and fix the many bugs that have arrisen from this change. Bellow I have an example request, no reply becuase the function is currently inoperable :( 05 64 0F C4 01 00 00 00 C8 E2 C1 C0 01 01 01 10 F7 03 00 0F 00 00 This request is asking for data from the server with address 1, data type 30 (digital), and the data points 3-15 Once again, very sorry for the poor quality dev log, but I just wanted to get an update out before I dug myself into an even deeper hole. See you guys later!
IM FREEEEE I FINALLY finished writing the write_data() function. Now full packet generation, with a request, and a reply is complete! Litterly the only thing left to do is make the ui. I AM DONE WITH THE BACKEND!!!!! I have included a handy guide to the output bellow. Instead of another picture of my terminal, you guys get to enjoy some color coded google docs!
Added the data generation, request creation, and response creation to the client and server. You can see a demo below. Not a giant change, just integrating the the new functions into the Client and Server.
Just finished the Server-Client loop, as well as overhawling the parser binary. We are ready to SHIP!
Ships:
What did you make? I built a partial implementation of DNP3 in C, along with a TCP client/server simulator and an interactive packet parser. DNP3 is a communication protocol used in SCADA systems, including power utilities and water management. It lets equipment at remote sites send measurements and status information to control centers. The protocol is decades old and widely used, but finding detailed, freely available documentation was surprisingly difficult. My project implements a small subset of it so you can generate data, exchange packets between programs, and inspect what those packets contain. Why was it challenging? The hardest part was turning the protocol’s packet layouts into working C code. DNP3 originated in serial communication, and carrying its frames over TCP meant handling the fact that one network read doesn’t necessarily equal one complete packet. This was also my first big C project. Coming from Java, I had to get comfortable with pointers, manual memory handling, sockets, and the difference between a struct’s layout in memory and the bytes a protocol expects. Struct padding caused a lot more trouble than I expected 😭. I also took a roughly two-month break. Returning to code I’d written while still learning C was a challenge of its own, especially where I hadn’t used consistent conventions or documented my decisions. What are you proud of? Mostly, that I stuck with it. This project pushed me through problems that initially felt impossible and taught me how to break them down, investigate them, and keep going. I understand memory layout, byte order, networking, and C much better now than when I started. Seeing the client request data, the server build a response, and the parser turn those bytes into readable fields made that work feel worth it. What should people know before using it? Read the README first! It explains how to build the programs, configure connections, and use the supported packet formats. This is a partial implementation, so it won’t interpret every DNP3 packet. For a quick demo: Start the server. Its default port is 48188. Choose Group 1, Variation 2 for binary values with flags, or Group 30, Variation 1 for analog values with flags. Use a small point range, such as 0–7. Start the client, enter port 48188, and enter 0 as the address to use localhost. Copy a complete reply from the client’s output into the parser. Join the hex bytes into one line and leave out the surrounding log messages. (certain consoles will do this automatically hint hint vscode...
|
1793566519.807824
|
1793652919.807824
|
|
13668
|
Tic Tac Toe by @mishelkora27 | Stardance
|
mishelkora27
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Tic Tac Toe by @mishelkora27 | Stardance
|
1792925670.8628745
|
1793789670.8628745
|
|
13669
|
The Solar Flare Pulse Defense by @Carnage | Starda The Solar Flare Pulse Defense by @Carnage | Stardance...
|
Carnage
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: The Solar Flare Pulse Defense by @Carnage | Title: The Solar Flare Pulse Defense by @Carnage | Stardance...
|
1793238455.8018732
|
1793843255.8018732
|
|
13670
|
My awesome CyberNetOS by @BenuaminM35 | Stardance
|
BenuaminM35
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome CyberNetOS by @BenuaminM35 | Sta Title: My awesome CyberNetOS by @BenuaminM35 | Stardance...
|
1792936101.8054993
|
1793800101.8054993
|
|
13671
|
My awesome macropad! by @awu04560 | Stardance
|
awu04560
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @awu04560 | Stardan Title: My awesome macropad! by @awu04560 | Stardance...
|
1792929037.498563
|
1793793037.498563
|
|
13672
|
Obi-Wan Kenobi’s Lightsaber DIY Home Depot Parts b Obi-Wan Kenobi’s Lightsaber DIY Home Depot Parts by @JacksonBrighty | Stardance...
|
JacksonBrighty
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Obi-Wan Kenobi’s Lightsaber DIY Home Depot Title: Obi-Wan Kenobi’s Lightsaber DIY Home Depot Parts by @JacksonBrighty | Stardance...
|
1793235024.186162
|
1793839824.186162
|
|
13673
|
My very own WebOS by @calc | Stardance
|
calc
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @calc | Stardance
|
1793364668.5685828
|
1793969468.5685828
|
|
13674
|
Plume by @ishan_karpe | Stardance
|
ishan_karpe
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Plume by @ishan_karpe | Stardance
|
1793548088.1334586
|
1794152888.1334586
|
|
13675
|
Accidental project by @Benton | Stardance
|
Benton
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Accidental project by @Benton | Stardance
|
1793163319.6258683
|
1793768119.6258683
|
|
13676
|
corepad by @albertphu3 | Stardance
|
albertphu3
|
1
|
0.43
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T23:10:42Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "CorePad is a personal macro pad built customizable shortcuts and much more to come!", "repo": "https://github.com/albertphu07/corepad", "demo": ""}]...
|
[{"post_id": 11935, "ts": "202 [{"post_id": 11935, "ts": "2026-06-19T13:58:52Z", "hours": 0.4331, "text": "Updating stuff now (Fixed issue with pcb sorry forgot to update this!)"}, {"post_id": 9576, "ts": "2026-06-15T23:10:01Z", "hours": 0.2667, "text": "In tinker CAD cus fusion360 couldn’t import pcb and modeled my own dummy Seeed XIAO RP2040. And Updated fusion 360 Designs to have a smaller area for the screen. The ports and stuff are not to scale in the assembly so expect that it will not line up! https://www.tinkercad.com/things/jA2EXnSA3Lk-fantabulous-robo"}]...
|
Title: corepad by @albertphu3 | Stardance
Devlogs Title: corepad by @albertphu3 | Stardance
Devlogs:
In tinker CAD cus fusion360 couldn’t import pcb and modeled my own dummy Seeed XIAO RP2040. And Updated fusion 360 Designs to have a smaller area for the screen. The ports and stuff are not to scale in the assembly so expect that it will not line up! https://www.tinkercad.com/things/jA2EXnSA3Lk-fantabulous-robo
Updating stuff now (Fixed issue with pcb sorry forgot to update this!)
Ships:
CorePad is a personal macro pad built customizable shortcuts and much more to come!...
|
1793469312.6539197
|
1793555712.6539197
|
|
13677
|
My very own WebOS by @fafa2345678 | Stardance
|
fafa2345678
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @fafa2345678 | Stardan Title: My very own WebOS by @fafa2345678 | Stardance...
|
1793332645.4811237
|
1793937445.4811237
|
|
13678
|
My awesome macropad! by @coksparks | Stardance
|
coksparks
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @coksparks | Starda Title: My awesome macropad! by @coksparks | Stardance...
|
1793256523.4688082
|
1793861323.4688082
|
|
13679
|
projOS preview by @p14277376 | Stardance
|
p14277376
|
0
|
1.06
|
0
|
[]
|
[{"post_id": 5924, "ts": "2026 [{"post_id": 5924, "ts": "2026-06-09T22:03:22Z", "hours": 1.0636, "text": "Devlog 1 (easyAPT development is paused) projOS is a Scratch project that tries to use every feature of Scratch, but right now it’s not even close to ready (probably another year or so, especially since I’m not really using Scratch this summer). So when I saw the webOS mission, I thought it was absolutely perfect for my case. That is what I’m currently working on. What I got done was a welcome screen (not winXP’s) that wasn’t very personalized. The image shows the current version. I plan to make a much better version in the future."}]...
|
Title: projOS preview by @p14277376 | Stardance
D Title: projOS preview by @p14277376 | Stardance
Devlogs:
Devlog 1 (easyAPT development is paused) projOS is a Scratch project that tries to use every feature of Scratch, but right now it’s not even close to ready (probably another year or so, especially since I’m not really using Scratch this summer). So when I saw the webOS mission, I thought it was absolutely perfect for my case. That is what I’m currently working on. What I got done was a welcome screen (not winXP’s) that wasn’t very personalized. The image shows the current version. I plan to make a much better version in the future....
|
1793551825.6981559
|
1794156625.6981559
|
|
13680
|
My awesome macropad! by @Tedd | Stardance
|
Tedd
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Tedd | Stardance
|
1793551765.3167174
|
1794156565.3167174
|
|
13681
|
My awesome macropad! by @Danu | Stardance
|
Danu
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Danu | Stardance
|
1793447785.5349832
|
1794052585.5349832
|
|
13682
|
VrikshaRakshak by @DesktopArt9806 | Stardance
|
DesktopArt9806
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: VrikshaRakshak by @DesktopArt9806 | Stardan Title: VrikshaRakshak by @DesktopArt9806 | Stardance...
|
1793522886.252008
|
1794127686.252008
|
|
13683
|
Untitled project by @ii9eah | Stardance
|
ii9eah
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @ii9eah | Stardance
|
1793177390.6531234
|
1793782190.6531234
|
|
13684
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943452.3344233
|
1793807452.3344233
|
|
13685
|
My awesome macropad! by @mishelkora27 | Stardance
|
mishelkora27
|
0
|
23.15
|
0
|
[]
|
[{"post_id": 54162, "ts": "202 [{"post_id": 54162, "ts": "2026-08-25T00:43:41Z", "hours": 0.7167, "text": "I finally finished soldering everythung. Im really nervous about whether it will work or not but I’m happy with how it turned out. I really like the usb cutout and it looks exactly as I had imagined. I wish I wouldve designed the oled screen cutout a little better but overall it looks good."}, {"post_id": 54094, "ts": "2026-08-24T21:42:45Z", "hours": 0.9075, "text": "I started soldering the microcontroller to the pcb board. I struggled a little because I only had one experince in soldering before but I think I got through it pretty alright. I also started placed the diodes into the pcb and will solder them later."}, {"post_id": 46120, "ts": "2026-08-13T04:03:46Z", "hours": 2.8389, "text": "I think I’m done. I redid the entire case and added a better usb cutout. I also made sure to measure the case better this time. I updated github and ready to submit again."}, {"post_id": 45992, "ts": "2026-08-12T20:40:36Z", "hours": 1.4667, "text": "I made some changes arounf the case. Like I fixed the cutout for the usb. Then I realized my plate and pcb holes for the switches did not match up so I had to reposition the switches on the pcb and rewire it. Also every time I made changes to the rp2040 ont eh pcb it would say that the footprint does not exist so I had to leave the microcontroller as is even though it gives me silkscreen warnings which do not affect the functionality of the board."}, {"post_id": 33364, "ts": "2026-07-23T06:59:35Z", "hours": 2.5897, "text": "I’m finally and hopefully done with macropad. I set up the qmk and struggled a lot through it. I kept getting warnings and errors but i got it fixed. I also uploaded everything to github. I had to zip some folders but they contained a lot of files. Overall I enjoyed the process even though it took me a really long time."}, {"post_id": 32142, "ts": "2026-07-21T03:19:30Z", "hours": 0.4411, "text": "Started the firmware. I downloaded QMK firmware but was a little confused on what to type. I figured out that I had to type it line by line instead of copying and pasting the entire code on the QMK firmware website."}, {"post_id": 31663, "ts": "2026-07-20T08:01:50Z", "hours": 3.4667, "text": "I finally finished the case!! After I trimmed the sides of the case to fit the Seeed XIAO RP2040, I also made the holes for the screws larger to fit the head inserts. I also made some corners around the sub c socket so that it would not wiggle around when I plug it in. I made the around the usb c socket larger to have enough space to fit the head of the cable around the usb c since the socket does not hang at the edge of the case. I also cut out the holes for the switches using the plate model and cut out the oled display space as well as some extra space underneath it to fit the other parts around the oled that are going to be inside the case. In the end I also curved the edges of the case and socket. I had some trouble figuring out how to use fusion but I’m slowly getting the hang of it. Over all I’m pretty pleased with how the case looks!! I also made sure that the 5mm heat inserts would fit and have some extra space left."}, {"post_id": 31125, "ts": "2026-07-19T08:42:28Z", "hours": 4.2969, "text": "I remodeled the case because the measurements were incorrect. I moved the U1 on Kicad a little outside of the pcb because since the case’s thickness is 10mm on each side, the U1 would be too far inside the case. Although I moved it, it’s still not quite right so I will have to make the walls less thick. I had some trouble building the walls and the holes because I couldn’t figure out the margins but I got it to work my manually measuring the distances. I also placed the pcb, oled displace and switch to check where the wall of the case should end and how tall the plate/cover of the case should be."}, {"post_id": 29345, "ts": "2026-07-16T07:03:46Z", "hours": 4.2494, "text": "I had misplaced the U1 in the pcb so I had to move it in order for the start of the usb socket to be at the edge of the pcb. After I moved the U1 I had to rewire some wires in the pcb and afterwards I ran the test and everything was fine. I saved the file and then I saved the pcb as gerber file to check how it looks on jlcpcb. I then moved onto Fusion and started the case. I created a base after I measured the size of the pcb on kicad and made another rectangle 3 mm larger on each size. I then extruded the larger triangle and moved the pcb step file and the lcd onto the case and checked if it fits."}, {"post_id": 6612, "ts": "2026-06-11T02:50:01Z", "hours": 1.3419, "text": "Connected the wires to the switches and the U1 in the pcb. Had some trouble with placing the the components in a position where all the wires could be connected. Then once I was done with both sides of the pcb, both the red and blue wires, I moved on to the DRC and checked for any errors. I had to change the shape of the pads from oval to circle and make them smaller on the U1, which is the MOUDLE-SEEEDUINO-XIAO, because they were touching the wires and that was an error. Another error I ran into was the wires being too close to components on the switches so i had to move them and make them slimmer because they were 0.2mm away from the components. I had an issue with pad 3 of the U1 and pad 2 of the 6th switch being extremely close so once I moved U1 I had to reconnect some of the wires again."}, {"post_id": 6024, "ts": "2026-06-10T03:11:44Z", "hours": 0.4658, "text": "After working for 2 hours, the app randomly closed down so I lost all progress. I had to reorganize the layout of the pcb and took this opportunity to change some things around and how it will look. Also made some space in the corner for an oled screen. Tried to connected the wires on the pcb but couldnt get the placements right so i deleted the wires I already have and will retry."}, {"post_id": 5315, "ts": "2026-06-09T01:38:30Z", "hours": 0.3667, "text": "Downloaded the kicad files and uploading them. Had some difficulty with finding the files and organizing the keyboard switches."}]...
|
Title: My awesome macropad! by @mishelkora27 | Sta Title: My awesome macropad! by @mishelkora27 | Stardance
Devlogs:
Downloaded the kicad files and uploading them. Had some difficulty with finding the files and organizing the keyboard switches.
After working for 2 hours, the app randomly closed down so I lost all progress. I had to reorganize the layout of the pcb and took this opportunity to change some things around and how it will look. Also made some space in the corner for an oled screen. Tried to connected the wires on the pcb but couldnt get the placements right so i deleted the wires I already have and will retry.
Connected the wires to the switches and the U1 in the pcb. Had some trouble with placing the the components in a position where all the wires could be connected. Then once I was done with both sides of the pcb, both the red and blue wires, I moved on to the DRC and checked for any errors. I had to change the shape of the pads from oval to circle and make them smaller on the U1, which is the MOUDLE-SEEEDUINO-XIAO, because they were touching the wires and that was an error. Another error I ran into was the wires being too close to components on the switches so i had to move them and make them slimmer because they were 0.2mm away from the components. I had an issue with pad 3 of the U1 and pad 2 of the 6th switch being extremely close so once I moved U1 I had to reconnect some of the wires again.
I had misplaced the U1 in the pcb so I had to move it in order for the start of the usb socket to be at the edge of the pcb. After I moved the U1 I had to rewire some wires in the pcb and afterwards I ran the test and everything was fine. I saved the file and then I saved the pcb as gerber file to check how it looks on jlcpcb. I then moved onto Fusion and started the case. I created a base after I measured the size of the pcb on kicad and made another rectangle 3 mm larger on each size. I then extruded the larger triangle and moved the pcb step file and the lcd onto the case and checked if it fits.
I remodeled the case because the measurements were incorrect. I moved the U1 on Kicad a little outside of the pcb because since the case’s thickness is 10mm on each side, the U1 would be too far inside the case. Although I moved it, it’s still not quite right so I will have to make the walls less thick. I had some trouble building the walls and the holes because I couldn’t figure out the margins but I got it to work my manually measuring the distances. I also placed the pcb, oled displace and switch to check where the wall of the case should end and how tall the plate/cover of the case should be.
I finally finished the case!! After I trimmed the sides of the case to fit the Seeed XIAO RP2040, I also made the holes for the screws larger to fit the head inserts. I also made some corners around the sub c socket so that it would not wiggle around when I plug it in. I made the around the usb c socket larger to have enough space to fit the head of the cable around the usb c since the socket does not hang at the edge of the case. I also cut out the holes for the switches using the plate model and cut out the oled display space as well as some extra space underneath it to fit the other parts around the oled that are going to be inside the case. In the end I also curved the edges of the case and socket. I had some trouble figuring out how to use fusion but I’m slowly getting the hang of it. Over all I’m pretty pleased with how the case looks!! I also made sure that the 5mm heat inserts would fit and have some extra space left.
Started the firmware. I downloaded QMK firmware but was a little confused on what to type. I figured out that I had to type it line by line instead of copying and pasting the entire code on the QMK firmware website.
I’m finally and hopefully done with macropad. I set up the qmk and struggled a lot through it. I kept getting warnings and errors but i got it fixed. I also uploaded everything to github. I had to zip some folders but they contained a lot of files. Overall I enjoyed the process even though it took me a really long time.
I made some changes arounf the case. Like I fixed the cutout for the usb. Then I realized my plate and pcb holes for the switches did not match up so I had to reposition the switches on the pcb and rewire it. Also every time I made changes to the rp2040 ont eh pcb it would say that the footprint does not exist so I had to leave the microcontroller as is even though it gives me silkscreen warnings which do not affect the functionality of the board.
I think I’m done. I redid the entire case and added a better usb cutout. I also made sure to measure the case better this time. I updated github and ready to submit again.
I started soldering the microcontroller to the pcb board. I struggled a little because I only had one experince in soldering before but I think I got through it pretty alright. I also started placed the diodes into the pcb and will solder them later.
I finally finished soldering everythung. Im really nervous about whether it will work or not but I’m happy with how it turned out. I really like the usb cutout and it looks exactly as I had imagined. I wish I wouldve designed the oled screen cutout a little better but overall it looks good....
|
1793188293.162948
|
1793793093.162948
|
|
13686
|
UE5MCP by @eashanbabber | Stardance
|
eashanbabber
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: UE5MCP by @eashanbabber | Stardance
|
1793270938.9214373
|
1793875738.9214373
|
|
13687
|
My very own WebOS by @pancake | Stardance
|
pancake
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @pancake | Stardance
|
1793501378.687964
|
1794106178.687964
|
|
13688
|
Tetris Game by @OrangeFury | Stardance
|
OrangeFury
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Tetris Game by @OrangeFury | Stardance
|
1793166719.8785427
|
1793771519.8785427
|
|
13689
|
Laborious by @Col | Stardance
|
Col
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Laborious by @Col | Stardance
|
1793566110.3682873
|
1794170910.3682873
|
|
13690
|
Untitled by @JacksonBrighty | Stardance
|
JacksonBrighty
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @JacksonBrighty | Stardance
|
1793364622.8403351
|
1793969422.8403351
|
|
13691
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943450.6792352
|
1793807450.6792352
|
|
13692
|
eWatch by @axeld | Stardance
|
axeld
|
0
|
2.18
|
0
|
[]
|
[{"post_id": 6528, "ts": "2026 [{"post_id": 6528, "ts": "2026-06-10T23:42:05Z", "hours": 2.1822, "text": "Wired the USB port, esp32, and some flash in the schematic editor."}]...
|
Title: eWatch by @axeld | Stardance
Devlogs:
Wire Title: eWatch by @axeld | Stardance
Devlogs:
Wired the USB port, esp32, and some flash in the schematic editor....
|
1793569872.7280083
|
1794174672.7280083
|
|
13693
|
My awesome macropad! by @William | Stardance
|
William
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @William | Stardanc Title: My awesome macropad! by @William | Stardance...
|
1793206230.537186
|
1793811030.537186
|
|
13694
|
Untitled by @Pips | Stardance
|
Pips
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Pips | Stardance
|
1793180884.044975
|
1793785684.044975
|
|
13695
|
My very own WebOS by @dwlin0522 | Stardance
|
dwlin0522
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @dwlin0522 | Stardance
|
1793314287.8811684
|
1793919087.8811684
|
|
13696
|
My very own WebOS by @sayer | Stardance
|
sayer
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @sayer | Stardance
|
1793191884.7535105
|
1793796684.7535105
|
|
13697
|
FPV DRONE! (Fully Custom) by @William | Stardance
|
William
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: FPV DRONE! (Fully Custom) by @William | Sta Title: FPV DRONE! (Fully Custom) by @William | Stardance...
|
1793188252.0147026
|
1793793052.0147026
|
|
13698
|
WinDurango.UI by @dexrn | Stardance
|
dexrn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: WinDurango.UI by @dexrn | Stardance
|
1793436954.5991454
|
1794041754.5991454
|
|
13699
|
Untitled project by @miley | Stardance
|
miley
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @miley | Stardance
|
1793379379.690204
|
1793984179.690204
|
|
13700
|
My awesome macropad! by @ban_ikura | Stardance
|
ban_ikura
|
0
|
0.26
|
0
|
[]
|
[{"post_id": 6196, "ts": "2026 [{"post_id": 6196, "ts": "2026-06-10T12:29:46Z", "hours": 0.2633, "text": "I started this project. I don’t speak English. Nice to meet you."}]...
|
Title: My awesome macropad! by @ban_ikura | Starda Title: My awesome macropad! by @ban_ikura | Stardance
Devlogs:
I started this project. I don’t speak English. Nice to meet you....
|
1793451193.3781154
|
1794055993.3781154
|