|
70105
|
Untitled project by @penguinissus | Stardance
|
penguinissus
|
0
|
2.06
|
0
|
[]
|
[{"post_id": 80251, "ts": "202 [{"post_id": 80251, "ts": "2026-10-16T22:12:26Z", "hours": 2.0625, "text": "I just want to snoop around the shop I don’t have anything to submit"}]...
|
Title: Untitled project by @penguinissus | Stardan Title: Untitled project by @penguinissus | Stardance
Devlogs:
I just want to snoop around the shop I don’t have anything to submit...
|
1792958049.0798318
|
1793562849.0798318
|
|
70093
|
Typd by @Mehmet | Stardance
|
Mehmet
|
0
|
10.28
|
0
|
[]
|
[{"post_id": 80244, "ts": "202 [{"post_id": 80244, "ts": "2026-10-16T21:01:27Z", "hours": 10.2758, "text": "I’m building Typd: a local dictation app. You hold a key, talk, and finished, formatted text appears wherever your cursor is. It runs entirely on your computer in under 2 GB of VRAM or unified memory, works offline, and it’s free. Why: today’s best dictation apps need the internet, send your voice to the cloud, and ask you to trust whoever’s on the other end with it. And they’re genuinely great. Wispr Flow takes the messy things you say out loud and turns them into clear, well-formatted text. I wanted that without the cloud. My first attempt was a basic Wispr Flow clone. NVIDIA’s Parakeet (a 0.6B speech model) transcribed locally, then a free cloud API cleaned up the text: removing fillers, fixing structure. Only half of it was local. The transcript still left my machine, and everything depended on my connection. Running the cleanup LLM locally didn’t work either: it needed more VRAM than my laptop had, spilled into RAM, and got slow. Then I asked: why do dictation apps use two models at all? Every one that explains how it works, Wispr Flow included, describes the same pipeline: a speech recogniser, then a fine-tuned LLM that removes the “um”s, works out what you meant and writes it properly. My guess is that it’s just history. Good speech models and good LLMs both already existed, so apps glued them together. From first principles, though, the job is simple: audio goes in, finished text comes out. A second model only adds latency, memory and failure points. So why not one model that hears you and writes the final text directly? That’s Typd. I took an open speech model (Qwen3-ASR) and trained it so it doesn’t just transcribe, it writes: fillers and false starts gone, self-corrections resolved, lists and paragraphs where they belong. All the training so far ran on free GPUs. In blind tests on 66 of my own real dictations (judged by AI judges that didn’t know which app wrote what), Typd was preferred over Wispr Flow 27 times to 12, with 27 ties. It returns text about 0.4 s after I stop talking. What I’m working on next: structuring long, rambling speech better, and never losing something you said when you correct yourself mid-sentence. The hard part is that big LLMs are good at this because they know so much. A model that can explain anything from the height of the Eiffel Tower to photon spectra can work out what you meant. It’s like having a professor help you write a letter. But you can’t run a professor on a laptop. So Typd teaches a small model just that one skill, distilling what big models do for dictation into something that uses a sliver of your computer. Typd runs on Windows and macOS, 100% private, no internet needed. It comes in two sizes: a 1.7B-parameter version (about 2 GB) for machines that can spare it, and a lighter 0.6B version (under 1 GB) for everything else."}]...
|
Title: Typd by @Mehmet | Stardance
Devlogs:
I’m b Title: Typd by @Mehmet | Stardance
Devlogs:
I’m building Typd: a local dictation app. You hold a key, talk, and finished, formatted text appears wherever your cursor is. It runs entirely on your computer in under 2 GB of VRAM or unified memory, works offline, and it’s free. Why: today’s best dictation apps need the internet, send your voice to the cloud, and ask you to trust whoever’s on the other end with it. And they’re genuinely great. Wispr Flow takes the messy things you say out loud and turns them into clear, well-formatted text. I wanted that without the cloud. My first attempt was a basic Wispr Flow clone. NVIDIA’s Parakeet (a 0.6B speech model) transcribed locally, then a free cloud API cleaned up the text: removing fillers, fixing structure. Only half of it was local. The transcript still left my machine, and everything depended on my connection. Running the cleanup LLM locally didn’t work either: it needed more VRAM than my laptop had, spilled into RAM, and got slow. Then I asked: why do dictation apps use two models at all? Every one that explains how it works, Wispr Flow included, describes the same pipeline: a speech recogniser, then a fine-tuned LLM that removes the “um”s, works out what you meant and writes it properly. My guess is that it’s just history. Good speech models and good LLMs both already existed, so apps glued them together. From first principles, though, the job is simple: audio goes in, finished text comes out. A second model only adds latency, memory and failure points. So why not one model that hears you and writes the final text directly? That’s Typd. I took an open speech model (Qwen3-ASR) and trained it so it doesn’t just transcribe, it writes: fillers and false starts gone, self-corrections resolved, lists and paragraphs where they belong. All the training so far ran on free GPUs. In blind tests on 66 of my own real dictations (judged by AI judges that didn’t know which app wrote what), Typd was preferred over Wispr Flow 27 times to 12, with 27 ties. It returns text about 0.4 s after I stop talking. What I’m working on next: structuring long, rambling speech better, and never losing something you said when you correct yourself mid-sentence. The hard part is that big LLMs are good at this because they know so much. A model that can explain anything from the height of the Eiffel Tower to photon spectra can work out what you meant. It’s like having a professor help you write a letter. But you can’t run a professor on a laptop. So Typd teaches a small model just that one skill, distilling what big models do for dictation into something that uses a sliver of your computer. Typd runs on Windows and macOS, 100% private, no internet needed. It comes in two sizes: a 1.7B-parameter version (about 2 GB) for machines that can spare it, and a lighter 0.6B version (under 1 GB) for everything else....
|
1792958037.2917237
|
1793562837.2917237
|
|
70091
|
The Soft Space by @arushkalra52 | Stardance
|
arushkalra52
|
0
|
2.14
|
0
|
[]
|
[{"post_id": 80241, "ts": "202 [{"post_id": 80241, "ts": "2026-10-16T20:31:01Z", "hours": 2.1439, "text": "Built and launched The Soft Space official website"}]...
|
Title: The Soft Space by @arushkalra52 | Stardance Title: The Soft Space by @arushkalra52 | Stardance
Devlogs:
Built and launched The Soft Space official website...
|
1792958035.6403208
|
1793822035.6403208
|
|
67724
|
DQM by @tanzeemrockz | Stardance
|
tanzeemrockz
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T20:30:25Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "DQM (Deterministic Query Model) A lightweight, trie-based lookup engine that traverses pre-built JSON “brains”. What is DQM? Instead of using power and resource-hungry, slow LLMs, We can now clear doubts using this lookup engine that walks through a pre-built “brain” ( .tqm format). Try it out: Official Page Overview Why does DQM exist? You may ask, why does DQM exist? The short answer is, accuracy and speed. I was tired of seeing people using AI for the most trivial things — “How hot is the sun? How deep is the sea?”, these are in fact very simple questions and there should’ve been a better alternative. Sure, search engines exist for a reason but many people have stopped using them and moved over to AI — Search engines themselves are starting to implement AI heavily into them. I was tired of it providing wrong answers and making-up stuff that are simply – not real. So now, we have DQM . Our guarantees We guarantee zero-hallucinations, fully predictable, and absolute offline capability. But any community-made brains are not guarenteed these qualities — as they will turn out to be the brain developers’ fault. How it works Step 1 — Normalisation : Lowercases, expands slang/contractions, removes repeated characters that serve no purpose, strips punctuation, and normalises delimiters. Step 2 — Trie Traversal : Splits the normalised queries into tokens and walks through the dictionary nodes. Step 3 — Resolution : Returns the string leaf, picks randomly if the leaf is an array, or throws clear status messages ( Path not found... or Incomplete query... ) The .tqm brain schema Nothing fancy, just good ole JSON Example: { \"brain_id\" : \"custom_core\" , \"version\" : \"1.0.0\" , \"author\" : \"John Doe\" , \"info\" : \"Rocket science, quantum physics, etc...\" , \"description\" : \"Custom brain for Rocket Science and Quantum Physics\" , \"licence\" : \"CC-BY-NC-SA-4.0\" , \"compatibility\" : \">=2.1.0\" , \"routes\" : { ... } } CLI Commands: Interactive brain selector on startup, cls/clear clears the screen, and exit/quit to quit.", "repo": "https://github.com/tanzeemrockz/DQM", "demo": "https://dqm.cyberslayercorpz.dev/"}]...
|
[{"post_id": 80238, "ts": "202 [{"post_id": 80238, "ts": "2026-10-16T20:26:19Z", "hours": 0.9581, "text": "Hey people! I just wrote the README and now, I’m ready to ship. Wish me luck!"}, {"post_id": 80196, "ts": "2026-10-16T17:37:07Z", "hours": 1.1003, "text": "GUYS! I just added a web-demo using python, js, and html using vercel beta python runtime! please do check it out at https://dqm.cyberslayercorpz.dev/"}, {"post_id": 79782, "ts": "2026-10-15T11:59:04Z", "hours": 1.2731, "text": "guys, i just built a web page (html + css + tailwind) for DQM it’s still in localhost but I’m deploying it in a bit (be sure to visit “dqm.cyberslayercorpz.dev”!)"}, {"post_id": 79327, "ts": "2026-10-13T15:20:11Z", "hours": 1.5156, "text": "heyya! I just added more features and bug-fixes. wanna see? :D Changelog (v2.1.0) Added support for external brains (brains to be placed inside /brains directory) Added standard metadata for every .tqm brain Added more aliases Improved the main.tqm brain Added a brain selector (runs on startup) Added a compatibility checker so newer brains don’t break inside an older engine Added a licence checker (cuz why not) Added a startup greeting function (not exactly but it greets you now) Fixed a few syntax issues and bugs I think that’s it! I’m looking forward to making this drastically better and maybe add a webUI or create a webpage so we’ll see! :D"}, {"post_id": 79083, "ts": "2026-10-12T16:21:36Z", "hours": 1.04, "text": "guys, i just fixed a few bugs now. wanna see what i did? :D Changelog (v2.0.1): Fixed punctuation engine in nodes.py Added more aliases Fixed a few things so each leaf has more than one response and use random.choice() to pick one Expanded main.tqm drastically (that was done in the last commit itself but i didn’t write a devlog lol) Resolved issue where if you were outside the project directory, the brain won’t load but now it will. Added more attention to detail and now it shows you info about the brain, etc… I guess that’s it! :D"}, {"post_id": 78331, "ts": "2026-10-10T13:54:28Z", "hours": 0.7672, "text": "guys so i just added a punctuation system that translates “who’s” to “who is” and so on and added a few responses to every tree so if you say “hi” first time it’ll give you a response and the next time, it’ll give you another response by importing random. I have also made the “brain” (main.tqm) HUGE with a LOT of data (the brain was written by gemini so shout out flash 3.8!) and that’s it for now!"}, {"post_id": 78110, "ts": "2026-10-09T16:16:38Z", "hours": 1.5, "text": "Sup folks! So this is the first devlog for this project. This is DQM otherwise known as Deterministic Query Model. So basically this is an old technique where you split a prompt into words and compare against a tree file (.tqm but it’s just a json file lol) and goes thru. E.g. “who is max verstappen” goes thru “who” > “is” > “max” > “verstappen” then finds the answer inside and tells you it. This is all hardcoded and you can change the stuff inside these so-called “brains”. This project is made in python (i’m a newbie and i’m learning along the way) and I used google gemini to write all the “brains” because it’s way too much work for my “potato brain” lol. So python was really sweet and looking forward to adding more features. Cya!"}]...
|
Title: DQM by @tanzeemrockz | Stardance
Devlogs:
Title: DQM by @tanzeemrockz | Stardance
Devlogs:
Sup folks! So this is the first devlog for this project. This is DQM otherwise known as Deterministic Query Model. So basically this is an old technique where you split a prompt into words and compare against a tree file (.tqm but it’s just a json file lol) and goes thru. E.g. “who is max verstappen” goes thru “who” > “is” > “max” > “verstappen” then finds the answer inside and tells you it. This is all hardcoded and you can change the stuff inside these so-called “brains”. This project is made in python (i’m a newbie and i’m learning along the way) and I used google gemini to write all the “brains” because it’s way too much work for my “potato brain” lol. So python was really sweet and looking forward to adding more features. Cya!
guys so i just added a punctuation system that translates “who’s” to “who is” and so on and added a few responses to every tree so if you say “hi” first time it’ll give you a response and the next time, it’ll give you another response by importing random. I have also made the “brain” (main.tqm) HUGE with a LOT of data (the brain was written by gemini so shout out flash 3.8!) and that’s it for now!
guys, i just fixed a few bugs now. wanna see what i did? :D Changelog (v2.0.1): Fixed punctuation engine in nodes.py Added more aliases Fixed a few things so each leaf has more than one response and use random.choice() to pick one Expanded main.tqm drastically (that was done in the last commit itself but i didn’t write a devlog lol) Resolved issue where if you were outside the project directory, the brain won’t load but now it will. Added more attention to detail and now it shows you info about the brain, etc… I guess that’s it! :D
heyya! I just added more features and bug-fixes. wanna see? :D Changelog (v2.1.0) Added support for external brains (brains to be placed inside /brains directory) Added standard metadata for every .tqm brain Added more aliases Improved the main.tqm brain Added a brain selector (runs on startup) Added a compatibility checker so newer brains don’t break inside an older engine Added a licence checker (cuz why not) Added a startup greeting function (not exactly but it greets you now) Fixed a few syntax issues and bugs I think that’s it! I’m looking forward to making this drastically better and maybe add a webUI or create a webpage so we’ll see! :D
guys, i just built a web page (html + css + tailwind) for DQM it’s still in localhost but I’m deploying it in a bit (be sure to visit “dqm.cyberslayercorpz.dev”!)
GUYS! I just added a web-demo using python, js, and html using vercel beta python runtime! please do check it out at https://dqm.cyberslayercorpz.dev/
Hey people! I just wrote the README and now, I’m ready to ship. Wish me luck!
Ships:
DQM (Deterministic Query Model) A lightweight, trie-based lookup engine that traverses pre-built JSON “brains”. What is DQM? Instead of using power and resource-hungry, slow LLMs, We can now clear doubts using this lookup engine that walks through a pre-built “brain” ( .tqm format). Try it out: Official Page Overview Why does DQM exist? You may ask, why does DQM exist? The short answer is, accuracy and speed. I was tired of seeing people using AI for the most trivial things — “How hot is the sun? How deep is the sea?”, these are in fact very simple questions and there should’ve been a better alternative. Sure, search engines exist for a reason but many people have stopped using them and moved over to AI — Search engines themselves are starting to implement AI heavily into them. I was tired of it providing wrong answers and making-up stuff that are simply – not real. So now, we have DQM . Our guarantees We guarantee zero-hallucinations, fully predictable, and absolute offline capability. But any community-made brains are not guarenteed these qualities — as they will turn out to be the brain developers’ fault. How it works Step 1 — Normalisation : Lowercases, expands slang/contractions, removes repeated characters that serve no purpose, strips punctuation, and normalises delimiters. Step 2 — Trie Traversal : Splits the normalised queries into tokens and walks through the dictionary nodes. Step 3 — Resolution : Returns the string leaf, picks randomly if the leaf is an array, or throws clear status messages ( Path not found... or Incomplete query... ) The .tqm brain schema Nothing fancy, just good ole JSON Example: { "brain_id" : "custom_core" , "version" : "1.0.0" , "author" : "John Doe" , "info" : "Rocket science, quantum physics, etc..." , "description" : "Custom brain for Rocket Science and Quantum Physics" , "licence" : "CC-BY-NC-SA-4.0" , "compatibility" : ">=2.1.0" , "routes" : { ... } } CLI Commands: Interactive brain selector on startup, cls/clear clears the screen, and exit/quit to quit....
|
1793155834.1089678
|
1793242234.1089678
|
|
70082
|
Wifi analyzer by @Siyam | Stardance
|
Siyam
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T20:23:20Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Wifi-analyzer-in-python This is a python code that analyzes wifi connection and gives you a proper output to know how to get better speed. it shows you a proper graph instead just dbi numbers. It uses some blocks and many librarys to get better wifi signal. Here you can download it : Type in your terminal : pip install -i https://test.pypi.org/simple/ Wifi-Analyzer For run : python -m analyzer", "repo": "https://github.com/Tanzil-Alam/Wifi-analyzer-in-python", "demo": "https://test.pypi.org/project/Wifi-Analyzer/"}]...
|
[{"post_id": 80236, "ts": "202 [{"post_id": 80236, "ts": "2026-10-16T20:22:22Z", "hours": 0.9425, "text": "Finalized the code and published in TestPyPI and runned github workflow. everything is done at all. i will ship it now….."}, {"post_id": 80201, "ts": "2026-10-16T18:20:44Z", "hours": 1.1989, "text": "Made the simulated graph of the analyzer. Made in python code, (looks like cava)"}]...
|
Title: Wifi analyzer by @Siyam | Stardance
Devlog Title: Wifi analyzer by @Siyam | Stardance
Devlogs:
Made the simulated graph of the analyzer. Made in python code, (looks like cava)
Finalized the code and published in TestPyPI and runned github workflow. everything is done at all. i will ship it now…..
Ships:
Wifi-analyzer-in-python This is a python code that analyzes wifi connection and gives you a proper output to know how to get better speed. it shows you a proper graph instead just dbi numbers. It uses some blocks and many librarys to get better wifi signal. Here you can download it : Type in your terminal : pip install -i https://test.pypi.org/simple/ Wifi-Analyzer For run : python -m analyzer...
|
1793199031.7167444
|
1793285431.7167444
|
|
69900
|
My very own WebOS by @CookieePie | Stardance
|
CookieePie
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T20:17:17Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have Built this Web OS from Scratch with the Style of being simple and Cool", "repo": "https://github.com/Devrince/Personal-OS", "demo": "https://devrince.github.io/Personal-OS/"}]...
|
[{"post_id": 80232, "ts": "202 [{"post_id": 80232, "ts": "2026-10-16T20:02:15Z", "hours": 0.42, "text": "Done with CSS and Java !!!"}, {"post_id": 80211, "ts": "2026-10-16T19:14:01Z", "hours": 0.8664, "text": "code first part done!!"}, {"post_id": 80163, "ts": "2026-10-16T14:09:28Z", "hours": 0.5822, "text": "writing the code"}]...
|
Title: My very own WebOS by @CookieePie | Stardanc Title: My very own WebOS by @CookieePie | Stardance
Devlogs:
writing the code
code first part done!!
Done with CSS and Java !!!
Ships:
I have Built this Web OS from Scratch with the Style of being simple and Cool...
|
1793156163.5713778
|
1793242563.5713778
|
|
69493
|
Not-AnEngine by @Alaxtor | Stardance
|
Alaxtor
|
0
|
5.41
|
0
|
[]
|
[{"post_id": 80230, "ts": "202 [{"post_id": 80230, "ts": "2026-10-16T20:01:28Z", "hours": 0.9803, "text": "Need to add better walking animation and make it work then work on the levels before the 20th"}, {"post_id": 80085, "ts": "2026-10-16T05:51:48Z", "hours": 1.1594, "text": "AHhhhhhhh trying to turn left makes it turn right and truning right truns right"}, {"post_id": 79994, "ts": "2026-10-15T20:28:33Z", "hours": 1.6239, "text": "So made and finished up my character design and his movement in movement. so we have left trun, right turn,walk left, walk right and idle"}, {"post_id": 79705, "ts": "2026-10-15T04:01:43Z", "hours": 0.6122, "text": "Made turning right character for my game now need to make his walking animation.Took 30 mins 😭😭😭"}, {"post_id": 79401, "ts": "2026-10-13T20:19:47Z", "hours": 1.0358, "text": "SO created the firsst level but my 1 hour of time was logged ofr some reason ig have to use lapse form now on"}]...
|
Title: Not-AnEngine by @Alaxtor | Stardance
Devlo Title: Not-AnEngine by @Alaxtor | Stardance
Devlogs:
SO created the firsst level but my 1 hour of time was logged ofr some reason ig have to use lapse form now on
Made turning right character for my game now need to make his walking animation.Took 30 mins 😭😭😭
So made and finished up my character design and his movement in movement. so we have left trun, right turn,walk left, walk right and idle
AHhhhhhhh trying to turn left makes it turn right and truning right truns right
Need to add better walking animation and make it work then work on the levels before the 20th...
|
1792857050.4672391
|
1793461850.4672391
|
|
67753
|
Personal site V2 by @potipek | Stardance
|
potipek
|
2
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T20:00:36Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I added Zoho helpdesk for livechat and support (mainly for testing for upcoming website for Dragons World: Legacy) and also made an announcement that DSW is running natively on windows android and ios, it was not released yet tho, you can check the about me section if you want! byeeeee", "repo": "https://github.com/tomk1440-cmyk/personal-site-v2", "demo": "https://www.konopasek.dev"}, {"ship_num": 2, "ts": "2026-10-04T09:53:23Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My new vebsite has a new style, age counter, basic button and some text animations, multiple categories and much more! It is made to represent me! It has categories “about me” and “my hobbies” It covers a lot of things. I will read almost every feedback so i can know what to improve!", "repo": "https://github.com/tomk1440-cmyk/personal-site-v2", "demo": "https://www.konopasek.dev"}]...
|
[{"post_id": 80228, "ts": "202 [{"post_id": 80228, "ts": "2026-10-16T19:58:21Z", "hours": 0.6669, "text": "Zoho + Announcement, next is going to be progress report on Dragons World: Legacy"}, {"post_id": 76672, "ts": "2026-10-04T09:49:05Z", "hours": 2.6644, "text": "My personal website v2 ship! This website is an upgraded version of my personal site. it’s hosted via cloudflare pages under my domain konopasek.dev. I want to represent myself so that was why I made it! It has a counter that displays my age. Bye!"}]...
|
Title: Personal site V2 by @potipek | Stardance
D Title: Personal site V2 by @potipek | Stardance
Devlogs:
My personal website v2 ship! This website is an upgraded version of my personal site. it’s hosted via cloudflare pages under my domain konopasek.dev. I want to represent myself so that was why I made it! It has a counter that displays my age. Bye!
Zoho + Announcement, next is going to be progress report on Dragons World: Legacy
Ships:
My new vebsite has a new style, age counter, basic button and some text animations, multiple categories and much more! It is made to represent me! It has categories “about me” and “my hobbies” It covers a lot of things. I will read almost every feedback so i can know what to improve!
I added Zoho helpdesk for livechat and support (mainly for testing for upcoming website for Dragons World: Legacy) and also made an announcement that DSW is running natively on windows android and ios, it was not released yet tho, you can check the about me section if you want! byeeeee...
|
1793217129.6978817
|
1793303529.6978817
|
|
61371
|
combopad by @nathany100 | Stardance
|
nathany100
|
0
|
4.79
|
0
|
[]
|
[{"post_id": 80220, "ts": "202 [{"post_id": 80220, "ts": "2026-10-16T19:45:17Z", "hours": 0.4403, "text": "Devlog #5! (srry guys for the long wait T^T my computer broke and after i got a new one, i had loads of other ysws and forgot about this one) Ok so i finished the basic code for the macropad, uh thats it bye :>"}, {"post_id": 70794, "ts": "2026-09-19T19:38:32Z", "hours": 1.4508, "text": "Devlog #4! okok so this is probably going to be the last time im adding any components into the pcb because gah dayum rearranging and rewiring takes so long Stuff done: added oled screen rearranged layout of pcb to fit oled rewired pcb AGAIN >:( absolutely locked in on onshape modelling (even though it was freezing up every 5 seconds) (is it me or does it kinda look like a calculator )"}, {"post_id": 70591, "ts": "2026-09-19T12:31:59Z", "hours": 0.3439, "text": "Devlog #3 stuff done added rotary encoder wired schematics updated pcb (again)"}, {"post_id": 70584, "ts": "2026-09-19T12:08:32Z", "hours": 0.4753, "text": "Devlog #2 I basically proceeded to discard most of the stuff from the previous tutorial (since im making a 9-key macropad) but i made this keyboard matrix and a rewired pcb"}, {"post_id": 68525, "ts": "2026-09-15T08:19:06Z", "hours": 2.0806, "text": "Macropad Devlog #1! (Ok so i did a LOT of work in one day and completely forgot to devlog any of it, so ill spread out my progress over several logs.) Since this was my 1st time using KiCad, I followed the hackpad guide and familiarised myself with the software. Also ty to my friend @RishitJain for teaching me a lot of the stuff used in kicad"}]...
|
Title: combopad by @nathany100 | Stardance
Devlog Title: combopad by @nathany100 | Stardance
Devlogs:
Macropad Devlog #1! (Ok so i did a LOT of work in one day and completely forgot to devlog any of it, so ill spread out my progress over several logs.) Since this was my 1st time using KiCad, I followed the hackpad guide and familiarised myself with the software. Also ty to my friend @RishitJain for teaching me a lot of the stuff used in kicad
Devlog #2 I basically proceeded to discard most of the stuff from the previous tutorial (since im making a 9-key macropad) but i made this keyboard matrix and a rewired pcb
Devlog #3 stuff done added rotary encoder wired schematics updated pcb (again)
Devlog #4! okok so this is probably going to be the last time im adding any components into the pcb because gah dayum rearranging and rewiring takes so long Stuff done: added oled screen rearranged layout of pcb to fit oled rewired pcb AGAIN >:( absolutely locked in on onshape modelling (even though it was freezing up every 5 seconds) (is it me or does it kinda look like a calculator )
Devlog #5! (srry guys for the long wait T^T my computer broke and after i got a new one, i had loads of other ysws and forgot about this one) Ok so i finished the basic code for the macropad, uh thats it bye :>...
|
1793040571.6727066
|
1793645371.6727066
|
|
41509
|
My simple macropad by @waffles888 | Stardance
|
waffles888
|
0
|
13.71
|
0
|
[]
|
[{"post_id": 80214, "ts": "202 [{"post_id": 80214, "ts": "2026-10-16T19:22:34Z", "hours": 0.4833, "text": "Devlog 5 - Encoder cover I spent a short while just making a nice cover for the encoder on the pad, didn’t take me ages now that I’ve gotten a bit better at fusion. I think I will have to model my own key caps because none still seem to fit."}, {"post_id": 80014, "ts": "2026-10-15T23:56:28Z", "hours": 6.6464, "text": "Devlog 4 - The Pad The parts for my kit finally came recently and I got some time to put it together. After a while of assembling I finally flashed my firmware and got it all working, its the first time I’ve ever really soldered stuff and in my opinion its came out great. However I have ran into some issues, I completely forgot to record my assembly in lapse, my PCB doesn’t even fit into my case and the cut out for the screen was too small. On top of this the switches were so close together I had to snip the ends off. I have gone back through and just sorted the cut out of the screen and added some nice curves around the edges to make it overall nicer. I think the next things I do before I ship will be making sure it fits in the case, making a knob for the encoder and maybe making some really small keycaps due to my mistake of putting the switches so close"}, {"post_id": 64732, "ts": "2026-09-09T11:15:19Z", "hours": 4.4458, "text": "Devlog 3 - The Case After completing the schematic and the PCB I moved onto designing the case. This took me a while as this was the first time I had try to model something. I looked between onshape and fusion however fusion ultimately seemed to be the best software to use. After getting a slight understanding of the tool I made the case and it come out very nice. Next is the actual software."}, {"post_id": 39139, "ts": "2026-08-01T21:02:56Z", "hours": 0.9333, "text": "Devlog 2 - The PCB I went back and adjusted the schematic and removed the status LED as I was out of pins on the Seedunio and needed one more for the button press of the rotary encoder. From there I moved on to making the PCB design. This was hard and took me a few attempts to get wired correctly running into different issue where the traces would overlap leading me to be unable to connect them to the Seedunio. I finally finished the PCB design by adding the final M3 mounting holes for the case."}, {"post_id": 38104, "ts": "2026-07-31T10:01:54Z", "hours": 1.2, "text": "Devlog 1 - The Schematic I started off my Hackpad today, this was designed around the Seeeduino. I decided I wanted 6 buttons, a rotary encoder, a little screen which I can utilise later and finally a little LED to be used as a status light to help understand what state the Hackpad is in. I spent about an hour making this schematic but most were spent in ensuring that the ERC would run correctly without any errors such as something stating its not connected while being connected. Finally, I finished the the schematic with a ERC with zero errors so next is the PCB layout. This was the first schematic I have ever made for a PCB so it definitely took longer that it maybe needed to"}]...
|
Title: My simple macropad by @waffles888 | Stardan Title: My simple macropad by @waffles888 | Stardance
Devlogs:
Devlog 1 - The Schematic I started off my Hackpad today, this was designed around the Seeeduino. I decided I wanted 6 buttons, a rotary encoder, a little screen which I can utilise later and finally a little LED to be used as a status light to help understand what state the Hackpad is in. I spent about an hour making this schematic but most were spent in ensuring that the ERC would run correctly without any errors such as something stating its not connected while being connected. Finally, I finished the the schematic with a ERC with zero errors so next is the PCB layout. This was the first schematic I have ever made for a PCB so it definitely took longer that it maybe needed to
Devlog 2 - The PCB I went back and adjusted the schematic and removed the status LED as I was out of pins on the Seedunio and needed one more for the button press of the rotary encoder. From there I moved on to making the PCB design. This was hard and took me a few attempts to get wired correctly running into different issue where the traces would overlap leading me to be unable to connect them to the Seedunio. I finally finished the PCB design by adding the final M3 mounting holes for the case.
Devlog 3 - The Case After completing the schematic and the PCB I moved onto designing the case. This took me a while as this was the first time I had try to model something. I looked between onshape and fusion however fusion ultimately seemed to be the best software to use. After getting a slight understanding of the tool I made the case and it come out very nice. Next is the actual software.
Devlog 4 - The Pad The parts for my kit finally came recently and I got some time to put it together. After a while of assembling I finally flashed my firmware and got it all working, its the first time I’ve ever really soldered stuff and in my opinion its came out great. However I have ran into some issues, I completely forgot to record my assembly in lapse, my PCB doesn’t even fit into my case and the cut out for the screen was too small. On top of this the switches were so close together I had to snip the ends off. I have gone back through and just sorted the cut out of the screen and added some nice curves around the edges to make it overall nicer. I think the next things I do before I ship will be making sure it fits in the case, making a knob for the encoder and maybe making some really small keycaps due to my mistake of putting the switches so close
Devlog 5 - Encoder cover I spent a short while just making a nice cover for the encoder on the pad, didn’t take me ages now that I’ve gotten a bit better at fusion. I think I will have to model my own key caps because none still seem to fit....
|
1792806837.168993
|
1793411637.168993
|
|
70066
|
doomsday cyberdeck by @Adnancyberdeck | Stardance
|
Adnancyberdeck
|
0
|
0.78
|
0
|
[]
|
[{"post_id": 80206, "ts": "202 [{"post_id": 80206, "ts": "2026-10-16T18:50:07Z", "hours": 0.7836, "text": "doomsday inspired cyberdeck"}]...
|
Title: doomsday cyberdeck by @Adnancyberdeck | Sta Title: doomsday cyberdeck by @Adnancyberdeck | Stardance
Devlogs:
doomsday inspired cyberdeck...
|
1792958006.2333739
|
1793562806.2333739
|
|
25644
|
rlbuddy by @kmdw | Stardance
|
kmdw
|
3
|
185.95
|
2643
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-28T00:20:30Z", "hours": 40.0, "multiplier": 18.76, "payout": 740, "blessing": "neutral", "text": "I made rlbuddy, a rocket league companion app! This is the third ship so far. The big features this time are the asset swapper and Linux support, but I think that the feature I’m most proud of this time is the asset swapper! It inserts the appearance of one item into the file of another, meaning by swapping out assets for others you can make your car look however you like! (Client-side only, of course). I learned a lot about byte-level manipulation and working with raw data streams and encryption/decryption in Rust, and I can read hex (relatively) well now! It’s also great because I think this combined with the doorstop experiment from a while ago gives me a nice base to try some reverse-engineering challenges in the future. I also worked a lot on performance this time, such as tuning loop times/ui fps caps and minimizing ram usage (I achieved around an 80% reduction here!) There are a crap ton more features added than that (totaling almost 100 commits), but I’m pretty sure you’re not supposed to have massive feature-dumps on the ship text. So the full list is on the latest github release! In the image, you can see I have a white fennec. In reality, I don’t actually have a tw trim, and the equipped decal isn’t compatible with the fennec either. But, using the power of asset swapping, I can get a beautiful all-white car. Neat!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}, {"ship_num": 2, "ts": "2026-09-07T20:33:21Z", "hours": 27.0, "multiplier": 16.74, "payout": 457, "blessing": "neutral", "text": "rlbutddy is a feature-rich companion for Rocket League, and v1.2 is out. There’s been some big architectural changes meaning it’s faster and bug-free-er, as well as big new features! New!!! Avatars! Now you can see people’s profile pictures even when you’re not on their platform. Custom map loader! You can import maps from a ZIP or download them straight from Bakkesplugins! Gamepad overlay! Show your controls while playing, to show off your bindings or get some help with your speedflips. I think I’ve definitely improved at Rust since the last release. Just in terms of the amount of mistakes I make, I feel like it’s way more smooth sailing than before. For example, I was able to (mostly) write not-so-buggy code and “run the borrow checker in my head” without needing to cargo check a million times, and clippy tends to have a lot less suggestions for me. Pretty great!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}, {"ship_num": 3, "ts": "2026-08-25T22:08:36Z", "hours": 109.0, "multiplier": 17.59, "payout": 1446, "blessing": "neutral", "text": "rlbuddy is a feature-filled companion for Rocket League! It shows the skill of everyone in your lobby and has tons of toggleable widgets and features to make your life a lot easier, from Discord integration to music control. This is my first non-tiny Rust project, and I think it was really great! I’ve learned a lot such as proper state management and the ins and outs of Rust’s syntax. You can give it a try by heading to the Github releases section. If you play Rocket League, I hope you use it!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}]...
|
[{"post_id": 80191, "ts": "202 [{"post_id": 80191, "ts": "2026-10-16T17:13:05Z", "hours": 3.4819, "text": "more small improvements. i gave the session stats widget an actual service as well which speeds things up a lot since its not recalculating statistics every single frame. the swapper also uses the backup file if one is available and it no longer accepts duplicate custom maps"}, {"post_id": 77292, "ts": "2026-10-06T13:38:54Z", "hours": 0.4772, "text": "A few fixes here and there. Some refactors, caching externally loaded playlists in savedata, and fixing a deadlock when clearing the items cache. And for some reason the decal option was missing from the items list picker."}, {"post_id": 75881, "ts": "2026-10-01T13:48:20Z", "hours": 5.9928, "text": "I made a standalone web-based swapper for the people who don’t want to download an entire app. A lot of people had broken packages after the last update but didn’t want to install a dedicated program just for a few swaps. So, I used the asset swapper backend of rlbuddy to make this thingamabob which runs entirely in the browser! First, I had to find out how to actually share rlbuddy’s asset swapper with other projects. Turns out Cargo has a cool thing called workspaces where you can have multiple crates in the same repo! So I moved the dedicated UPK/AES etc. stuff into a new crate and added it as a dependency in regular rlbuddy. Then, I whipped up a small wasm-compatible eframe app with the template, and included the new crate as a dependency. I made a big state machine of the steps meaning it’s impossible to have an invalid state, which is really nice. The only problem was that Rust’s ownership system isn’t smart enough to deal with it, so the code is a bit repetitive in places but it’s definitely worth it. The WASM restrictions were super annoying, mainly do to with filesystem access and requiring async. I ended up using the egui-async crate and spilling Binds all over the place within the state machine. I couldn’t even figure out how to get the actual swap procedure to run in a different thread. I also spent like 30 minutes debugging why in the world asset swapping was just broken. Even when I verified the same binary data were going in to the Upk object in the webapp and rlbuddy, for some reason the output upk was just different. Turns out I used chosen_replacement.name instead of chosen_replacement.package.name() . Isn’t that great? Anyways, it works fine now and I’m planning on posting it on r/RocketLeagueMods and possible r/RocketLeague."}, {"post_id": 74679, "ts": "2026-09-27T23:46:54Z", "hours": 3.0297, "text": "Not much in terms of super-cool stuff this time. Highlights are: make sure dynamic playlist loading uses the latest cache file (and also fix its loading on normal people’s rocket league installs) loading the cache file on another thread so it doesnt freeze the whole app for a second on the first lazy lock access searching for items in the item swapper moved the error handling of the map loader to anyhow So no ultra-exciting things to talk about. anyhow is really cool though, it really simplifies error handling everywhere in the app, and I’m a big fan of its bail! macro. I’m also using Cow a lot more. Moo!"}, {"post_id": 73444, "ts": "2026-09-25T03:22:46Z", "hours": 4.635, "text": "I got licensee version 34 (encrypted payloads too) to swap finally! Okay, so this was awesome. Rocket League’s been having a bunch of updates lately, which breaks the packages of people trying to get free stuff. So, in a Reddit thread, I ended up dishing out a bunch of swapped asset files for people in this situation. There’s a new boost which everybody wanted really bad since it was really rare (but they decided to make it unlockable at rocket pass lv99 so it doesn’t even matter anymore), and it was UNSWAPPABLE for three reasons: it was encrypted specially i hadnt encountered specially encrypted packages meaning their handling was wrong aes keys werent out for it yet (or so I thought) I’ll start with 3. I had written a tool which looks in the games cache for AES keys, and dumped them, and it worked great. What I didn’t expect is the filename to change between versions. So, I was super confused since yesterday since the AES key for the boost was just… missing. Thankfully, the geniuses at the RLMM discord got it and helped me figure out that the file I was reading from was just outdated. Great! Anyways, not too big of a deal, just a big delay. Now it’s time for the real challenge: figuring out how the hell to handle this type of package. First, I did some research. The twelve bytes of padding in files with licensee version >=33 before the summary are actually a nonce/aes iv, not just padding. Then, the header is encrypted with AES-CTR with the twelve first bytes of the iv just being the nonce. And the compressed chunks are encrypted too here: each one is also AES-CTRed with their own nonces in FCompressedChunkInfo. Thing is, I don’t have an implementation to really go off anymore, meaning there’s a lot more trial and error. For the original implementation, there were one or two existing asset swappers (though they were vibecoded meaning more of a puzzle to figure out what they’re even doing), but this time I was mostly relying on emii’s fork of UEViewer. Anyways, after spending a while figuring out what exactly I had to masquerade (payload, key, swap nonces) I finally got it to work!"}, {"post_id": 72491, "ts": "2026-09-23T02:26:44Z", "hours": 1.8381, "text": "rlbuddy now loads additional playlists straight from the game’s cached webconfig, instead of hardcoding them all! This means that the list of playlists will basically never go out of date. There are actually quite a few services which rely on game files (eg. auto stats api setup, custom maps, asset swapper). So, the first thing I did was to refactor it so make all of these load from the same global value. Then, for playlists, I made it read from a specific file in the game’s http cache directory which contains a bunch of configuration. Then, it parses it into a JSON object, grabs all the values with Class PlaylistSettings_TA, and then extracts the title and playlist id! There are still a bunch of built-in Playlists, since those have internal things like going from a casual playlist type to its respective competitive one or having the hard-coded list of singleplayer playlists. But, all the other ones, like ltms are dynamically loaded. Yay!"}, {"post_id": 72027, "ts": "2026-09-22T00:56:20Z", "hours": 3.9097, "text": "I made a ton of improvements to the asset swapper! And fixed a bug with the music player which is cool technically, so I’ll start with that. The player uses the GSMTC api, which is async, but egui doesn’t really like async. So, I made it so that every time you wanted to run some command on the current session, it would start up a new thread. This was less than ideal for a few reasons: terrible performance race conditions could happen just… in Windows itself The main problem was 2: for example, if you skipped a replay too fast, the Play command from the end of the replay might actually reach Windows before the Pause command from the replay start, leaving your music paused. So instead, it starts one dedicated worker thread which has a channel which receives a Box<dyn FnOnce(Session)> , and executes at most one command every 50ms (only one command per loop, fixed loop time of 50ms). It’s really interesting because you actually end up sending a closure through a channel, which feels funny but when you really think about it it’s just ownership semantics. But, that’s working great now! On to swapper improvements! First, I moved most of the swapper module to anyhow handling (it’s heaven!), and I also modernized the upk api a bit since it was basically dragged directly from the proof-of-concept repo, meaning it was not really application-ready. Also, it previously looked at the game’s webcache to decode the AES keys for header decryption, but now it uses the wonderful Toga-Files repository along with a really nice caching layer for it to load items and their associated API keys. Having access to the actual item data is also way better since you don’t have to manually type in a package name which is kinda weird for any normal person. Now, you can select it from a dropdown instead! I love UX."}, {"post_id": 71420, "ts": "2026-09-20T19:51:05Z", "hours": 4.5228, "text": "rlbuddy now has item swapping! Basically, making one item appear like another to use items you don’t actually own. These hours were spent on a few different things. Firstly, I optimized the thing a bunch! There were a few places that were pretty slow since the original repo was mainly for testing. For example instead of decrypting the entire header and rechecking it to find the right key, it only loads the first 4 blocks and attempts to decrypt the first FString. If it fails, that means the AES key isn’t valid. Also, I improved the error handling with anyhow. It actually makes it so much easier to deal with things and was pretty useful when debugging the move over to the actual app. Now I’m just going to work on polishing the panel UI a bit more, since it’s still kind of ugly."}, {"post_id": 70888, "ts": "2026-09-19T23:20:36Z", "hours": 2.1058, "text": "Apparently there are a bunch of different AES keys rocket league uses, not just one. You can get a list of them from the psynet config url, and then do some weird crc stuff to change them from “content keys” to aes keys. I discovered the rocket league mapmaking discord today and I’m blown away by the amount of information on there, and also apparently my whole thing about the unknown bytes when licensee version > 32 was straight up wrong, which is funny. Anyways it works for all items now, which is great. I’m gonna work on actually putting it in rlbuddy now, hopefully that goes well"}, {"post_id": 69896, "ts": "2026-09-18T01:01:05Z", "hours": 0.9667, "text": "IT WORKS WHEN THE HEADER EXPANDS NOW YAYAYYAYAYAYYAYAYYAYAYAY I’m gonna be honest, the problem might just have been that my testing package was corrupted. I was debugging my deserialization logic, which I thought might have some parsing issue near the header extraction, and noticed that once the encrypted region deserializer’s Cursor reached the end of the region, it was actually FARTHER than the package summary’s total_header_size - by 6 bytes! That’s pretty bad, and I don’t know how something like that even happened. Anyways, I repaired the game and brought over the shiny new upk and… it worked. I’m pretty sure that I only accidentally did this while tidying up my workspace a few hours ago, but if this has genuinely been the thing holding me back for the past few days - I also finally made the poc code public, at https://github.com/kalilamodow/rl-upk-testing/"}, {"post_id": 69850, "ts": "2026-09-17T22:15:40Z", "hours": 1.67, "text": "IT SWAPPED IT SWAPPED IT SWAPPED AHAHAHHAHAHAHHAHAHAHAHHA FINALLY Okay now I gotta make it work for other pairs of boosts. If WHEN that works, I’ll actually put it in rlbuddy. I removed all the code relating to changing offsets to try to give myself a minimal workspace to tinker in, with as little side effects as possible. So, all the current code does is 1. open them 2. replace the name table entries and package guid. Surprisingly simple. Once I make it a bit more generic, I can extend it to support more swaps. If I’m really unable to get it to work for more combinations, I’ll probably end up just publishing the poc repo and not adding swapping to rlbuddy at all. This is a great motivation boost, though. I was honestly dreading coming home to work on it today because I was done with failing over and over, and considering giving up."}, {"post_id": 68661, "ts": "2026-09-15T14:25:29Z", "hours": 2.6667, "text": "I got a name swap! It doesn’t work properly, but I’m glad the game didn’t crash. These hours have been by far the most frustrating because the only way to test is against the real game since it’s really picky, but the game takes like 30 seconds to start, and if it crashes, it gives a cryptic error log, and if it freezes, it doesn’t give any log at all. I spent most of the time messing with moving different offset values forward and backwards, and ended up reverting to a simpler version with no overwriting when the header size changes just to test things. So far, I’ve mostly gleaned that name renaming is possible, but only up to a point. If the name grows too much, the game crashes, and if the name shrinks too much, the game freezes. Additionally, for some reason, total_header_size changes by the padded header size instead of the encrypted header size, which I still don’t understand. It’s seriously weird. I serialize each name properly, and yet the game reads it wrong. This game really does need a new codebase. When UE6 comes out, either the game’s gonna be so good it doesn’t need mods, or it’ll be relatively easily moddable. Or neither, which is the most probable based on Epic Games’ track record. Anyways, enjoy the beautiful screenshot."}, {"post_id": 68281, "ts": "2026-09-14T20:49:26Z", "hours": 3.1181, "text": "I figured out what comes after export tables! And it took way too long, since I DISCOVERED IT MYSELF! At least, as far as I know. I couldn’t find any information online about this portion of the header, so it was basically luck that I noticed a pattern. Before, I was just copying everything after the export table and pasting them back in afterwards, but as you can guess, that stopped working if I adjusted anything within the encrypted region. Compressed chunk info is a known part, and I figured out the AES padding pretty easily, so most of the time was spent trying to figure out what in the world those 24 bytes were. The first four bytes in the compressed chunk info are how many chunks they are. Here, in the Bubbles boost package, there are two (little endian), with 24 bytes of ???. And in Flamethrower, there are three, with 36 bytes of ???. I noticed that the ??? was always n chunks * 12 bytes (actually, it’s lucky that I didn’t test any which ended up having 0, otherwise I probably wouldn’t have figured it out). Since this probably had something to do with chunks, I made a guess that each chunk had some extra data stored in this array, 12 bytes of info per chunk. Using HxD’s highlight-bytes-and-get-the-decimal-value feature, I noticed a pattern where the first 8 bytes looked like an i64 offset and the last 4 looked like an i32 size, which the compressed chunk infos were also like for their matching counterparts. So, I deserialized it as [i64; i32] * n chunks and was able to read it better. These additional chunk infos seem to kinda sorta match up to uncompressed header offsets, but I don’t really understand what they are (and they’re marked as such in the code, lol). So, with that working (and some fiddling with broken serialization of TArrays which I’m surprised I didn’t catch earlier), I now understood the ENTIRE package header! Hooray! Let’s look at another example. body_grain_SF, the Fennec, has 4 chunks. Guess how many bytes of ??? it has. That’s right, zero! For some reason, a few packages just don’t have those things. After going through a bunch of them, I found that if licensee version was 32, there was no ???. But if it was 33, there WAS ???. I basically just added an if statement and it was fixed. I’m going to try to work on figuring out the padding in between the package summary and the start of the name table, but if I can’t, I suppose I’ll finally get to actually doing package swapping. Later!"}, {"post_id": 67059, "ts": "2026-09-13T03:19:34Z", "hours": 2.9378, "text": "I JUST DESERIALIZED AND RESERIALIZED A UPK. OMAIGOD IM SO HAPPY. my brain is so tired. Alright so the payload still doesn’t get transferred but that’s pretty simple, it’s just Vec::extend. What a challenge! Deserialization actually ended up being the easy part, which is opposite of what I expected from starting the project. It went (relatively) fast since there are a few existing implementations which I could kinda just “borrow” structure parsing from. But, mine is unique in that it almost completely reserializes the package itself. I might’ve been able to “borrow” reserialization, but the impl I’ve been looking at is STRAIGHT ai slop and it’s more annoying to read that than to just do it myself. It was useful though, so I have to respect it. The first problem: basically, the first byte of an FString determines how many parts it has, NOT how many bytes it has. Which wasn’t a problem for parsing, since I had some word-based helpers which worked so I didn’t think much about it. But, when reserializing, I made two mistakes: 1. forgot to add the null terminator (which shouldn’t even be necessary) and 2. I accidentally put the wrong offset. I have no clue why there’s a null terminator for FStrings. The format is [n chars][the char bytes], meaning it should already be known how long the string is. Pretty stupid, but whatever. Anyways, when reserializing you’re supposed to include the null terminator in the string length marker. So, my logic was that I should offset it by two since unicode characters are two bytes. Bleh! I should’ve only incremented by one, since it’s in terms of utf16 chars rather than bytes. Yay, that worked! I don’t know how to summarize the next problem, so I’ll explain the reasoning. The package header is file summary + tables + something else (we’ll get to that later). Anyways, there’s some mysterious padding in between the summary and tables. Parsing, it’s easy to skip over because the summary includes the tables start offset ( name_offset , the name table is the first one). But when reserializing, you gotta keep those offsets intact. Well, I’m not totally sure if you actually have to keep them, but just for the sake of simplicity I tried to (which ended up adding more complexity, which I’ll see if I can remove now). So, I serialize/push the summary to the big Vec. Then, I make a new Vec and serialize the name table at (name_offset - summary_size), since the new Vec has to be encrypted and then appended to the big Vec. I do the same thing for imports/exports (placing the table at import/export _table_offset - summary_size ). Oh no! Since name_table_offset isn’t equal to summary_size, there’s some padding in between, which is expected. HOWEVER! The previous logic would skip over it in the table Vec creation, meaning the table Vec would have some 0-padding at the start. This padding needs to be in the SUMMARY part instead, and the name_offset should basically be the ZERO of the tables Vec! I doubt I would’ve been able to solve this part without the beautiful tool HxD . It’s really easy to use and is always helpful when I’m figgling around with binary. So, it does some more math, calculates the spacing, adds it to the big vec, and removes it from the tables Vec. Then, it re-encrypts the tables Vec and pushes it onto the big Vec! Okay, now that’s done. NOPE! There’s a mysterious structure for some reason at the end of the real table part? Yep, it’s that something else I said we’ll get to. I actually still have no idea what it is. From some research, I gathered it must be the dependencies table, but it’s really poorly documented. So, I ended up just cutting the bytes out from after the export table to the end of the tables part, and “pasting” it back before re-encryption. I do hope this devlog was readable. Now I’ll get to including the actual package payload and hopefully simplifying reserialization offsets. See you soon!"}, {"post_id": 66867, "ts": "2026-09-12T20:09:08Z", "hours": 2.0211, "text": "I’ve been putting this off for a while, but I’ve finally decided I’m going to add asset swapping. There’re a few existing implementations, so I’m reading those as well as some pdfs about the upk format. So basically credit to this document and this implementation . All it can do for now is parse the file summary. The implementation wasn’t too bad since I had Google as well as the C# implementation I just talked about. I basically have trait Deserializable : Sized { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > ; } Then implement that for the various parts (eg. FGuid , a generic TArray ). Then, I use byteorder to read out numbers into each struct. For example, #[derive(Debug)] struct FCompressedChunkInfo { uncompressed_offset : i64 , uncompressed_size : i32 , compressed_offset : i64 , compressed_size : i32 , } impl Deserializable for FCompressedChunkInfo { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > { Ok ( Self { uncompressed_offset : reader .read_i64 :: < LittleEndian > () ? , uncompressed_size : reader .read_i32 :: < LittleEndian > () ? , compressed_offset : reader .read_i64 :: < LittleEndian > () ? , compressed_size : reader .read_i32 :: < LittleEndian > () ? , }) } } I originally prototyped it in Python and then moved to Rust once I got tired of python’s byte shenanigans."}, {"post_id": 66219, "ts": "2026-09-11T22:03:11Z", "hours": 2.5883, "text": "I did lots of performance improvements and also IT WORKS ON LINUX NOW!!! Let’s talk about performance first. Anyways, it has been using around 4% and 220MB of ram, which isn’t really what you’d expect from an overlay! So, I used things like DHAT to profile the memory, and noticed that fonts were doing some shenanigans. So I removed egui_system_fonts and loaded directly from C:\\Windows\\Fonts\\segoeui.ttf and RAM usage dropped to 30mb. That was what the previous devlog was about. I then changed the default logic update rate from 10ms (100/s) to 65ms (15/s approx). This reduced idle cpu usage to under 0.2%. But, doing anything with the UI would spike it to 4%, which is still pretty bad. So, I used a method I found in an egui issue thread where I’d count the frametime since the last render, then sleep until the target frametime was finished. For example, if the frame rendered in 2ms but I want 16ms frametime, it would sleep for 14ms. That way, I could limit how often the UI rendered! This made it stay under around 1% CPU forever! Okay, Linux time! Rust is mostly cross-platform, so support was mostly dealing with dumbass design decisions. Since Music relies on GSMTC, I had to feature-gate the entire thing (as well as the windows/windows-future crates) behind cfg(windows) :( I also had to fix Linux font loading (since like I said earlier, it’s hardcoded to segoe ui). So I install fontdb on Linux and search for some popular fonts from there to load instead. Finally, I fixed up the storage paths since it could only load from AppData. I also made it use AppData\\Local vs. AppData\\Roaming instead of putting everything in Roaming. I first got it working through WSL! ! It took some messing with my GPU drivers but I got it to render. Now was the real challenge: getting it to build on an ACTUAL Linux machine. I had an old, basically broken Surface Pro 3 that I had put Debian+GNOME on for shits and giggles a few months ago. The perfect target! The main problem was getting Rocket League to even launch. I set up Legendary (goated launcher btw, check it out ) and tried to run it. I installed Wine, got Wine Mono, and it failed with a weird cryptic error about the CreateWindow function. The obvious solution to a graphical error: disable EAC. Yay, it launched! Then to get it to build. First I had to fix some filepaths since Linux is case-sensitive (nerds) while I don’t care about case on Windows. Then, rust-lld gave some weird error about simd or something which I didn’t care about. I just ran cargo clean and rebuilt it and it worked fine. Then to run, and it actually worked first try! It’s cool because I went into it expecting to debug a million socket errors, but it actuallly connected and ran. Awesome sauce! Now Linux users can use rlbuddy. More minions to contr- I mean cool users! Cya in the next one! ;) If you check out the rl perf overlay in the screenshot, you’ll be able to guess why this is the laptop I decided to put Linux on."}, {"post_id": 65417, "ts": "2026-09-10T15:25:20Z", "hours": 0.8867, "text": "I’ve been debugging high memory for the past month or so. It was egui_system_fonts. Why would fonts take 170mb of ram????????????????????????????????? help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! I hate external dependencies!!!!!!!!!!!!!!!!!!!!11 I owe my life to DHAT now. go star https://github.com/nnethercote/dhat-rs"}, {"post_id": 65067, "ts": "2026-09-09T22:28:11Z", "hours": 1.5, "text": "More gamepad overlay buttons!!! Yay!!! In not-so-awesomely-exciting news, I also added a table of contents to the readme (as well as a generator for it). The script’s in Python (I’m sorry for not using Rust) meaning the repository is now 0.5% Python. Takeover incoming? I overcomplicated the script a lot, but it’s really easy to read. There are three whole comments, aka 6% of lines in the whole file! It’s not technically interesting in the slightest. I was thinking of building a tree-like structure before outputting the string, but realized I can just use the header level (h1 vs h2 vs h3 etc) as the amount of spaces / 2. I also refactored it not to use magic PanelId s for the default panel list. I kinda rushed that part when I made it, I’ll be honest. But now each Panel can implement fn open_by_default(&self) -> bool (returns false by default) and if it does it keeps it open when savedata doesn’t exist yet. I don’t get how an entire hour n 27 minutes was spent on like 7 not-even-that-big commits. At least it was a good use of my math class. We reviewed limits for some reason (which everyone should already know for one because they took the prereqs?), and the teacher managed to extend her lecture for the ENTIRE class time. rlbuddy development saving the day, I guess (just like it will in your rocket league games btw, so you should download it)"}, {"post_id": 64822, "ts": "2026-09-09T14:32:38Z", "hours": 1.4469, "text": "I’ve mostly been working on smaller features, improvements, and bugfixes. A cool one I did is fixing weird glitchy movement with the gamepad overlay window! Basically, the window needs to persist its position across disabling it/enabling it. And egui is immediate mode. So, every time it rendered the viewport, it would both set and get its position. So, moving it would update the current position, but because of the weird interop between setting the position in a ViewportBuilder and getting it from the viewport info, it would glitch back and forth, especially when my laptop is lagging. I fixed it by only calling the ViewportBuilder ‘s “ with_position ” method when the overlay had just been enabled ( !was_enabled && currently_enabled ). That way, it only sets it once externally, and lets it move freely while it’s open. Then, while it’s moving, it continues to update the saved position. And upon closing and then reopening it, it sets it again (but only once!) Relatively simple fix but it’s kind of funny. I mainly noticed it when I added a feature that would auto-unmaximize the overlay when the user maximizes it, and it would go crazy and fly around the screen. Very fun! I also fixed a pretty old bug where it would incorrectly detect the local player. Basically, the stats api doesn’t actually tell you who the local player is. So, we have to guess based on who the camera is targeting right now. Usually, it’s on the local player, but during goal replays or spectating a bot when joining a casual game, it would be improperly set at the start and then stay like that. So, I made sure that it always updated as long as the match is 1. in progress 2. not in a replay. It also fixes a thing with inconsistent match toasts, since the toasts only fire if the scoring player is the local player (and if it thinks the wrong player is the local player, everything’s messed up). I’m planning on revamping hotkeys next, to allow you to bind to any controller button and even do custom quickchats in-game. Later!"}, {"post_id": 63368, "ts": "2026-09-07T04:36:35Z", "hours": 1.4131, "text": "Time formatting doesn’t suck anymore! I made the implementation way better so I could make it support stuff even past weeks, like months and years. The new implementation added around 60 lines, but it’s for a good cause. The previous implementation used a match statement with duplicated logic that only supported seconds, minutes, and hours, using a pluralize function and inline if-statements everywhere. If it were sent to any rational code-reviewer, they would likely have a heart attack. Now it’s a bit more complex but less complicated. You have TimeUnit s which format the unit themselves and TimePart s which format a value + a unit. Then, just use some math to build a Vec and format it into a string. Boom! Beautiful, well-formed time formatting. To soak in the new beauty, I added days n weeks. I just had to add 14 lines! The previous one would have probably needed a bunch of stupid magic numbers and weird chains everywhere to accomplish the same thing. Okay, I’m done using your time on reading a way-too-long write-up about fixing a crappy implementation that shouldn’t have been there in the first place. I’m gonna ship right after posting this. If you get it, make sure to give it 10 stars in everything 😉. Haha, jk. Well, not really. Cya later."}, {"post_id": 62559, "ts": "2026-09-06T00:29:40Z", "hours": 1.8697, "text": "Had to remove the tracker.gg widget :( unfortunately they don’t allow scraping and what I had wasn’t allowed anyways. Things that used to open the player info widget now just open tracker in a browser."}, {"post_id": 60965, "ts": "2026-09-03T17:23:52Z", "hours": 2.9253, "text": "I finished the big refactor! I pushed around 25 commits to GitHub at once. I’m really gonna enjoy adding the next feature, basking in how much easier it is ;) Apparently, I never made a service for session stats, so it currently can’t persist its one setting. Actually, writing this I realized that the setting isn’t actually used, so I can delete it. That’s great. After finally kicking out all the annoying legacy panel code, I remembered that I never re-implemented the positioning or its related persistence code for the new panel system. The persistence system was reworked too, something that I don’t think really got included in the previous devlog. Each service can implement save , and there are generic helper methods in a common module for saving/loading serde structs to a file in the app data directory. The actual app now uses this method as well instead of doing all the pathing logic itself, so the persistence module is pretty small and could honestly be moved into app.rs. For new positioning, I store a list of open panels. Weirdly enough, it’s actually a lot easier than adding a position/is_open field to every AppPanel. So, I run the name through a Hasher to make a u64 which is easier to clone/copy and stuff and made a newtype around a PanelId. That way I could reuse the code from the previous paneling system to swap/manage open PanelIds, then just use find on the AppPanel vec to find the corresponding widget. Also, I never mentioned it but I’ve been trying RustRover for the past few devlogs. It’s a lot more stable than Zed, but I sorta miss its snappiness and minimalism. If I end up finding an annoying bug in RustRover, I’ll probably switch back. However, it’s been quite a few days and I don’t think I’ve found a single one. JetBrains is truly awesome at tooling. See ya next time. Probably will do my next ship soon :)"}, {"post_id": 60552, "ts": "2026-09-02T23:31:23Z", "hours": 3.3072, "text": "I’m MASSIVELY refactoring rlbuddy! This, I think is the second (and hopefully the final) major refactor to the codebase. So, basically the current architecture is split into services and widgets. Each service has an update method, which does its stuff (draining subscribers, processing commands, etc). Since egui is immediate mode, this architecture works unlike callbacks/event-based which I actually tried to implement but couldn’t. Every widget is just implements egui::Widget, that holds some state handles (Rc) and command senders (Sender), usually just one for its respective service. Services are alive for the lifetime of the app, while widgets are the openable panels you see. Widgets display the data from service state, and talk back to it by mutating shared state or sending commands. I think music control has been the best for me to wrap my head around to decide about changes, so I’ll explain it with that. Music control had a controller, a service, and a widget file. The controller was a thread pool manager (if you can call the questionable implementation that) around Windows’ GSMTC API to give a single-thread api for it (since the app is basically single-threaded). Then, the service is always alive, syncing a state struct between the controller and its own state handle. Finally, the widget is optionally there as a panel, with next/previous/pause buttons which send commands and the ui which reads service state to display. It also has a mutable service state reference for settings (the “pause during anthems” button). The god object RlbuddyApp struct stores all of this stuff. So it has a music_control_service, music_control_widget, stats_api_service, all of those fields, which kinda sucked. On top of that, I had to maintain an enum of every panel, which was enumerated for the “open panel” popup and to render each one if it’s open. you might think “hey… isn’t that a self referential struct? how does music_control_widget store a reference to music_control_service?” Well, music_control_widget internally only has fields for the music_control_service’s state handles which are Rc/Arcs. So it only needs a reference to the service for it’s Widget::new function lifetime, all is well. Although it doesn’t look horrible, it was HELL to do anything. For example, refactoring the gilrs service out of hotkey and adding the gamepad overlay probably involved just as much fiddling around with Rcs in RlbuddyApp as adding the actual feature. So, I decided to move to a new architecture: services + features! And, after thinking about it for around 8 hours (i slept), I decided on something a bit different. Services + panels! Yeah, basically the same as services + widgets, but I was gonna implement it GOOD this time, and make design decisions that wouldn’t bite me in the ass later on. I wrote my first traits - Service, which requires update and optionally save , and Panel , which requires name() -> &'static str and ui (same as egui::Widget: :ui). Then, I’d change how components are registered: instead of keeping every service and widget as a field in RlBuddyApp, I’d make a Vec<Box<dyn Service/Panel» for each, and loop through it. I spent about an hour trying to get Panels to automatically implement ui by requiring egui::Widget as a supertrait, which doesn’t work since widgets are stateful (need &self). So, I tried to require &mut Self to implement egui::Widget, but apparently something to do with type erasure doesn’t let that work with dynamic dispatch which was needed for the Vec<Box> thing. I’ve moved a few features to the new architecture, but I’m still in the process of finishing up. Additionally, it has to work side-by-side with existing crappy monster-Panel-enum architecture, which sucks to maintain. Okay, once again, I had to strip down a ton of detail (and my terrible wording but wtv) cause I hit like 5000 characters b4 realizing. See ya! May the Stardance gods increase devlog limits :)"}, {"post_id": 59926, "ts": "2026-09-01T23:19:29Z", "hours": 2.5164, "text": "rlbuddy has a gamepad overlay now so that you can show off your awesome bindings! Don’t even bother figuring out mine. It’s kinda starting to become hellish to add new widgets/services, but I’m almost done for the next ship so I doubt I’ll refactor just yet [edit: im doing a super refactor now hehe]. I made the overlay with the raw egui::Painter rather than actual controls (since it would be pretty hard to make a controller out of Buttons or something). I also prefer to avoid embedding static assets, otherwise I might have made an actual one in MS Paint or something. I also can’t seem to find a good egui version. I’ve been on 0.34 almost the whole time, which works well but doesn’t support transparency in extra viewports. But, 0.35/0.36 broke external viewports. So, until then, we get an opaque gamepad overlay :( but the main app is still transparent, so it’s not horrible. Rolled an 8 and a 9 on the Stardance rng today! I’m so proud of myself."}, {"post_id": 59228, "ts": "2026-08-31T21:59:04Z", "hours": 0.4561, "text": "I moved the mmr server to alpine linux! Before, it was regular raspberry pi os lite on the Pi. But, it was behaving strangely, randomly rebooting and things, so I decided to try installing Alpine. The lightweight distro has been on my radar for a while now, but this was my first time ever actually trying it. I imaged it normally with the raspberry pi imager, and put it on the pi, did setup-alpine, and all was well. But, I put in the wrong wifi password at first, which broke everything else. I tried changing the wifi config and doing something with wpa_supplicant (thanks google ai overview), but nothing fixed it so I ended up doing a fresh install. This time, I put in the right password and everything went great. I set up ssh, node, pm2, etc. and moved the server files onto the pi through sftp. Then, I got it running over my local network and set up authentication. So, it was time to set up the Cloudflare tunnel again. I followed this neat guide , changing values as needed (for example, my pi is aarch64, but the guide was x64, so I spent a while figuring out why the pi kept giving elf errors). It took a really long time to set up the openrc startup script because 1. cloudflare rotates the setup token relatively frequently and 2. I accidentally put 2 –token arguments. And since I was using vi, I didn’t even notice and kept trying to figure out why cloudflared crashed on startup. But I eventually found out and removed the duplicate and it worked! Then I finished setting up pm2 and put the pi in its home next to the router, and mmr.kmdw.dev is back up exposing your lobby’s skills. See you in the next one! Yes I know part of the token is in the image but it’s used already so it doesn’t matter"}, {"post_id": 56962, "ts": "2026-08-29T00:27:50Z", "hours": 9.075, "text": "rlbuddy can load custom maps now! Either you can download them and then import from a zip, or you can download them from bakkesplugins straight from the app! Importing it from a file is relatively easy. I checked the code for Lethamyr’s custom map loader to see what exactly it did, and for Lethamyr maps it: extracted the zip into a temp dir read info.json, .udk, and preview.jpg copied those into its own saved map directory I knew Rust, being a low-level language would let me not have to extract the zip fully first. Additionally, Bakkesplugins maps don’t contain info.json or preview.jpg, they only contain a udk file, so I had to make sure it would work with that. So, the import code I wrote basically: enumerates files in the zip extracts info.json (if found) into a struct copies *.upk into the target directory copies *.jpg into the target directory/preview.jpg if it exists It worked great. I made a really cool looking widget with stupid manual layouting behind it for map selection. First, it would add the preview image (or a black background if none). Then, it would get the screen rect of the image, and draw a semitransparent black background onto it (for contrast). Finally, it drew the actual contents in that screen rect. So, I got pretty-looking tiles with preview image backgrounds! I also added a progress bar for import status. I benchmarked each main part of the import process and found that decompressing/extracting the upk file took around 2 seconds, for which the ui thread would be totally frozen (big nono)! So, I moved the work onto another thread, and also made it decompress/load in 100 total chunks, updating a progress bar each time. I then moved on to the map downloader. Bakkesplugins doesn’t have an API, so it relies on scraping the website. I didn’t actually use any external crates for gathering information, though. I wrote a parser which takes a list of rules, each with a start and end search string, and looks for each of them in sequence till it fails to find a rule. I tried to make it completely zero-copy, but something it needed was to turn an [Option; N] into a Option<[T; N]> if every element was Some , but the only way I could figure out how to do that was with an iterator. It’s still really fast though. So, it parses search results, including map titles and urls straight out of the html string without needing an HTML parser or regex library. Once it was able to load results from the search page, I went to sleep and came back today. Now I had to get it to actually download the ZIP files and preview images, and import them straight into the app. It first has to download/parse the plugin info page since the ZIP url isn’t available in the search results. Then, it requests the ZIP. I had some trouble with this, since I wanted to show a progress bar for the download status. I first tried a function from this gist , but it didn’t work. So, I made my own which used the same chunking strategy as the import status loader. Turns out, ureq blocks requests once they hit 10MB by default, which was probably why the gist version didn’t work. But, mine was faster anyways, so I kept it. It’s even cooler since I made it myself. Then, I wired up a couple more commands to let it import straight from archive bytes instead of from a file path, and it finally loaded! Once that worked, I made it pass along the map title, author, and description as well. Then, I extended it to parse out the thumbnail image url and download that, then pass that along to the importer as well. Anyways, that was super fun. I would add a lot more detail, but Stardance limits devlogs to 4000 characters and I’m approaching scarily close to that. I’m planning on just polishing the downloader interface a bit more, and then I’ll do some bugfixes for the next release. See ya!"}, {"post_id": 55430, "ts": "2026-08-27T08:04:57Z", "hours": 3.0236, "text": "rlbuddy now can show people’s avatars cross-platform! It uses a web api I put on Cloudflare Workers which uses platform-specific requests to get avatar urls (see the previous devlog), which the app just fetches and renders. The http part was pretty easy, since I already have wrappers for cached HTTP apis, so I just had to define types for that and hook it up. But, once it was time to display, I ran into a weird problem where egui said there was no image loader installed for jpegs! Even using all_loaders + default didn’t work. Turns out, I have to actually include image as a separate crate and enable all the filetype features I want in there. Once I got it to load, it was time to mess with styling again. egui is really annoying with images, so I spent a while trying to get them to size right first. The default avatar used while they’re loading or for Epic/Switch players is from Fandom, like the rank icons. However, even though the icon is 90x90 pixels, the webp is 128x128 pixels, it just has a bunch of transparent padding. So, I initially messed with egui to do some weird ui allocation and calculation to get it to render right. But, turns out I didn’t have to do all of that. All I had to do was allocate a 28x28 space (the target size), scale that up by the 128/90 ratio, then paint the image onto the new size. Worked great. Then, I got to fight with grid layouts again. For some reason, wrapping the avatar and player details in a horizontal totally exploded all the layouting. So, I ended up making avatar and details separate columns. But, since the “player” header text is a bit larger than the icon width, there was too much padding between the avatar and the player details. So, I did more messing around with egui manual layouting, and ended up allocating a 24x(body text height + 2) space for the header, which would give it the default spacing. Then, I’d copy the Rect, shift the left bound over by 12 pixels, then paint the header onto there. That way, the header is left aligned with the avatar and the avatar + details look like they’re in the same column, even though it’s actually a bunch of stupid manual layout magic behind the scenes."}, {"post_id": 55160, "ts": "2026-08-26T17:10:01Z", "hours": 2.6972, "text": "Made an avatars api for Steam, PSN, and Xbox (Epic doesn’t support profile pictures and I have no clue what goes on in Nintendo-land, even Tracker doesn’t show theirs). It’s on Cloudflare Workers instead of my pi since it’s basically just api integration. I totally overcomplicated finding out how to get Steam profile pictures. Like, it’s insane how easy it actually is. A few weeks ago, I got an old version of Steam Rocket League and decompiled it, trying to look for where it fetched avatars from. After some experimentation and debugging, I learned that when Psyonix builds Rocket League, they give it something that implements OnlineSubsystem for whatever the target platform is. So, Steam gets the Steamworks OnlineSubsystem, Epic gets the EOSOnlineSubsystem, and so forth. And the game doesn’t need to know implementation details, just that it implements OnlineSubsystem, I think the term for that is dynamic dispatch in programming languages. Anyways, once I learned that Rocket League doesn’t do any avatar handling itself, I looked at the Steamworks SDK. Basically, it routes the avatar request through the open Steam client. So after some experimentation, I got it to fetch profile pictures with C++ and the Spacewars test game. But, that obviously wouldn’t work on a server, since the Steam client can’t really run on a Worker. So, I tried to use the Steam Web API. I got an API key, but when I tried, it said I was forbidden. According to the documentation, the GetPlayerSummaries endpoint was at partner.steam-api.com, which was only for publishers. About a week later, so yesterday, I had the genius idea to use api.steampowered.com (the public API domain) instead of partner.steam-api.com. Just swapping them out. And it worked. So, I now had a way to get Steam avatar urls. Xbox and PSN were actually really easy. Xbox has an undocumented API at https://peoplehub-public.xboxlive.com/people/gt(GAMERTAG) which returns json containing the avatar uri, and I used the psn-api package with a new PlayStation account to get PSN profile pictures. Then, I just put all of them in a Worker. So, rlbuddy will be able to show avatars soon enough!"}, {"post_id": 54013, "ts": "2026-08-24T19:11:04Z", "hours": 4.6756, "text": "Recently I was going through game archives and came across the BepInEx tool, which is basically a code injection framework for Unity games. I was really curious as to how it actually launched when the game launched, and found that they use a tool called Unity Doorstop, which adds winhttp.dll to the game’s binary directory. So, when the game tries to use things from winhttp, it goes to the new winhttp.dll instead of the system32 winhttp.dll. From there, the custom dll just forwards all the function calls. However, the custom dll is modified so that on its first interaction, it launches whatever Doorstop is configured to launch, and the mods can be loaded. That’s at least as far as I understood, but it made sense, and I thought, “what if I could launch rlbuddy automatically like this?” So, first, I tried to test it with a custom executable and library. I created a basic executable and DLL in C, and got the executable to load and run some code from the DLL. Then, I created another DLL, and got it to “impersonate” the original DLL. So, I’d rename the first dll to something like “mylibrary_original.dll”, rename the faker dll to “mylibrary.dll”, and the original executable would call the original, but it goes through the faker instead. And it worked! I had successfully created an actual doorstop-like faker. Now it was time to actually try this on Rocket League. So, I did a dumpbin /import on RocketLeague.exe, and found a few good targets - IPHLPAPI.dll, a system dll for networking stuff, and xinput1_3.dll, one shipped with the game for talking to controllers. RocketLeague.exe only imported two functions from each of them, meaning my fake interface wouldn’t have to be too big. So, first I tried to spoof IPHLPAPI.dll. The code was pretty simple, just a couple of global objects to hold the function. So, when the game loaded the DLL, it loaded the fake DLL. Then, when it tried to call some function in the DLL, such as GetAdaptersAddresses, the fake DLL would be the actual receiver, it would log something to a file, and then it would call the REAL GetAdaptersAddresses by dynamically loading the system IPHLPAPI.dll and return it. And… it worked! I opened Rocket League and the log file was created and had the log “GetAdaptersAddresses called!” Then, I launched it with anticheat enabled, and EAC immediately shut it down. I guess that was to be expected, but it was pretty annoying. So, I decided to try one more time, this time with xinput1_3.dll. This was more interesting because it was lazy loaded, and functions were imported by ordinals (2 = XInputGetState, 3 = XInputSetState), so I thought something might be different. So, I modified the original faker to be xinput1_3, replacing the function names and definitions. Since Rocket League imported them by ordinal instead of just the function name, I had to create a .def file as well, and define the ordinals there. Then, I did the same surgery on the binary folder, and after a few small mistake fixes, it worked! But, I still hadn’t tried with EAC enabled. So I launched it with anticheat, and it gave me a different error this time - that it couldn’t determine xinput1_3.dll’s file version. That was a different error! I opened the original xinput1_3.dll’s file properties, and it had copyright, file version, product version, and a couple other random things that were missing in my faker DLL. So I made a .rc file and compiled it together with the faker DLL. Then, most of the properties matched up. So, I tried it, and it seemingly worked! And then EAC said that it couldn’t verify the file again. In the end, I didn’t manage to get it working. I should’ve expected EAC to block me from the beginning, but it was pretty fun, and if I ever want to do something similar with a game without anti-cheat, I can do that now! rlbuddy is pretty closed to being released though, I just want to polish a few things and make sure the docs are fleshed out."}, {"post_id": 51407, "ts": "2026-08-21T02:54:11Z", "hours": 1.5947, "text": "rlbuddy doesn’t use the default eframe persistence feature for savedata anymore, which is pretty cool. There were a few reasons for this: It was kind of unnecessary, since eframe uses ron and it was storing a bunch of extra widget data which didn’t really fit with the app model anyway It took up extra dependencies (removing the feature shaved off like 10) There’s a bug where if the app crashed, it would erase all savedata, which, as you can imagine, was quite annoying especially since I actually use the app along with developing it, meaning if the app crashed in development it would delete all my actual match data. It’s easier to externally modify, so if in development I want to mess with some values it’s a lot easier. Anyways, actually getting the data directory was pretty interesting. I’ve basically decided to only support Windows, since the music player relies on Windows APIs anyways and I don’t think the Stats API even works on Linux. Initially, I checked out the source code for the dirs and directories crates, which led me to the dirs-sys crate (which actually isn’t even on crates.io). It used unsafe raw Win32 SHGetKnownFolderPath with the Roaming folder guid. However, since I was already using the windows-rs crate, I tried to find the WinRT equivalent. I ended up enabling the Storage_Search feature to use the API which would let me get it. Of course, this also didn’t work, because of something to do with how Windows apps are supposed to be registered. So, I ended up just grabbing the APPDATA environment variable and using that, then joining rlbuddy\\data.json to it. It’s pretty underwhelming, but it more than gets the job done. Now, whenever the app panics, I won’t lose all of my settings anymore! Pretty nice. Anyways, that’s what mainly got accomplished. I also tried to set up a GitHub Action to build it and make a release, but I kept hitting errors so I gave up and decided to upload a release next time I get the urge to actually update the GitHub repository. There’s also a few fixes, like the window title which has actually had a typo since refactors from around a month ago, and adding a missing ! which broke toasts when in training. Overall, only an hour or so was tracked, but a heck of a lot got done. See you all next time!"}, {"post_id": 49990, "ts": "2026-08-19T00:44:44Z", "hours": 1.4564, "text": "I added a small toast notification that activates when you score in training, like bakkesmod used to add it to text chat. It also activates when you hit the crossbar so you can feel even more remorseful that your beautiful musty didn’t go in :) I actually got the program to segfault while making it. egui’s external viewport api is kinda funky… there are two modes, immediate and deferred, and immediate is supposed to be easier to use. However, when I tried to use immediate mode, it panicked saying that the egui backend was implemented incorrectly. So I switched to deferred, and it gave me the segfault. There were 3 things I had to do: I stored all active toasts in a Vec, and render them in the external viewport every frame. When one should disappear, it uses Vec::retain to remove old ones. However, this doesn’t do any cleanup, meaning the viewport would go bonkers and crash the application. So, I had to close the viewport first. Calling ui.ctx() from the viewport made a segfault, probably my fault but I couldn’t figure out how to resolve it so I ended up just sending Viewport::Close from the main loop. Even if I sent Viewport::Close from the main loop, it still gave the weird error. So, I resolved it by adding a small delay from after it should close, which is when it sends the Viewport::Close command, and when it’s actually removed from the Vec of toasts. Well, I did all that, and it was working, but there was a really weird bug where it would lag the whole system while opening/closing. So, I switched from immediate to deferred viewport mode, and it stopped happening! I hit my first powerful airdribble musty with it on, it was around 105kph, and a total fluke. I wish I had gotten it on recording."}, {"post_id": 49200, "ts": "2026-08-17T21:06:45Z", "hours": 9.2278, "text": "I replaced the Spotify integration with a generic one that uses the Windows GSMTC api, meaning it’s way snappier, since it’s not making network requests every time it wants new data! The only reason it needs data is to fetch playback info, and it’s easy to do that since the windows crate gives a bunch of event listeners, meaning I also don’t need to poll anymore. Unfortunately, the integration from browsers etc. is kind of buggy so thumbnail loading is relatively inconsistent, but by adding some caching and timeouts it works flawlessly :) I also redid the UI since the old one was frankly quite ugly. Since the playback listener doesn’t update that frequently for progressbar changes, I also made it fake progress when music is playing and the ui updates, that way even if the latest data is stale, it still looks like the progress bar is moving. I’m now working on better session stats, I’ll probably end up replacing the all-time stat tracker with more in-depth session-only ones"}, {"post_id": 46652, "ts": "2026-08-14T02:03:01Z", "hours": 4.1664, "text": "rlbuddy finally has an MMR graph! I’m planning on adding more stat displays soon, like W/L, goals for/against, saves, etc. but this is a really big milestone since it’s a feature that a lot of players actually use (I basically only play casual so it’s not really for me 😅). Anyways, this also required me to rearchitect how matches are stored, and now there are two representations: a session match, which contains lots of information about it like detailed player skill information, and a stripped match, which is minimal and stores very little because it actually gets saved to disk! So, match history also gets saved now! This also opens up the doorway to a Deja-Vu-like thing which tells you if you’ve played with someone before and when! It uses the egui_plot library to show the graph. Funnily enough, basically every default option for a displayed plot was the opposite for this, and so the plot builder ended up using almost every method. Also, once again, hackatime is wrong because Zed likes to uninstall extensions randomly :("}, {"post_id": 42417, "ts": "2026-08-07T03:32:05Z", "hours": 2.1161, "text": "The Stats API finally provides the actual playlist id, so rlbuddy isn’t limited to guessing between 1v1/2v2/3v3/4v4 anymore! This brings in some cool extra features like displaying the rank each player is in for the given playlist as well as even better Discord presence! I looked through BakkesMod as well as some psynet endpoints to grab the list of playlist ids to associate with each actual playlist. There isn’t really an image to go with this, so here’s the monster enum of playlists :)"}, {"post_id": 40468, "ts": "2026-08-04T00:47:59Z", "hours": 2.2011, "text": "I rewrote the API admin page with Svelte! Before, it was a quick-and-dirty raw html/css/js solution, but now it should be a lot less annoying to work on. I improved authorization a lot, now instead of adding the pw query parameter for every request you put in a password once and it actually uses the Authorization header. Unfortunately, the browser EventSource doesn’t support headers except for in cookies, meaning I had to use the custom eventsource library for bootstrapping since the bootstrap API uses SSE. There’s basically a whole Vite project in src/webadmin, with its own tsconfig.json and everything. Because of the way it’s set up, development needs Vite running in build watch mode which builds to where the main app serves it out of. It makes deployment a lot easier, though. I didn’t really add any actual features to it, except for a log filter. However, it should be way easier to add more features in the future, like a api tester!"}, {"post_id": 38450, "ts": "2026-07-31T20:22:49Z", "hours": 6.755, "text": "rlbuddy has player lookup now, so you can check for smurfs without needing to boot up a heavy browser while playing. Unfortunately, this has to get its information from TRN because it’s the only source of this information, the rocket league apis don’t provide it. There’s some cool refactors behind the scenes, though. I generalized almost all HTTP requests into its own struct, so it removed like 200 lines of boilerplate code into a single generic module. It automatically handles caching, using new threads, ignoring if there’s already an inflight request, loading states, and automatic serde_json deserialization. The Epic id, uncensorer, ranks, and new TRN apis all use it now! Also, the button to open in TRN from the player list opens the player info dialog instead (though if you need to, you can open in TRN from there)."}, {"post_id": 34762, "ts": "2026-07-25T19:02:58Z", "hours": 1.9536, "text": "Note: I’ve actually had way more hours than it says, but I reinstalled windows and forgot to set up hackatime again so all that’s gone :( mmr-api-v2 finally has an admin page, so I don’t have to ssh into my pi just to check some debug information anymore! It is kind of developer-oriented but I think it looks and works well enough for what it is for. In the actual rlbuddy app, there are some cool new features! Facilitated by lots of refactors, of course (turns out, the matches service was bigger than the actual rocket league service, so I finally separated them). Spotify integration now has a previous button as well as a skip-to-song-in-current-playlist button. Match history was a feature that I’ve kind of ignored, so I gave it a much needed touch-up so its easier to view and browse. A pretty cool thing is that that’s been added a rocket-league-playerid-to-epic-games-id translation endpoint. This means that you can see Switch players’ TRN profiles through their linked Epic account, since TRN doesn’t let you check based on Switch name alone. Finally, there are some small quality of life improvements, like less deadlocks, better anthem pausing, and the open panel list persisting."}, {"post_id": 30390, "ts": "2026-07-17T21:27:26Z", "hours": 3.8292, "text": "Turns out, for spotify integration, I can’t actually let other people use my spotify development mode app. It’s limited to 5 users which I have to invite by email. And to get a quota extension, I need 250,000 existing monthy active users, which I’m slightly short of (by about 249,999). So, I changed the login flow so that each user has to make their own Spotify app, and log in using the client ID from there. I didn’t change the current PKCE flow since that didn’t really need to be changed, but setup unfortunately takes a little more work now. Also, it has transparency now."}, {"post_id": 28659, "ts": "2026-07-15T01:29:51Z", "hours": 13.4597, "text": "It’s been a week since the last devlog, and lots has changed! 1. new architecture! The code was getting pretty messy since I had kept adding new features without really doing major refactors. So, I finally took it upon myself to actually organize everything and come up with a proper architecture. Each feature has its own module, containing services and widgets. Services have all the state, for example the Spotify service stores the current song and settings and the Rocket League module exposes a Matches service for the current match and past matches, which the match and past match widgets actually show. Services all have update functions which get called every 10ms. There are two ways for services to talk to the rest of the app: events and state. State is straightforward, it’s usually just an Rc with a custom generic struct I made to manage whether the widget can read/write to it. Events are enums which the update method returns, and can get passed to other update methods. For example, the Stats API service doesn’t have its own widget, it only connects to the stats api and returns match events which other features can use, like Spotify using replay start/end events to play/pause music. 2. new ui! The dashboard part isn’t as ugly as it was before, and has actual cards for every panel instead of just having horizontal lines in between. Even though it sounds pretty small, it’s actually huge for the prettiness of the app! Along with this, the behaviour of managing panels also changed. There’s an actual close button, and instead of having one button per panel at the bottom, there’s a small picker to open/close them. Also, you can also move them up and down now 3. Automatic stats api setup This is a pretty small feature. It lets you select the path to the rocket league executable, detects whether it’s already enabled, and turns it on if it’s disabled. It does this by just replacing a line in the stats api configuration. 4. mmr api v2 doesnt explode There were a few bugs which would make the API disconnect randomly, but they’ve been ironed out. This also made it so the app doesn’t have to deal with failure behaviour and can just keep asking until the API responds."}, {"post_id": 23975, "ts": "2026-07-07T06:51:05Z", "hours": 8.1119, "text": "rlbuddy now has a little bit of Spotify support! Although it looks like a just few elements and a button, theres a lot going on behind the scenes. I’m not embedding an entire webview to run the web playback SDK this time, so it just uses the Web API to keep resource usage nice and low. Since it’s a native app, it has to jump through some hurdles to authorize, using the PKCE extension version since the client secret can’t be stored securely. It uses the webbrowser crate to open the Spotify auth page, and starts a tiny little oneshot HTTP server on a raw TCPListener. The redirect is set to the HTTP server, and then as soon as it receives the request, it sends a simple HTML page and continues. From there, it receives the authorization code and can continue as normal :) Other than that, it’s just normal REST api interaction. I did learn a ton about thread safety (I hit so many deadlocks), because unlike the stats api, for example, which just sits in a different thread and hurls events over a channel, it actually has to work with the user. It’s also able to pause during goal replays, and that was pretty annoying to structure. Eventually, I decided to just use a channel where the stats api could send replay start/end events through the match widget. Looking back on it, the solution was extremely simple 😅 I am planning to add a bit more, like shuffle/repeat controls as well as a previous track button, but this feature turned out pretty nicely!"}, {"post_id": 22551, "ts": "2026-07-05T02:19:55Z", "hours": 3.7678, "text": "rlbuddy can now show Rich Presence in Discord, so now all your friends can see you destroying your opponents ;)"}, {"post_id": 21165, "ts": "2026-07-02T23:37:22Z", "hours": 12.7792, "text": "rlbuddy has had major ui overhauls to shift it more towards an actual overlay rather than just an app that displays ranks. there are new features like a settings menu as well as major architectural overhauls, with more coming soon!"}, {"post_id": 16053, "ts": "2026-06-26T02:45:17Z", "hours": 2.3483, "text": "Got it working as an actual overlay!! Right now it just displays ranks, though"}, {"post_id": 15855, "ts": "2026-06-25T19:39:34Z", "hours": 30.4556, "text": "I got a stable MMR/ranks api working!! https://github.com/Kalilamodow/mmr-api-v2 Basically, it’s an http server that opens a websocket to the actual rocket league game api in the background and spoofs a real client connection. The socket only stays active for 5 seconds at a time though so I don’t kill psyonix’s servers. That way, rlbuddy can get ranks without getting blocked by tracker network! I originally tried to do it on Cloudflare, but the workers outbound websocket didn’t work since you can’t send custom headers with them. I ended up having to use my old raspberry pi and set up a homeserver behind Cloudflare tunnels, and I’m actually planning on moving the rest of my stuff that used to be on a VPS onto the pi."}]...
|
Title: rlbuddy by @kmdw | Stardance
Devlogs:
I go Title: rlbuddy by @kmdw | Stardance
Devlogs:
I got a stable MMR/ranks api working!! https://github.com/Kalilamodow/mmr-api-v2 Basically, it’s an http server that opens a websocket to the actual rocket league game api in the background and spoofs a real client connection. The socket only stays active for 5 seconds at a time though so I don’t kill psyonix’s servers. That way, rlbuddy can get ranks without getting blocked by tracker network! I originally tried to do it on Cloudflare, but the workers outbound websocket didn’t work since you can’t send custom headers with them. I ended up having to use my old raspberry pi and set up a homeserver behind Cloudflare tunnels, and I’m actually planning on moving the rest of my stuff that used to be on a VPS onto the pi.
Got it working as an actual overlay!! Right now it just displays ranks, though
rlbuddy has had major ui overhauls to shift it more towards an actual overlay rather than just an app that displays ranks. there are new features like a settings menu as well as major architectural overhauls, with more coming soon!
rlbuddy can now show Rich Presence in Discord, so now all your friends can see you destroying your opponents ;)
rlbuddy now has a little bit of Spotify support! Although it looks like a just few elements and a button, theres a lot going on behind the scenes. I’m not embedding an entire webview to run the web playback SDK this time, so it just uses the Web API to keep resource usage nice and low. Since it’s a native app, it has to jump through some hurdles to authorize, using the PKCE extension version since the client secret can’t be stored securely. It uses the webbrowser crate to open the Spotify auth page, and starts a tiny little oneshot HTTP server on a raw TCPListener. The redirect is set to the HTTP server, and then as soon as it receives the request, it sends a simple HTML page and continues. From there, it receives the authorization code and can continue as normal :) Other than that, it’s just normal REST api interaction. I did learn a ton about thread safety (I hit so many deadlocks), because unlike the stats api, for example, which just sits in a different thread and hurls events over a channel, it actually has to work with the user. It’s also able to pause during goal replays, and that was pretty annoying to structure. Eventually, I decided to just use a channel where the stats api could send replay start/end events through the match widget. Looking back on it, the solution was extremely simple 😅 I am planning to add a bit more, like shuffle/repeat controls as well as a previous track button, but this feature turned out pretty nicely!
It’s been a week since the last devlog, and lots has changed! 1. new architecture! The code was getting pretty messy since I had kept adding new features without really doing major refactors. So, I finally took it upon myself to actually organize everything and come up with a proper architecture. Each feature has its own module, containing services and widgets. Services have all the state, for example the Spotify service stores the current song and settings and the Rocket League module exposes a Matches service for the current match and past matches, which the match and past match widgets actually show. Services all have update functions which get called every 10ms. There are two ways for services to talk to the rest of the app: events and state. State is straightforward, it’s usually just an Rc with a custom generic struct I made to manage whether the widget can read/write to it. Events are enums which the update method returns, and can get passed to other update methods. For example, the Stats API service doesn’t have its own widget, it only connects to the stats api and returns match events which other features can use, like Spotify using replay start/end events to play/pause music. 2. new ui! The dashboard part isn’t as ugly as it was before, and has actual cards for every panel instead of just having horizontal lines in between. Even though it sounds pretty small, it’s actually huge for the prettiness of the app! Along with this, the behaviour of managing panels also changed. There’s an actual close button, and instead of having one button per panel at the bottom, there’s a small picker to open/close them. Also, you can also move them up and down now 3. Automatic stats api setup This is a pretty small feature. It lets you select the path to the rocket league executable, detects whether it’s already enabled, and turns it on if it’s disabled. It does this by just replacing a line in the stats api configuration. 4. mmr api v2 doesnt explode There were a few bugs which would make the API disconnect randomly, but they’ve been ironed out. This also made it so the app doesn’t have to deal with failure behaviour and can just keep asking until the API responds.
Turns out, for spotify integration, I can’t actually let other people use my spotify development mode app. It’s limited to 5 users which I have to invite by email. And to get a quota extension, I need 250,000 existing monthy active users, which I’m slightly short of (by about 249,999). So, I changed the login flow so that each user has to make their own Spotify app, and log in using the client ID from there. I didn’t change the current PKCE flow since that didn’t really need to be changed, but setup unfortunately takes a little more work now. Also, it has transparency now.
Note: I’ve actually had way more hours than it says, but I reinstalled windows and forgot to set up hackatime again so all that’s gone :( mmr-api-v2 finally has an admin page, so I don’t have to ssh into my pi just to check some debug information anymore! It is kind of developer-oriented but I think it looks and works well enough for what it is for. In the actual rlbuddy app, there are some cool new features! Facilitated by lots of refactors, of course (turns out, the matches service was bigger than the actual rocket league service, so I finally separated them). Spotify integration now has a previous button as well as a skip-to-song-in-current-playlist button. Match history was a feature that I’ve kind of ignored, so I gave it a much needed touch-up so its easier to view and browse. A pretty cool thing is that that’s been added a rocket-league-playerid-to-epic-games-id translation endpoint. This means that you can see Switch players’ TRN profiles through their linked Epic account, since TRN doesn’t let you check based on Switch name alone. Finally, there are some small quality of life improvements, like less deadlocks, better anthem pausing, and the open panel list persisting.
rlbuddy has player lookup now, so you can check for smurfs without needing to boot up a heavy browser while playing. Unfortunately, this has to get its information from TRN because it’s the only source of this information, the rocket league apis don’t provide it. There’s some cool refactors behind the scenes, though. I generalized almost all HTTP requests into its own struct, so it removed like 200 lines of boilerplate code into a single generic module. It automatically handles caching, using new threads, ignoring if there’s already an inflight request, loading states, and automatic serde_json deserialization. The Epic id, uncensorer, ranks, and new TRN apis all use it now! Also, the button to open in TRN from the player list opens the player info dialog instead (though if you need to, you can open in TRN from there).
I rewrote the API admin page with Svelte! Before, it was a quick-and-dirty raw html/css/js solution, but now it should be a lot less annoying to work on. I improved authorization a lot, now instead of adding the pw query parameter for every request you put in a password once and it actually uses the Authorization header. Unfortunately, the browser EventSource doesn’t support headers except for in cookies, meaning I had to use the custom eventsource library for bootstrapping since the bootstrap API uses SSE. There’s basically a whole Vite project in src/webadmin, with its own tsconfig.json and everything. Because of the way it’s set up, development needs Vite running in build watch mode which builds to where the main app serves it out of. It makes deployment a lot easier, though. I didn’t really add any actual features to it, except for a log filter. However, it should be way easier to add more features in the future, like a api tester!
The Stats API finally provides the actual playlist id, so rlbuddy isn’t limited to guessing between 1v1/2v2/3v3/4v4 anymore! This brings in some cool extra features like displaying the rank each player is in for the given playlist as well as even better Discord presence! I looked through BakkesMod as well as some psynet endpoints to grab the list of playlist ids to associate with each actual playlist. There isn’t really an image to go with this, so here’s the monster enum of playlists :)
rlbuddy finally has an MMR graph! I’m planning on adding more stat displays soon, like W/L, goals for/against, saves, etc. but this is a really big milestone since it’s a feature that a lot of players actually use (I basically only play casual so it’s not really for me 😅). Anyways, this also required me to rearchitect how matches are stored, and now there are two representations: a session match, which contains lots of information about it like detailed player skill information, and a stripped match, which is minimal and stores very little because it actually gets saved to disk! So, match history also gets saved now! This also opens up the doorway to a Deja-Vu-like thing which tells you if you’ve played with someone before and when! It uses the egui_plot library to show the graph. Funnily enough, basically every default option for a displayed plot was the opposite for this, and so the plot builder ended up using almost every method. Also, once again, hackatime is wrong because Zed likes to uninstall extensions randomly :(
I replaced the Spotify integration with a generic one that uses the Windows GSMTC api, meaning it’s way snappier, since it’s not making network requests every time it wants new data! The only reason it needs data is to fetch playback info, and it’s easy to do that since the windows crate gives a bunch of event listeners, meaning I also don’t need to poll anymore. Unfortunately, the integration from browsers etc. is kind of buggy so thumbnail loading is relatively inconsistent, but by adding some caching and timeouts it works flawlessly :) I also redid the UI since the old one was frankly quite ugly. Since the playback listener doesn’t update that frequently for progressbar changes, I also made it fake progress when music is playing and the ui updates, that way even if the latest data is stale, it still looks like the progress bar is moving. I’m now working on better session stats, I’ll probably end up replacing the all-time stat tracker with more in-depth session-only ones
I added a small toast notification that activates when you score in training, like bakkesmod used to add it to text chat. It also activates when you hit the crossbar so you can feel even more remorseful that your beautiful musty didn’t go in :) I actually got the program to segfault while making it. egui’s external viewport api is kinda funky… there are two modes, immediate and deferred, and immediate is supposed to be easier to use. However, when I tried to use immediate mode, it panicked saying that the egui backend was implemented incorrectly. So I switched to deferred, and it gave me the segfault. There were 3 things I had to do: I stored all active toasts in a Vec, and render them in the external viewport every frame. When one should disappear, it uses Vec::retain to remove old ones. However, this doesn’t do any cleanup, meaning the viewport would go bonkers and crash the application. So, I had to close the viewport first. Calling ui.ctx() from the viewport made a segfault, probably my fault but I couldn’t figure out how to resolve it so I ended up just sending Viewport::Close from the main loop. Even if I sent Viewport::Close from the main loop, it still gave the weird error. So, I resolved it by adding a small delay from after it should close, which is when it sends the Viewport::Close command, and when it’s actually removed from the Vec of toasts. Well, I did all that, and it was working, but there was a really weird bug where it would lag the whole system while opening/closing. So, I switched from immediate to deferred viewport mode, and it stopped happening! I hit my first powerful airdribble musty with it on, it was around 105kph, and a total fluke. I wish I had gotten it on recording.
rlbuddy doesn’t use the default eframe persistence feature for savedata anymore, which is pretty cool. There were a few reasons for this: It was kind of unnecessary, since eframe uses ron and it was storing a bunch of extra widget data which didn’t really fit with the app model anyway It took up extra dependencies (removing the feature shaved off like 10) There’s a bug where if the app crashed, it would erase all savedata, which, as you can imagine, was quite annoying especially since I actually use the app along with developing it, meaning if the app crashed in development it would delete all my actual match data. It’s easier to externally modify, so if in development I want to mess with some values it’s a lot easier. Anyways, actually getting the data directory was pretty interesting. I’ve basically decided to only support Windows, since the music player relies on Windows APIs anyways and I don’t think the Stats API even works on Linux. Initially, I checked out the source code for the dirs and directories crates, which led me to the dirs-sys crate (which actually isn’t even on crates.io). It used unsafe raw Win32 SHGetKnownFolderPath with the Roaming folder guid. However, since I was already using the windows-rs crate, I tried to find the WinRT equivalent. I ended up enabling the Storage_Search feature to use the API which would let me get it. Of course, this also didn’t work, because of something to do with how Windows apps are supposed to be registered. So, I ended up just grabbing the APPDATA environment variable and using that, then joining rlbuddy\data.json to it. It’s pretty underwhelming, but it more than gets the job done. Now, whenever the app panics, I won’t lose all of my settings anymore! Pretty nice. Anyways, that’s what mainly got accomplished. I also tried to set up a GitHub Action to build it and make a release, but I kept hitting errors so I gave up and decided to upload a release next time I get the urge to actually update the GitHub repository. There’s also a few fixes, like the window title which has actually had a typo since refactors from around a month ago, and adding a missing ! which broke toasts when in training. Overall, only an hour or so was tracked, but a heck of a lot got done. See you all next time!
Recently I was going through game archives and came across the BepInEx tool, which is basically a code injection framework for Unity games. I was really curious as to how it actually launched when the game launched, and found that they use a tool called Unity Doorstop, which adds winhttp.dll to the game’s binary directory. So, when the game tries to use things from winhttp, it goes to the new winhttp.dll instead of the system32 winhttp.dll. From there, the custom dll just forwards all the function calls. However, the custom dll is modified so that on its first interaction, it launches whatever Doorstop is configured to launch, and the mods can be loaded. That’s at least as far as I understood, but it made sense, and I thought, “what if I could launch rlbuddy automatically like this?” So, first, I tried to test it with a custom executable and library. I created a basic executable and DLL in C, and got the executable to load and run some code from the DLL. Then, I created another DLL, and got it to “impersonate” the original DLL. So, I’d rename the first dll to something like “mylibrary_original.dll”, rename the faker dll to “mylibrary.dll”, and the original executable would call the original, but it goes through the faker instead. And it worked! I had successfully created an actual doorstop-like faker. Now it was time to actually try this on Rocket League. So, I did a dumpbin /import on RocketLeague.exe, and found a few good targets - IPHLPAPI.dll, a system dll for networking stuff, and xinput1_3.dll, one shipped with the game for talking to controllers. RocketLeague.exe only imported two functions from each of them, meaning my fake interface wouldn’t have to be too big. So, first I tried to spoof IPHLPAPI.dll. The code was pretty simple, just a couple of global objects to hold the function. So, when the game loaded the DLL, it loaded the fake DLL. Then, when it tried to call some function in the DLL, such as GetAdaptersAddresses, the fake DLL would be the actual receiver, it would log something to a file, and then it would call the REAL GetAdaptersAddresses by dynamically loading the system IPHLPAPI.dll and return it. And… it worked! I opened Rocket League and the log file was created and had the log “GetAdaptersAddresses called!” Then, I launched it with anticheat enabled, and EAC immediately shut it down. I guess that was to be expected, but it was pretty annoying. So, I decided to try one more time, this time with xinput1_3.dll. This was more interesting because it was lazy loaded, and functions were imported by ordinals (2 = XInputGetState, 3 = XInputSetState), so I thought something might be different. So, I modified the original faker to be xinput1_3, replacing the function names and definitions. Since Rocket League imported them by ordinal instead of just the function name, I had to create a .def file as well, and define the ordinals there. Then, I did the same surgery on the binary folder, and after a few small mistake fixes, it worked! But, I still hadn’t tried with EAC enabled. So I launched it with anticheat, and it gave me a different error this time - that it couldn’t determine xinput1_3.dll’s file version. That was a different error! I opened the original xinput1_3.dll’s file properties, and it had copyright, file version, product version, and a couple other random things that were missing in my faker DLL. So I made a .rc file and compiled it together with the faker DLL. Then, most of the properties matched up. So, I tried it, and it seemingly worked! And then EAC said that it couldn’t verify the file again. In the end, I didn’t manage to get it working. I should’ve expected EAC to block me from the beginning, but it was pretty fun, and if I ever want to do something similar with a game without anti-cheat, I can do that now! rlbuddy is pretty closed to being released though, I just want to polish a few things and make sure the docs are fleshed out.
Made an avatars api for Steam, PSN, and Xbox (Epic doesn’t support profile pictures and I have no clue what goes on in Nintendo-land, even Tracker doesn’t show theirs). It’s on Cloudflare Workers instead of my pi since it’s basically just api integration. I totally overcomplicated finding out how to get Steam profile pictures. Like, it’s insane how easy it actually is. A few weeks ago, I got an old version of Steam Rocket League and decompiled it, trying to look for where it fetched avatars from. After some experimentation and debugging, I learned that when Psyonix builds Rocket League, they give it something that implements OnlineSubsystem for whatever the target platform is. So, Steam gets the Steamworks OnlineSubsystem, Epic gets the EOSOnlineSubsystem, and so forth. And the game doesn’t need to know implementation details, just that it implements OnlineSubsystem, I think the term for that is dynamic dispatch in programming languages. Anyways, once I learned that Rocket League doesn’t do any avatar handling itself, I looked at the Steamworks SDK. Basically, it routes the avatar request through the open Steam client. So after some experimentation, I got it to fetch profile pictures with C++ and the Spacewars test game. But, that obviously wouldn’t work on a server, since the Steam client can’t really run on a Worker. So, I tried to use the Steam Web API. I got an API key, but when I tried, it said I was forbidden. According to the documentation, the GetPlayerSummaries endpoint was at partner.steam-api.com, which was only for publishers. About a week later, so yesterday, I had the genius idea to use api.steampowered.com (the public API domain) instead of partner.steam-api.com. Just swapping them out. And it worked. So, I now had a way to get Steam avatar urls. Xbox and PSN were actually really easy. Xbox has an undocumented API at https://peoplehub-public.xboxlive.com/people/gt(GAMERTAG) which returns json containing the avatar uri, and I used the psn-api package with a new PlayStation account to get PSN profile pictures. Then, I just put all of them in a Worker. So, rlbuddy will be able to show avatars soon enough!
rlbuddy now can show people’s avatars cross-platform! It uses a web api I put on Cloudflare Workers which uses platform-specific requests to get avatar urls (see the previous devlog), which the app just fetches and renders. The http part was pretty easy, since I already have wrappers for cached HTTP apis, so I just had to define types for that and hook it up. But, once it was time to display, I ran into a weird problem where egui said there was no image loader installed for jpegs! Even using all_loaders + default didn’t work. Turns out, I have to actually include image as a separate crate and enable all the filetype features I want in there. Once I got it to load, it was time to mess with styling again. egui is really annoying with images, so I spent a while trying to get them to size right first. The default avatar used while they’re loading or for Epic/Switch players is from Fandom, like the rank icons. However, even though the icon is 90x90 pixels, the webp is 128x128 pixels, it just has a bunch of transparent padding. So, I initially messed with egui to do some weird ui allocation and calculation to get it to render right. But, turns out I didn’t have to do all of that. All I had to do was allocate a 28x28 space (the target size), scale that up by the 128/90 ratio, then paint the image onto the new size. Worked great. Then, I got to fight with grid layouts again. For some reason, wrapping the avatar and player details in a horizontal totally exploded all the layouting. So, I ended up making avatar and details separate columns. But, since the “player” header text is a bit larger than the icon width, there was too much padding between the avatar and the player details. So, I did more messing around with egui manual layouting, and ended up allocating a 24x(body text height + 2) space for the header, which would give it the default spacing. Then, I’d copy the Rect, shift the left bound over by 12 pixels, then paint the header onto there. That way, the header is left aligned with the avatar and the avatar + details look like they’re in the same column, even though it’s actually a bunch of stupid manual layout magic behind the scenes.
rlbuddy can load custom maps now! Either you can download them and then import from a zip, or you can download them from bakkesplugins straight from the app! Importing it from a file is relatively easy. I checked the code for Lethamyr’s custom map loader to see what exactly it did, and for Lethamyr maps it: extracted the zip into a temp dir read info.json, .udk, and preview.jpg copied those into its own saved map directory I knew Rust, being a low-level language would let me not have to extract the zip fully first. Additionally, Bakkesplugins maps don’t contain info.json or preview.jpg, they only contain a udk file, so I had to make sure it would work with that. So, the import code I wrote basically: enumerates files in the zip extracts info.json (if found) into a struct copies *.upk into the target directory copies *.jpg into the target directory/preview.jpg if it exists It worked great. I made a really cool looking widget with stupid manual layouting behind it for map selection. First, it would add the preview image (or a black background if none). Then, it would get the screen rect of the image, and draw a semitransparent black background onto it (for contrast). Finally, it drew the actual contents in that screen rect. So, I got pretty-looking tiles with preview image backgrounds! I also added a progress bar for import status. I benchmarked each main part of the import process and found that decompressing/extracting the upk file took around 2 seconds, for which the ui thread would be totally frozen (big nono)! So, I moved the work onto another thread, and also made it decompress/load in 100 total chunks, updating a progress bar each time. I then moved on to the map downloader. Bakkesplugins doesn’t have an API, so it relies on scraping the website. I didn’t actually use any external crates for gathering information, though. I wrote a parser which takes a list of rules, each with a start and end search string, and looks for each of them in sequence till it fails to find a rule. I tried to make it completely zero-copy, but something it needed was to turn an [Option; N] into a Option<[T; N]> if every element was Some , but the only way I could figure out how to do that was with an iterator. It’s still really fast though. So, it parses search results, including map titles and urls straight out of the html string without needing an HTML parser or regex library. Once it was able to load results from the search page, I went to sleep and came back today. Now I had to get it to actually download the ZIP files and preview images, and import them straight into the app. It first has to download/parse the plugin info page since the ZIP url isn’t available in the search results. Then, it requests the ZIP. I had some trouble with this, since I wanted to show a progress bar for the download status. I first tried a function from this gist , but it didn’t work. So, I made my own which used the same chunking strategy as the import status loader. Turns out, ureq blocks requests once they hit 10MB by default, which was probably why the gist version didn’t work. But, mine was faster anyways, so I kept it. It’s even cooler since I made it myself. Then, I wired up a couple more commands to let it import straight from archive bytes instead of from a file path, and it finally loaded! Once that worked, I made it pass along the map title, author, and description as well. Then, I extended it to parse out the thumbnail image url and download that, then pass that along to the importer as well. Anyways, that was super fun. I would add a lot more detail, but Stardance limits devlogs to 4000 characters and I’m approaching scarily close to that. I’m planning on just polishing the downloader interface a bit more, and then I’ll do some bugfixes for the next release. See ya!
I moved the mmr server to alpine linux! Before, it was regular raspberry pi os lite on the Pi. But, it was behaving strangely, randomly rebooting and things, so I decided to try installing Alpine. The lightweight distro has been on my radar for a while now, but this was my first time ever actually trying it. I imaged it normally with the raspberry pi imager, and put it on the pi, did setup-alpine, and all was well. But, I put in the wrong wifi password at first, which broke everything else. I tried changing the wifi config and doing something with wpa_supplicant (thanks google ai overview), but nothing fixed it so I ended up doing a fresh install. This time, I put in the right password and everything went great. I set up ssh, node, pm2, etc. and moved the server files onto the pi through sftp. Then, I got it running over my local network and set up authentication. So, it was time to set up the Cloudflare tunnel again. I followed this neat guide , changing values as needed (for example, my pi is aarch64, but the guide was x64, so I spent a while figuring out why the pi kept giving elf errors). It took a really long time to set up the openrc startup script because 1. cloudflare rotates the setup token relatively frequently and 2. I accidentally put 2 –token arguments. And since I was using vi, I didn’t even notice and kept trying to figure out why cloudflared crashed on startup. But I eventually found out and removed the duplicate and it worked! Then I finished setting up pm2 and put the pi in its home next to the router, and mmr.kmdw.dev is back up exposing your lobby’s skills. See you in the next one! Yes I know part of the token is in the image but it’s used already so it doesn’t matter
rlbuddy has a gamepad overlay now so that you can show off your awesome bindings! Don’t even bother figuring out mine. It’s kinda starting to become hellish to add new widgets/services, but I’m almost done for the next ship so I doubt I’ll refactor just yet [edit: im doing a super refactor now hehe]. I made the overlay with the raw egui::Painter rather than actual controls (since it would be pretty hard to make a controller out of Buttons or something). I also prefer to avoid embedding static assets, otherwise I might have made an actual one in MS Paint or something. I also can’t seem to find a good egui version. I’ve been on 0.34 almost the whole time, which works well but doesn’t support transparency in extra viewports. But, 0.35/0.36 broke external viewports. So, until then, we get an opaque gamepad overlay :( but the main app is still transparent, so it’s not horrible. Rolled an 8 and a 9 on the Stardance rng today! I’m so proud of myself.
I’m MASSIVELY refactoring rlbuddy! This, I think is the second (and hopefully the final) major refactor to the codebase. So, basically the current architecture is split into services and widgets. Each service has an update method, which does its stuff (draining subscribers, processing commands, etc). Since egui is immediate mode, this architecture works unlike callbacks/event-based which I actually tried to implement but couldn’t. Every widget is just implements egui::Widget, that holds some state handles (Rc) and command senders (Sender), usually just one for its respective service. Services are alive for the lifetime of the app, while widgets are the openable panels you see. Widgets display the data from service state, and talk back to it by mutating shared state or sending commands. I think music control has been the best for me to wrap my head around to decide about changes, so I’ll explain it with that. Music control had a controller, a service, and a widget file. The controller was a thread pool manager (if you can call the questionable implementation that) around Windows’ GSMTC API to give a single-thread api for it (since the app is basically single-threaded). Then, the service is always alive, syncing a state struct between the controller and its own state handle. Finally, the widget is optionally there as a panel, with next/previous/pause buttons which send commands and the ui which reads service state to display. It also has a mutable service state reference for settings (the “pause during anthems” button). The god object RlbuddyApp struct stores all of this stuff. So it has a music_control_service, music_control_widget, stats_api_service, all of those fields, which kinda sucked. On top of that, I had to maintain an enum of every panel, which was enumerated for the “open panel” popup and to render each one if it’s open. you might think “hey… isn’t that a self referential struct? how does music_control_widget store a reference to music_control_service?” Well, music_control_widget internally only has fields for the music_control_service’s state handles which are Rc/Arcs. So it only needs a reference to the service for it’s Widget::new function lifetime, all is well. Although it doesn’t look horrible, it was HELL to do anything. For example, refactoring the gilrs service out of hotkey and adding the gamepad overlay probably involved just as much fiddling around with Rcs in RlbuddyApp as adding the actual feature. So, I decided to move to a new architecture: services + features! And, after thinking about it for around 8 hours (i slept), I decided on something a bit different. Services + panels! Yeah, basically the same as services + widgets, but I was gonna implement it GOOD this time, and make design decisions that wouldn’t bite me in the ass later on. I wrote my first traits - Service, which requires update and optionally save , and Panel , which requires name() -> &'static str and ui (same as egui::Widget: :ui). Then, I’d change how components are registered: instead of keeping every service and widget as a field in RlBuddyApp, I’d make a Vec<Box<dyn Service/Panel» for each, and loop through it. I spent about an hour trying to get Panels to automatically implement ui by requiring egui::Widget as a supertrait, which doesn’t work since widgets are stateful (need &self). So, I tried to require &mut Self to implement egui::Widget, but apparently something to do with type erasure doesn’t let that work with dynamic dispatch which was needed for the Vec<Box> thing. I’ve moved a few features to the new architecture, but I’m still in the process of finishing up. Additionally, it has to work side-by-side with existing crappy monster-Panel-enum architecture, which sucks to maintain. Okay, once again, I had to strip down a ton of detail (and my terrible wording but wtv) cause I hit like 5000 characters b4 realizing. See ya! May the Stardance gods increase devlog limits :)
I finished the big refactor! I pushed around 25 commits to GitHub at once. I’m really gonna enjoy adding the next feature, basking in how much easier it is ;) Apparently, I never made a service for session stats, so it currently can’t persist its one setting. Actually, writing this I realized that the setting isn’t actually used, so I can delete it. That’s great. After finally kicking out all the annoying legacy panel code, I remembered that I never re-implemented the positioning or its related persistence code for the new panel system. The persistence system was reworked too, something that I don’t think really got included in the previous devlog. Each service can implement save , and there are generic helper methods in a common module for saving/loading serde structs to a file in the app data directory. The actual app now uses this method as well instead of doing all the pathing logic itself, so the persistence module is pretty small and could honestly be moved into app.rs. For new positioning, I store a list of open panels. Weirdly enough, it’s actually a lot easier than adding a position/is_open field to every AppPanel. So, I run the name through a Hasher to make a u64 which is easier to clone/copy and stuff and made a newtype around a PanelId. That way I could reuse the code from the previous paneling system to swap/manage open PanelIds, then just use find on the AppPanel vec to find the corresponding widget. Also, I never mentioned it but I’ve been trying RustRover for the past few devlogs. It’s a lot more stable than Zed, but I sorta miss its snappiness and minimalism. If I end up finding an annoying bug in RustRover, I’ll probably switch back. However, it’s been quite a few days and I don’t think I’ve found a single one. JetBrains is truly awesome at tooling. See ya next time. Probably will do my next ship soon :)
Had to remove the tracker.gg widget :( unfortunately they don’t allow scraping and what I had wasn’t allowed anyways. Things that used to open the player info widget now just open tracker in a browser.
Time formatting doesn’t suck anymore! I made the implementation way better so I could make it support stuff even past weeks, like months and years. The new implementation added around 60 lines, but it’s for a good cause. The previous implementation used a match statement with duplicated logic that only supported seconds, minutes, and hours, using a pluralize function and inline if-statements everywhere. If it were sent to any rational code-reviewer, they would likely have a heart attack. Now it’s a bit more complex but less complicated. You have TimeUnit s which format the unit themselves and TimePart s which format a value + a unit. Then, just use some math to build a Vec and format it into a string. Boom! Beautiful, well-formed time formatting. To soak in the new beauty, I added days n weeks. I just had to add 14 lines! The previous one would have probably needed a bunch of stupid magic numbers and weird chains everywhere to accomplish the same thing. Okay, I’m done using your time on reading a way-too-long write-up about fixing a crappy implementation that shouldn’t have been there in the first place. I’m gonna ship right after posting this. If you get it, make sure to give it 10 stars in everything 😉. Haha, jk. Well, not really. Cya later.
I’ve mostly been working on smaller features, improvements, and bugfixes. A cool one I did is fixing weird glitchy movement with the gamepad overlay window! Basically, the window needs to persist its position across disabling it/enabling it. And egui is immediate mode. So, every time it rendered the viewport, it would both set and get its position. So, moving it would update the current position, but because of the weird interop between setting the position in a ViewportBuilder and getting it from the viewport info, it would glitch back and forth, especially when my laptop is lagging. I fixed it by only calling the ViewportBuilder ‘s “ with_position ” method when the overlay had just been enabled ( !was_enabled && currently_enabled ). That way, it only sets it once externally, and lets it move freely while it’s open. Then, while it’s moving, it continues to update the saved position. And upon closing and then reopening it, it sets it again (but only once!) Relatively simple fix but it’s kind of funny. I mainly noticed it when I added a feature that would auto-unmaximize the overlay when the user maximizes it, and it would go crazy and fly around the screen. Very fun! I also fixed a pretty old bug where it would incorrectly detect the local player. Basically, the stats api doesn’t actually tell you who the local player is. So, we have to guess based on who the camera is targeting right now. Usually, it’s on the local player, but during goal replays or spectating a bot when joining a casual game, it would be improperly set at the start and then stay like that. So, I made sure that it always updated as long as the match is 1. in progress 2. not in a replay. It also fixes a thing with inconsistent match toasts, since the toasts only fire if the scoring player is the local player (and if it thinks the wrong player is the local player, everything’s messed up). I’m planning on revamping hotkeys next, to allow you to bind to any controller button and even do custom quickchats in-game. Later!
More gamepad overlay buttons!!! Yay!!! In not-so-awesomely-exciting news, I also added a table of contents to the readme (as well as a generator for it). The script’s in Python (I’m sorry for not using Rust) meaning the repository is now 0.5% Python. Takeover incoming? I overcomplicated the script a lot, but it’s really easy to read. There are three whole comments, aka 6% of lines in the whole file! It’s not technically interesting in the slightest. I was thinking of building a tree-like structure before outputting the string, but realized I can just use the header level (h1 vs h2 vs h3 etc) as the amount of spaces / 2. I also refactored it not to use magic PanelId s for the default panel list. I kinda rushed that part when I made it, I’ll be honest. But now each Panel can implement fn open_by_default(&self) -> bool (returns false by default) and if it does it keeps it open when savedata doesn’t exist yet. I don’t get how an entire hour n 27 minutes was spent on like 7 not-even-that-big commits. At least it was a good use of my math class. We reviewed limits for some reason (which everyone should already know for one because they took the prereqs?), and the teacher managed to extend her lecture for the ENTIRE class time. rlbuddy development saving the day, I guess (just like it will in your rocket league games btw, so you should download it)
I’ve been debugging high memory for the past month or so. It was egui_system_fonts. Why would fonts take 170mb of ram????????????????????????????????? help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! I hate external dependencies!!!!!!!!!!!!!!!!!!!!11 I owe my life to DHAT now. go star https://github.com/nnethercote/dhat-rs
I did lots of performance improvements and also IT WORKS ON LINUX NOW!!! Let’s talk about performance first. Anyways, it has been using around 4% and 220MB of ram, which isn’t really what you’d expect from an overlay! So, I used things like DHAT to profile the memory, and noticed that fonts were doing some shenanigans. So I removed egui_system_fonts and loaded directly from C:\Windows\Fonts\segoeui.ttf and RAM usage dropped to 30mb. That was what the previous devlog was about. I then changed the default logic update rate from 10ms (100/s) to 65ms (15/s approx). This reduced idle cpu usage to under 0.2%. But, doing anything with the UI would spike it to 4%, which is still pretty bad. So, I used a method I found in an egui issue thread where I’d count the frametime since the last render, then sleep until the target frametime was finished. For example, if the frame rendered in 2ms but I want 16ms frametime, it would sleep for 14ms. That way, I could limit how often the UI rendered! This made it stay under around 1% CPU forever! Okay, Linux time! Rust is mostly cross-platform, so support was mostly dealing with dumbass design decisions. Since Music relies on GSMTC, I had to feature-gate the entire thing (as well as the windows/windows-future crates) behind cfg(windows) :( I also had to fix Linux font loading (since like I said earlier, it’s hardcoded to segoe ui). So I install fontdb on Linux and search for some popular fonts from there to load instead. Finally, I fixed up the storage paths since it could only load from AppData. I also made it use AppData\Local vs. AppData\Roaming instead of putting everything in Roaming. I first got it working through WSL! ! It took some messing with my GPU drivers but I got it to render. Now was the real challenge: getting it to build on an ACTUAL Linux machine. I had an old, basically broken Surface Pro 3 that I had put Debian+GNOME on for shits and giggles a few months ago. The perfect target! The main problem was getting Rocket League to even launch. I set up Legendary (goated launcher btw, check it out ) and tried to run it. I installed Wine, got Wine Mono, and it failed with a weird cryptic error about the CreateWindow function. The obvious solution to a graphical error: disable EAC. Yay, it launched! Then to get it to build. First I had to fix some filepaths since Linux is case-sensitive (nerds) while I don’t care about case on Windows. Then, rust-lld gave some weird error about simd or something which I didn’t care about. I just ran cargo clean and rebuilt it and it worked fine. Then to run, and it actually worked first try! It’s cool because I went into it expecting to debug a million socket errors, but it actuallly connected and ran. Awesome sauce! Now Linux users can use rlbuddy. More minions to contr- I mean cool users! Cya in the next one! ;) If you check out the rl perf overlay in the screenshot, you’ll be able to guess why this is the laptop I decided to put Linux on.
I’ve been putting this off for a while, but I’ve finally decided I’m going to add asset swapping. There’re a few existing implementations, so I’m reading those as well as some pdfs about the upk format. So basically credit to this document and this implementation . All it can do for now is parse the file summary. The implementation wasn’t too bad since I had Google as well as the C# implementation I just talked about. I basically have trait Deserializable : Sized { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > ; } Then implement that for the various parts (eg. FGuid , a generic TArray ). Then, I use byteorder to read out numbers into each struct. For example, #[derive(Debug)] struct FCompressedChunkInfo { uncompressed_offset : i64 , uncompressed_size : i32 , compressed_offset : i64 , compressed_size : i32 , } impl Deserializable for FCompressedChunkInfo { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > { Ok ( Self { uncompressed_offset : reader .read_i64 :: < LittleEndian > () ? , uncompressed_size : reader .read_i32 :: < LittleEndian > () ? , compressed_offset : reader .read_i64 :: < LittleEndian > () ? , compressed_size : reader .read_i32 :: < LittleEndian > () ? , }) } } I originally prototyped it in Python and then moved to Rust once I got tired of python’s byte shenanigans.
I JUST DESERIALIZED AND RESERIALIZED A UPK. OMAIGOD IM SO HAPPY. my brain is so tired. Alright so the payload still doesn’t get transferred but that’s pretty simple, it’s just Vec::extend. What a challenge! Deserialization actually ended up being the easy part, which is opposite of what I expected from starting the project. It went (relatively) fast since there are a few existing implementations which I could kinda just “borrow” structure parsing from. But, mine is unique in that it almost completely reserializes the package itself. I might’ve been able to “borrow” reserialization, but the impl I’ve been looking at is STRAIGHT ai slop and it’s more annoying to read that than to just do it myself. It was useful though, so I have to respect it. The first problem: basically, the first byte of an FString determines how many parts it has, NOT how many bytes it has. Which wasn’t a problem for parsing, since I had some word-based helpers which worked so I didn’t think much about it. But, when reserializing, I made two mistakes: 1. forgot to add the null terminator (which shouldn’t even be necessary) and 2. I accidentally put the wrong offset. I have no clue why there’s a null terminator for FStrings. The format is [n chars][the char bytes], meaning it should already be known how long the string is. Pretty stupid, but whatever. Anyways, when reserializing you’re supposed to include the null terminator in the string length marker. So, my logic was that I should offset it by two since unicode characters are two bytes. Bleh! I should’ve only incremented by one, since it’s in terms of utf16 chars rather than bytes. Yay, that worked! I don’t know how to summarize the next problem, so I’ll explain the reasoning. The package header is file summary + tables + something else (we’ll get to that later). Anyways, there’s some mysterious padding in between the summary and tables. Parsing, it’s easy to skip over because the summary includes the tables start offset ( name_offset , the name table is the first one). But when reserializing, you gotta keep those offsets intact. Well, I’m not totally sure if you actually have to keep them, but just for the sake of simplicity I tried to (which ended up adding more complexity, which I’ll see if I can remove now). So, I serialize/push the summary to the big Vec. Then, I make a new Vec and serialize the name table at (name_offset - summary_size), since the new Vec has to be encrypted and then appended to the big Vec. I do the same thing for imports/exports (placing the table at import/export _table_offset - summary_size ). Oh no! Since name_table_offset isn’t equal to summary_size, there’s some padding in between, which is expected. HOWEVER! The previous logic would skip over it in the table Vec creation, meaning the table Vec would have some 0-padding at the start. This padding needs to be in the SUMMARY part instead, and the name_offset should basically be the ZERO of the tables Vec! I doubt I would’ve been able to solve this part without the beautiful tool HxD . It’s really easy to use and is always helpful when I’m figgling around with binary. So, it does some more math, calculates the spacing, adds it to the big vec, and removes it from the tables Vec. Then, it re-encrypts the tables Vec and pushes it onto the big Vec! Okay, now that’s done. NOPE! There’s a mysterious structure for some reason at the end of the real table part? Yep, it’s that something else I said we’ll get to. I actually still have no idea what it is. From some research, I gathered it must be the dependencies table, but it’s really poorly documented. So, I ended up just cutting the bytes out from after the export table to the end of the tables part, and “pasting” it back before re-encryption. I do hope this devlog was readable. Now I’ll get to including the actual package payload and hopefully simplifying reserialization offsets. See you soon!
I figured out what comes after export tables! And it took way too long, since I DISCOVERED IT MYSELF! At least, as far as I know. I couldn’t find any information online about this portion of the header, so it was basically luck that I noticed a pattern. Before, I was just copying everything after the export table and pasting them back in afterwards, but as you can guess, that stopped working if I adjusted anything within the encrypted region. Compressed chunk info is a known part, and I figured out the AES padding pretty easily, so most of the time was spent trying to figure out what in the world those 24 bytes were. The first four bytes in the compressed chunk info are how many chunks they are. Here, in the Bubbles boost package, there are two (little endian), with 24 bytes of ???. And in Flamethrower, there are three, with 36 bytes of ???. I noticed that the ??? was always n chunks * 12 bytes (actually, it’s lucky that I didn’t test any which ended up having 0, otherwise I probably wouldn’t have figured it out). Since this probably had something to do with chunks, I made a guess that each chunk had some extra data stored in this array, 12 bytes of info per chunk. Using HxD’s highlight-bytes-and-get-the-decimal-value feature, I noticed a pattern where the first 8 bytes looked like an i64 offset and the last 4 looked like an i32 size, which the compressed chunk infos were also like for their matching counterparts. So, I deserialized it as [i64; i32] * n chunks and was able to read it better. These additional chunk infos seem to kinda sorta match up to uncompressed header offsets, but I don’t really understand what they are (and they’re marked as such in the code, lol). So, with that working (and some fiddling with broken serialization of TArrays which I’m surprised I didn’t catch earlier), I now understood the ENTIRE package header! Hooray! Let’s look at another example. body_grain_SF, the Fennec, has 4 chunks. Guess how many bytes of ??? it has. That’s right, zero! For some reason, a few packages just don’t have those things. After going through a bunch of them, I found that if licensee version was 32, there was no ???. But if it was 33, there WAS ???. I basically just added an if statement and it was fixed. I’m going to try to work on figuring out the padding in between the package summary and the start of the name table, but if I can’t, I suppose I’ll finally get to actually doing package swapping. Later!
I got a name swap! It doesn’t work properly, but I’m glad the game didn’t crash. These hours have been by far the most frustrating because the only way to test is against the real game since it’s really picky, but the game takes like 30 seconds to start, and if it crashes, it gives a cryptic error log, and if it freezes, it doesn’t give any log at all. I spent most of the time messing with moving different offset values forward and backwards, and ended up reverting to a simpler version with no overwriting when the header size changes just to test things. So far, I’ve mostly gleaned that name renaming is possible, but only up to a point. If the name grows too much, the game crashes, and if the name shrinks too much, the game freezes. Additionally, for some reason, total_header_size changes by the padded header size instead of the encrypted header size, which I still don’t understand. It’s seriously weird. I serialize each name properly, and yet the game reads it wrong. This game really does need a new codebase. When UE6 comes out, either the game’s gonna be so good it doesn’t need mods, or it’ll be relatively easily moddable. Or neither, which is the most probable based on Epic Games’ track record. Anyways, enjoy the beautiful screenshot.
IT SWAPPED IT SWAPPED IT SWAPPED AHAHAHHAHAHAHHAHAHAHAHHA FINALLY Okay now I gotta make it work for other pairs of boosts. If WHEN that works, I’ll actually put it in rlbuddy. I removed all the code relating to changing offsets to try to give myself a minimal workspace to tinker in, with as little side effects as possible. So, all the current code does is 1. open them 2. replace the name table entries and package guid. Surprisingly simple. Once I make it a bit more generic, I can extend it to support more swaps. If I’m really unable to get it to work for more combinations, I’ll probably end up just publishing the poc repo and not adding swapping to rlbuddy at all. This is a great motivation boost, though. I was honestly dreading coming home to work on it today because I was done with failing over and over, and considering giving up.
IT WORKS WHEN THE HEADER EXPANDS NOW YAYAYYAYAYAYYAYAYYAYAYAY I’m gonna be honest, the problem might just have been that my testing package was corrupted. I was debugging my deserialization logic, which I thought might have some parsing issue near the header extraction, and noticed that once the encrypted region deserializer’s Cursor reached the end of the region, it was actually FARTHER than the package summary’s total_header_size - by 6 bytes! That’s pretty bad, and I don’t know how something like that even happened. Anyways, I repaired the game and brought over the shiny new upk and… it worked. I’m pretty sure that I only accidentally did this while tidying up my workspace a few hours ago, but if this has genuinely been the thing holding me back for the past few days - I also finally made the poc code public, at https://github.com/kalilamodow/rl-upk-testing/
Apparently there are a bunch of different AES keys rocket league uses, not just one. You can get a list of them from the psynet config url, and then do some weird crc stuff to change them from “content keys” to aes keys. I discovered the rocket league mapmaking discord today and I’m blown away by the amount of information on there, and also apparently my whole thing about the unknown bytes when licensee version > 32 was straight up wrong, which is funny. Anyways it works for all items now, which is great. I’m gonna work on actually putting it in rlbuddy now, hopefully that goes well
rlbuddy now has item swapping! Basically, making one item appear like another to use items you don’t actually own. These hours were spent on a few different things. Firstly, I optimized the thing a bunch! There were a few places that were pretty slow since the original repo was mainly for testing. For example instead of decrypting the entire header and rechecking it to find the right key, it only loads the first 4 blocks and attempts to decrypt the first FString. If it fails, that means the AES key isn’t valid. Also, I improved the error handling with anyhow. It actually makes it so much easier to deal with things and was pretty useful when debugging the move over to the actual app. Now I’m just going to work on polishing the panel UI a bit more, since it’s still kind of ugly.
I made a ton of improvements to the asset swapper! And fixed a bug with the music player which is cool technically, so I’ll start with that. The player uses the GSMTC api, which is async, but egui doesn’t really like async. So, I made it so that every time you wanted to run some command on the current session, it would start up a new thread. This was less than ideal for a few reasons: terrible performance race conditions could happen just… in Windows itself The main problem was 2: for example, if you skipped a replay too fast, the Play command from the end of the replay might actually reach Windows before the Pause command from the replay start, leaving your music paused. So instead, it starts one dedicated worker thread which has a channel which receives a Box<dyn FnOnce(Session)> , and executes at most one command every 50ms (only one command per loop, fixed loop time of 50ms). It’s really interesting because you actually end up sending a closure through a channel, which feels funny but when you really think about it it’s just ownership semantics. But, that’s working great now! On to swapper improvements! First, I moved most of the swapper module to anyhow handling (it’s heaven!), and I also modernized the upk api a bit since it was basically dragged directly from the proof-of-concept repo, meaning it was not really application-ready. Also, it previously looked at the game’s webcache to decode the AES keys for header decryption, but now it uses the wonderful Toga-Files repository along with a really nice caching layer for it to load items and their associated API keys. Having access to the actual item data is also way better since you don’t have to manually type in a package name which is kinda weird for any normal person. Now, you can select it from a dropdown instead! I love UX.
rlbuddy now loads additional playlists straight from the game’s cached webconfig, instead of hardcoding them all! This means that the list of playlists will basically never go out of date. There are actually quite a few services which rely on game files (eg. auto stats api setup, custom maps, asset swapper). So, the first thing I did was to refactor it so make all of these load from the same global value. Then, for playlists, I made it read from a specific file in the game’s http cache directory which contains a bunch of configuration. Then, it parses it into a JSON object, grabs all the values with Class PlaylistSettings_TA, and then extracts the title and playlist id! There are still a bunch of built-in Playlists, since those have internal things like going from a casual playlist type to its respective competitive one or having the hard-coded list of singleplayer playlists. But, all the other ones, like ltms are dynamically loaded. Yay!
I got licensee version 34 (encrypted payloads too) to swap finally! Okay, so this was awesome. Rocket League’s been having a bunch of updates lately, which breaks the packages of people trying to get free stuff. So, in a Reddit thread, I ended up dishing out a bunch of swapped asset files for people in this situation. There’s a new boost which everybody wanted really bad since it was really rare (but they decided to make it unlockable at rocket pass lv99 so it doesn’t even matter anymore), and it was UNSWAPPABLE for three reasons: it was encrypted specially i hadnt encountered specially encrypted packages meaning their handling was wrong aes keys werent out for it yet (or so I thought) I’ll start with 3. I had written a tool which looks in the games cache for AES keys, and dumped them, and it worked great. What I didn’t expect is the filename to change between versions. So, I was super confused since yesterday since the AES key for the boost was just… missing. Thankfully, the geniuses at the RLMM discord got it and helped me figure out that the file I was reading from was just outdated. Great! Anyways, not too big of a deal, just a big delay. Now it’s time for the real challenge: figuring out how the hell to handle this type of package. First, I did some research. The twelve bytes of padding in files with licensee version >=33 before the summary are actually a nonce/aes iv, not just padding. Then, the header is encrypted with AES-CTR with the twelve first bytes of the iv just being the nonce. And the compressed chunks are encrypted too here: each one is also AES-CTRed with their own nonces in FCompressedChunkInfo. Thing is, I don’t have an implementation to really go off anymore, meaning there’s a lot more trial and error. For the original implementation, there were one or two existing asset swappers (though they were vibecoded meaning more of a puzzle to figure out what they’re even doing), but this time I was mostly relying on emii’s fork of UEViewer. Anyways, after spending a while figuring out what exactly I had to masquerade (payload, key, swap nonces) I finally got it to work!
Not much in terms of super-cool stuff this time. Highlights are: make sure dynamic playlist loading uses the latest cache file (and also fix its loading on normal people’s rocket league installs) loading the cache file on another thread so it doesnt freeze the whole app for a second on the first lazy lock access searching for items in the item swapper moved the error handling of the map loader to anyhow So no ultra-exciting things to talk about. anyhow is really cool though, it really simplifies error handling everywhere in the app, and I’m a big fan of its bail! macro. I’m also using Cow a lot more. Moo!
I made a standalone web-based swapper for the people who don’t want to download an entire app. A lot of people had broken packages after the last update but didn’t want to install a dedicated program just for a few swaps. So, I used the asset swapper backend of rlbuddy to make this thingamabob which runs entirely in the browser! First, I had to find out how to actually share rlbuddy’s asset swapper with other projects. Turns out Cargo has a cool thing called workspaces where you can have multiple crates in the same repo! So I moved the dedicated UPK/AES etc. stuff into a new crate and added it as a dependency in regular rlbuddy. Then, I whipped up a small wasm-compatible eframe app with the template, and included the new crate as a dependency. I made a big state machine of the steps meaning it’s impossible to have an invalid state, which is really nice. The only problem was that Rust’s ownership system isn’t smart enough to deal with it, so the code is a bit repetitive in places but it’s definitely worth it. The WASM restrictions were super annoying, mainly do to with filesystem access and requiring async. I ended up using the egui-async crate and spilling Binds all over the place within the state machine. I couldn’t even figure out how to get the actual swap procedure to run in a different thread. I also spent like 30 minutes debugging why in the world asset swapping was just broken. Even when I verified the same binary data were going in to the Upk object in the webapp and rlbuddy, for some reason the output upk was just different. Turns out I used chosen_replacement.name instead of chosen_replacement.package.name() . Isn’t that great? Anyways, it works fine now and I’m planning on posting it on r/RocketLeagueMods and possible r/RocketLeague.
A few fixes here and there. Some refactors, caching externally loaded playlists in savedata, and fixing a deadlock when clearing the items cache. And for some reason the decal option was missing from the items list picker.
more small improvements. i gave the session stats widget an actual service as well which speeds things up a lot since its not recalculating statistics every single frame. the swapper also uses the backup file if one is available and it no longer accepts duplicate custom maps
Ships:
rlbuddy is a feature-filled companion for Rocket League! It shows the skill of everyone in your lobby and has tons of toggleable widgets and features to make your life a lot easier, from Discord integration to music control. This is my first non-tiny Rust project, and I think it was really great! I’ve learned a lot such as proper state management and the ins and outs of Rust’s syntax. You can give it a try by heading to the Github releases section. If you play Rocket League, I hope you use it!
rlbutddy is a feature-rich companion for Rocket League, and v1.2 is out. There’s been some big architectural changes meaning it’s faster and bug-free-er, as well as big new features! New!!! Avatars! Now you can see people’s profile pictures even when you’re not on their platform. Custom map loader! You can import maps from a ZIP or download them straight from Bakkesplugins! Gamepad overlay! Show your controls while playing, to show off your bindings or get some help with your speedflips. I think I’ve definitely improved at Rust since the last release. Just in terms of the amount of mistakes I make, I feel like it’s way more smooth sailing than before. For example, I was able to (mostly) write not-so-buggy code and “run the borrow checker in my head” without needing to cargo check a million times, and clippy tends to have a lot less suggestions for me. Pretty great!
I made rlbuddy, a rocket league companion app! This is the third ship so far. The big features this time are the asset swapper and Linux support, but I think that the feature I’m most proud of this time is the asset swapper! It inserts the appearance of one item into the file of another, meaning by swapping out assets for others you can make your car look however you like! (Client-side only, of course). I learned a lot about byte-level manipulation and working with raw data streams and encryption/decryption in Rust, and I can read hex (relatively) well now! It’s also great because I think this combined with the doorstop experiment from a while ago gives me a nice base to try some reverse-engineering challenges in the future. I also worked a lot on performance this time, such as tuning loop times/ui fps caps and minimizing ram usage (I achieved around an 80% reduction here!) There are a crap ton more features added than that (totaling almost 100 commits), but I’m pretty sure you’re not supposed to have massive feature-dumps on the ship text. So the full list is on the latest github release! In the image, you can see I have a white fennec. In reality, I don’t actually have a tw trim, and the equipped decal isn’t compatible with the fennec either. But, using the power of asset swapping, I can get a beautiful all-white car. Neat!...
|
1793090856.5435529
|
1793177256.5435529
|
|
70058
|
screen recorder by @Aarjav_3 | Stardance
|
Aarjav_3
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T16:55:05Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a very light screen recorder uses around 400mb ram 7% cpu and 0.2%GPU i made it a in jan 2026 the toughest part was to implement a feature in which u can record a specific window i was stuck a lot so i used copilot i hope its satisfacotry ty :)", "repo": "https://github.com/aarjavjain-in/screen-recorder", "demo": "https://drive.google.com/file/d/16EgH0iPuvEWaOY3XpwzCYKGLrS5cI19B/view?usp=sharing"}]...
|
[{"post_id": 80185, "ts": "202 [{"post_id": 80185, "ts": "2026-10-16T16:49:06Z", "hours": 1.2078, "text": "added a feature in which u can record a pirticular window"}]...
|
Title: screen recorder by @Aarjav_3 | Stardance
D Title: screen recorder by @Aarjav_3 | Stardance
Devlogs:
added a feature in which u can record a pirticular window
Ships:
i made a very light screen recorder uses around 400mb ram 7% cpu and 0.2%GPU i made it a in jan 2026 the toughest part was to implement a feature in which u can record a specific window i was stuck a lot so i used copilot i hope its satisfacotry ty :)...
|
1793199002.8744128
|
1793285402.8744128
|
|
53942
|
Komi OS by @SebbyMortimer | Stardance
|
SebbyMortimer
|
1
|
19.81
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T21:30:48Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Gonna preface this by saying I completely forgot to format my last devlog (even though I know I usually don’t do too much formatting but I at least turn the header into an actual header) so it’s kinda just a big wall of text. So, I made a custom WebOS, I started out by following the guide before splitting off to do my own thing after I thought that I’d gotten everything that I thought I could get out of it. This OS is heavily based on Komi Can’t Communicate so you’ll see that theming throughout the entire project. I learned a lot about web development in this project, especially since I was doing something a lot different than what I usually am creating when working on websites so I gained a ton of ball knowledge about tiny little things and fixes that get your website working nice the way that you want it. I also gained a new appreciation for flexboxes, they are absolutely amazing and now I’m using them for almost anything, goodbye clearfixes. So finding those little bits of ball knowledge through debugging was pretty challenging but I’m proud of what I’ve been able to accomplish so far however I’m no where near finished and I really want to keep working on this project. There are many new features in this project that aren’t listed in the guide, I think the two most obvious ones are a music player and the ability to have infinite windows of the same app open at the same time. To test my project, go to the github repo or demo link directly and you’ll find it there. Thank you.", "repo": "https://github.com/SebbyMortimer/Komi-OS", "demo": "https://sebbymortimer.co.uk/Komi-OS/"}]...
|
[{"post_id": 80184, "ts": "202 [{"post_id": 80184, "ts": "2026-10-16T16:35:37Z", "hours": 6.81, "text": "Komi OS devlog 4 It’s been a while since I wrote my last devlog, just been starting university, but I’ve made a ton of changes since my first ship and I’ll try to remember them all. First off, the boot screen has been cleaned up, the boot video will now stop at the correct time consistently on the beat no matter how bad your wifi might be, and I created a little Windows XP logo cutout on the bootscreen just as a nice little thing. The main difference you’ll notice immediately after it’s booted up is that there is now a taskbar! I always knew I was going to add this eventually I just wanted to implement it properly after I had gotten the apps and desktop working as I intended. There are three apps on the taskbar currently which are the notes, music and settings apps and the ones displayed on the taskbar differ slightly to the desktop icons, where the settings icon is not but there’s an extra app/game that I added there instead. When you click on app icons in the taskbar they pop down and back up, and when you hover over them the background behind them also lights up to show which app will open if you were to click now. I added my own custom right click/“context menu” which I also knew I was going to add at some point and currently it only has copy and paste (I say only but pasting was a pain to program, more than you’d initially think) however more options will be added to it in the future. Now inside the settings app I’ve began adding a side menu where if you click on each one it’ll take you to a different settings page, and the first one allows you to pick a different wallpaper from a selection of minimal Komi wallpapers which I’ll have save eventually in your browser when I implement user preferences. That about page is just there as a template currently just so I could test page switching but I’ll add to that in the future and also add more pages, one last thing for the settings app though is in the sidebar you can see little coloured icons to make it immediately more obvious when looking for a specific page. The last app I added since the last devlog was embedding eaglercraft into an app (which wasn’t as easy as I’d hoped it’d be) however I managed to get it working consistently enough to be able to keep it on my site, the corners of it are clipped to the window so that it doesn’t look out of place and it fits right in. I also added a ton of tiny tweaks, too many and too small to list but just things like changing the time to only show the time just to simplify any clutter in the top right, shadows were tweaked on the desktop icons as well as a dark black solid shadow was added to all of the text under the icons and I added a purple highlight colour when selecting text to match Komi’s haircolour. Other things I could remember were things like adding a favicon and moving some of my styling that had snuck into my HTML back into my CSS file but now I’m really reaching for stuff and this devlog is long enough anyway. Excited to continue working on this"}, {"post_id": 65037, "ts": "2026-09-09T20:56:52Z", "hours": 4.7389, "text": "Komi OS devlog 3 I believe my cold is starting to go away which is good, and I’ve been able to do little bits here and there this week with my OS and I’m super excited to continue working on it. I worked mostly on the music player since the last devlog and I was able to add a playback slider that lets you seek through the song thats currently playing while also showing the current time on the left, with the total duration of the song on the right. I added previous/skip buttons that let you move between songs in the playlist (current total of 4, which are 2 opening themes and 2 ending themes from the show) and I added/switched a lot of buttons to have icons like the play/pause button, previous/skip buttons and both sides of the volume slider. Because of the added playback slider and the icons taking up more space I had to increase the window height of the music player and I also slightly darkened the background of the player too to increase the contrast of the text and buttons and stuff in front of it to make them easier to see on lighter cover art. Lastly, if the song ends it will automatically move forward to the next song, the same thing if a song was currently playing and you skip it’ll autoplay the next song, otherwise if you skip while paused it’ll stay paused. Outside of the music player, I added drop shadows to all the windows and the current focused window gains a darker shadow to show that it’s focused. I also began work on a boot screen that I’ll probably create a cooldown for so that you don’t have to watch it boot up every time you reload the page since it’s pretty long but I’m having a really great time working on this project, it’s been really fun and I can’t wait to get to work on it some more. If I forget anything else I worked on in this devlog I might mention it in my ship."}, {"post_id": 60144, "ts": "2026-09-02T10:13:05Z", "hours": 1.6344, "text": "Komi OS devlog 2 Over the last two days I: Got a heavy cold, not fun Started working on my music player, much more fun :D I first implemented the nice blurred background you quite often get with music players, along with the music cover art. Behind the scenes I got the play/pause button to work and play the current song as well as a working volume slider. I’ve also implemented a function that lets me change the song that’s currently playing however I’ve not yet attached it to any buttons or anything so I can only do it via script. I think I’ll either just have forward/back buttons that move through a hidden playlist or I might make an actual playlist that you select from if I can think of a design for that. Almost forgot to say that I also have the music and artist’s names appear alongside the cover art and I created a spotify-esque icon to make it more obvious to people what my app does before they even open it. I believe I covered everything, a couple of minor annoyances when trying to implement things but I guess I’ll count that as new web ball knowledge."}, {"post_id": 59449, "ts": "2026-09-01T09:38:38Z", "hours": 6.8881, "text": "Komi OS devlog 1 Gonna preface this by saying I really should’ve made more devlogs to split this up more because now I’m going to have to try and remember everything that I did, so here goes. I followed most of the guide initially just to get a similar setup working, but from the beginning I knew there were some fundamental things I wanted to change about the project like making windows use classes/OOP so that I can have multiple of them and easily interact with specific windows and another thing I wanted to change was just having some cleaner/nicer ways of doing things since I noticed the guide was kept relatively simple for absolute beginners. Anyway, once I had gotten as much as I wanted from the guide, I split off and started making the project fully my own. Windows being fully (I believe fully, altho I still have to do some cleanup) converted to using classes along with the ability to have multiple windows of the same app open is really the big main obvious one, however I have made so many tiny changes that don’t show visually which you’ll notice a lot more while you’re using and interacting with it, like adding mini app icons on window headers, changing the z-index ordering so it doesn’t infinitely go up, creating my own selection code for icons on the desktop including them requiring a double click to open, making some text/images non-selectable just like real operating systems and so many more little tweaks that really make it super intuitive to use. Currently I’m stuck on something trivial, I’m trying to decide between two images to use as the operating system’s “image” but I’m just going to set that aside for now, so instead next I think I will be working on adding either a music player or a settings menu that will allow me to change out the wallpaper, and maybe also save/remember anything you do on the operating system. Or I may leave that to WebOS 2 and just work on getting a nice base WebOS 1 page working by customising the operating system more to make it more unique. Either way I guess we’ll see. Sorry if you had to read this entire devlog I understand it’s a lot, so thank you very much."}]...
|
Title: Komi OS by @SebbyMortimer | Stardance
Devl Title: Komi OS by @SebbyMortimer | Stardance
Devlogs:
Komi OS devlog 1 Gonna preface this by saying I really should’ve made more devlogs to split this up more because now I’m going to have to try and remember everything that I did, so here goes. I followed most of the guide initially just to get a similar setup working, but from the beginning I knew there were some fundamental things I wanted to change about the project like making windows use classes/OOP so that I can have multiple of them and easily interact with specific windows and another thing I wanted to change was just having some cleaner/nicer ways of doing things since I noticed the guide was kept relatively simple for absolute beginners. Anyway, once I had gotten as much as I wanted from the guide, I split off and started making the project fully my own. Windows being fully (I believe fully, altho I still have to do some cleanup) converted to using classes along with the ability to have multiple windows of the same app open is really the big main obvious one, however I have made so many tiny changes that don’t show visually which you’ll notice a lot more while you’re using and interacting with it, like adding mini app icons on window headers, changing the z-index ordering so it doesn’t infinitely go up, creating my own selection code for icons on the desktop including them requiring a double click to open, making some text/images non-selectable just like real operating systems and so many more little tweaks that really make it super intuitive to use. Currently I’m stuck on something trivial, I’m trying to decide between two images to use as the operating system’s “image” but I’m just going to set that aside for now, so instead next I think I will be working on adding either a music player or a settings menu that will allow me to change out the wallpaper, and maybe also save/remember anything you do on the operating system. Or I may leave that to WebOS 2 and just work on getting a nice base WebOS 1 page working by customising the operating system more to make it more unique. Either way I guess we’ll see. Sorry if you had to read this entire devlog I understand it’s a lot, so thank you very much.
Komi OS devlog 2 Over the last two days I: Got a heavy cold, not fun Started working on my music player, much more fun :D I first implemented the nice blurred background you quite often get with music players, along with the music cover art. Behind the scenes I got the play/pause button to work and play the current song as well as a working volume slider. I’ve also implemented a function that lets me change the song that’s currently playing however I’ve not yet attached it to any buttons or anything so I can only do it via script. I think I’ll either just have forward/back buttons that move through a hidden playlist or I might make an actual playlist that you select from if I can think of a design for that. Almost forgot to say that I also have the music and artist’s names appear alongside the cover art and I created a spotify-esque icon to make it more obvious to people what my app does before they even open it. I believe I covered everything, a couple of minor annoyances when trying to implement things but I guess I’ll count that as new web ball knowledge.
Komi OS devlog 3 I believe my cold is starting to go away which is good, and I’ve been able to do little bits here and there this week with my OS and I’m super excited to continue working on it. I worked mostly on the music player since the last devlog and I was able to add a playback slider that lets you seek through the song thats currently playing while also showing the current time on the left, with the total duration of the song on the right. I added previous/skip buttons that let you move between songs in the playlist (current total of 4, which are 2 opening themes and 2 ending themes from the show) and I added/switched a lot of buttons to have icons like the play/pause button, previous/skip buttons and both sides of the volume slider. Because of the added playback slider and the icons taking up more space I had to increase the window height of the music player and I also slightly darkened the background of the player too to increase the contrast of the text and buttons and stuff in front of it to make them easier to see on lighter cover art. Lastly, if the song ends it will automatically move forward to the next song, the same thing if a song was currently playing and you skip it’ll autoplay the next song, otherwise if you skip while paused it’ll stay paused. Outside of the music player, I added drop shadows to all the windows and the current focused window gains a darker shadow to show that it’s focused. I also began work on a boot screen that I’ll probably create a cooldown for so that you don’t have to watch it boot up every time you reload the page since it’s pretty long but I’m having a really great time working on this project, it’s been really fun and I can’t wait to get to work on it some more. If I forget anything else I worked on in this devlog I might mention it in my ship.
Komi OS devlog 4 It’s been a while since I wrote my last devlog, just been starting university, but I’ve made a ton of changes since my first ship and I’ll try to remember them all. First off, the boot screen has been cleaned up, the boot video will now stop at the correct time consistently on the beat no matter how bad your wifi might be, and I created a little Windows XP logo cutout on the bootscreen just as a nice little thing. The main difference you’ll notice immediately after it’s booted up is that there is now a taskbar! I always knew I was going to add this eventually I just wanted to implement it properly after I had gotten the apps and desktop working as I intended. There are three apps on the taskbar currently which are the notes, music and settings apps and the ones displayed on the taskbar differ slightly to the desktop icons, where the settings icon is not but there’s an extra app/game that I added there instead. When you click on app icons in the taskbar they pop down and back up, and when you hover over them the background behind them also lights up to show which app will open if you were to click now. I added my own custom right click/“context menu” which I also knew I was going to add at some point and currently it only has copy and paste (I say only but pasting was a pain to program, more than you’d initially think) however more options will be added to it in the future. Now inside the settings app I’ve began adding a side menu where if you click on each one it’ll take you to a different settings page, and the first one allows you to pick a different wallpaper from a selection of minimal Komi wallpapers which I’ll have save eventually in your browser when I implement user preferences. That about page is just there as a template currently just so I could test page switching but I’ll add to that in the future and also add more pages, one last thing for the settings app though is in the sidebar you can see little coloured icons to make it immediately more obvious when looking for a specific page. The last app I added since the last devlog was embedding eaglercraft into an app (which wasn’t as easy as I’d hoped it’d be) however I managed to get it working consistently enough to be able to keep it on my site, the corners of it are clipped to the window so that it doesn’t look out of place and it fits right in. I also added a ton of tiny tweaks, too many and too small to list but just things like changing the time to only show the time just to simplify any clutter in the top right, shadows were tweaked on the desktop icons as well as a dark black solid shadow was added to all of the text under the icons and I added a purple highlight colour when selecting text to match Komi’s haircolour. Other things I could remember were things like adding a favicon and moving some of my styling that had snuck into my HTML back into my CSS file but now I’m really reaching for stuff and this devlog is long enough anyway. Excited to continue working on this
Ships:
Gonna preface this by saying I completely forgot to format my last devlog (even though I know I usually don’t do too much formatting but I at least turn the header into an actual header) so it’s kinda just a big wall of text. So, I made a custom WebOS, I started out by following the guide before splitting off to do my own thing after I thought that I’d gotten everything that I thought I could get out of it. This OS is heavily based on Komi Can’t Communicate so you’ll see that theming throughout the entire project. I learned a lot about web development in this project, especially since I was doing something a lot different than what I usually am creating when working on websites so I gained a ton of ball knowledge about tiny little things and fixes that get your website working nice the way that you want it. I also gained a new appreciation for flexboxes, they are absolutely amazing and now I’m using them for almost anything, goodbye clearfixes. So finding those little bits of ball knowledge through debugging was pretty challenging but I’m proud of what I’ve been able to accomplish so far however I’m no where near finished and I really want to keep working on this project. There are many new features in this project that aren’t listed in the guide, I think the two most obvious ones are a music player and the ability to have infinite windows of the same app open at the same time. To test my project, go to the github repo or demo link directly and you’ll find it there. Thank you....
|
1793101945.1018026
|
1793188345.1018026
|
|
51533
|
NetStash by @leam | Stardance
|
leam
|
0
|
0.28
|
0
|
[]
|
[{"post_id": 80181, "ts": "202 [{"post_id": 80181, "ts": "2026-10-16T15:59:21Z", "hours": 0.2847, "text": "Initial commit, made the foundation of the web, planning to add a calendar feature soon but for now i must full prove the code and find shorter ways for the code."}]...
|
Title: NetStash by @leam | Stardance
Devlogs:
Ini Title: NetStash by @leam | Stardance
Devlogs:
Initial commit, made the foundation of the web, planning to add a calendar feature soon but for now i must full prove the code and find shorter ways for the code....
|
1792673592.849505
|
1793278392.849505
|
|
69334
|
Flight Controller by @LeonOMO | Stardance
|
LeonOMO
|
0
|
7.3
|
0
|
[]
|
[{"post_id": 80180, "ts": "202 [{"post_id": 80180, "ts": "2026-10-16T15:50:01Z", "hours": 7.2978, "text": "Ive made a flightcontroller"}]...
|
Title: Flight Controller by @LeonOMO | Stardance
Title: Flight Controller by @LeonOMO | Stardance
Devlogs:
Ive made a flightcontroller...
|
1793130902.700192
|
1793735702.700192
|
|
6269
|
DuckML / Duckonomics by @ZiggyZonko | Stardance
|
ZiggyZonko
|
1
|
10.0
|
101
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T11:52:33Z", "hours": 10.0, "multiplier": 10.13, "payout": 101, "blessing": "neutral", "text": "Created a duck themed economics simulator, implementing machine learning. I am extremely proud of this project, it was such a fun idea I randomly thought of on the bus home from school. I must add more playability and user interactivity in the next release! (the readme lists were made by AI, the rest was not, I wanted the emojis 🫠, just putting that out there if any of the shipwrighters are questioning it’s authenticity.)", "repo": "https://github.com/ZiggyZonko/Duckonomics", "demo": "https://github.com/ZiggyZonko/Duckonomics/releases/tag/v1.0.0-alpha"}]...
|
[{"post_id": 8018, "ts": "2026 [{"post_id": 8018, "ts": "2026-06-13T11:44:19Z", "hours": 0.395, "text": "More accessories implemented based on wealth! Currently making the demo for shipping #1"}, {"post_id": 6744, "ts": "2026-06-11T09:12:14Z", "hours": 0.3319, "text": "Made a panel to click the ducks and check their age, money, name etc. More shops to come…"}, {"post_id": 6736, "ts": "2026-06-11T08:45:29Z", "hours": 0.2822, "text": "Main Menu Created and working, going to add more shops and machine learning capabilities to choosing different shops"}, {"post_id": 6149, "ts": "2026-06-10T10:37:09Z", "hours": 0.5056, "text": "Made a Bussiness Tax for the government and let the simulator run for 150 days to see what happens, everyone is rich and most only last until they turn 8, will start tweaking the taxing, birth and death rate to simulate a realistic economy."}, {"post_id": 5560, "ts": "2026-06-09T11:53:22Z", "hours": 1.2406, "text": "Added Population control, changing the birth and death rate to execute once every 30 second day. Added an Obituary and implemented Government Taxing on wages, (jobs added) and jobs include: JOBS = { “Baker”: 12, “Fisher”: 8, “Merchant”: 15, “Programmer”: 25, “Unemployed”: 0 } Suggest some jobs in the comments, and suggest some first and last names too FIRST_NAMES = [ “Bob”, “Sarah”, “Alex”, “Emily”, “Oscar” ] LAST_NAMES = [ “Quackson”, “Featherstone”, “Breadsworth”, “McDuck”, “Waddles” ] Also added some UI regarding the treasury and added a seperate birth rate for an additional child."}, {"post_id": 5517, "ts": "2026-06-09T10:17:36Z", "hours": 1.9308, "text": "Added Uniquness, more traits, age, birth, death, accessories based on wealth, names and working toward a more functioning society. Also made a cleaner codebase, with constants and variable scripts in place to make everything cleaner. Fixed the duck finding a shop algorithm, based on nearest shop AND STOCK now, rather than just distance. Increase Screen Size and minor tweaks here and there."}, {"post_id": 4807, "ts": "2026-06-08T09:41:34Z", "hours": 0.4033, "text": "Added a population counter and fixed a previous bug with selling bread"}, {"post_id": 4791, "ts": "2026-06-08T09:00:16Z", "hours": 1.5008, "text": "Added Waves, Icons, And working shop system that refills the stock everyday and uses machine learning to predict what the stock of the bakery needs to be in order to sustain the hunger of the populaation. It tracks the sales, predictions, stock and money of the stores. I also added a day counter and a time label to ensure players know the status of the shop and sales."}, {"post_id": 3392, "ts": "2026-06-06T09:17:12Z", "hours": 1.3297, "text": "Began Duckonomics, created the basics and beginning to implement Machine Learning into the prices for profit of bread. Ducks have a random movement pattern, bread label in progress. Each duck will have own character traits that make it unique."}, {"post_id": 2070, "ts": "2026-06-04T11:49:29Z", "hours": 1.1031, "text": "Experimented with Markov Chains and made a dynamic system that scans a dataset of sentences based off a theme, forms new sentences, that adds to the csv of QuackJudge. This creates a sustainable loop all based off one single initial dataset and a Markov Chain. The Markov chain tracks different sentences and interprets words that come after one another to form sentences. Realistically my dataset isn’t large enough to showcase accurate data but still showcases the concept’s nature."}, {"post_id": 1397, "ts": "2026-06-03T12:33:44Z", "hours": 0.9636, "text": "Made a simple word to emotion classifier using the Naive Bayes Classifier algorithm, with training of 90% and testing of 10%, it provides on average, 51% accuracy based on self-testing. By increasing the size of the dataset, the accuracy and vocabulary will increase, showcased in the vectorisation of the word below, where the one is a recognised word. Mathematically this is represented in a multi-dimensional space based on how many known words the AI understands based on training and testing. Might test image classification next or try new Machine Learning Concepts to create an All-in-one, self taught AI, image, audio, emotion etc."}]...
|
Title: DuckML / Duckonomics by @ZiggyZonko | Stard Title: DuckML / Duckonomics by @ZiggyZonko | Stardance
Devlogs:
Made a simple word to emotion classifier using the Naive Bayes Classifier algorithm, with training of 90% and testing of 10%, it provides on average, 51% accuracy based on self-testing. By increasing the size of the dataset, the accuracy and vocabulary will increase, showcased in the vectorisation of the word below, where the one is a recognised word. Mathematically this is represented in a multi-dimensional space based on how many known words the AI understands based on training and testing. Might test image classification next or try new Machine Learning Concepts to create an All-in-one, self taught AI, image, audio, emotion etc.
Experimented with Markov Chains and made a dynamic system that scans a dataset of sentences based off a theme, forms new sentences, that adds to the csv of QuackJudge. This creates a sustainable loop all based off one single initial dataset and a Markov Chain. The Markov chain tracks different sentences and interprets words that come after one another to form sentences. Realistically my dataset isn’t large enough to showcase accurate data but still showcases the concept’s nature.
Began Duckonomics, created the basics and beginning to implement Machine Learning into the prices for profit of bread. Ducks have a random movement pattern, bread label in progress. Each duck will have own character traits that make it unique.
Added Waves, Icons, And working shop system that refills the stock everyday and uses machine learning to predict what the stock of the bakery needs to be in order to sustain the hunger of the populaation. It tracks the sales, predictions, stock and money of the stores. I also added a day counter and a time label to ensure players know the status of the shop and sales.
Added a population counter and fixed a previous bug with selling bread
Added Uniquness, more traits, age, birth, death, accessories based on wealth, names and working toward a more functioning society. Also made a cleaner codebase, with constants and variable scripts in place to make everything cleaner. Fixed the duck finding a shop algorithm, based on nearest shop AND STOCK now, rather than just distance. Increase Screen Size and minor tweaks here and there.
Added Population control, changing the birth and death rate to execute once every 30 second day. Added an Obituary and implemented Government Taxing on wages, (jobs added) and jobs include: JOBS = { “Baker”: 12, “Fisher”: 8, “Merchant”: 15, “Programmer”: 25, “Unemployed”: 0 } Suggest some jobs in the comments, and suggest some first and last names too FIRST_NAMES = [ “Bob”, “Sarah”, “Alex”, “Emily”, “Oscar” ] LAST_NAMES = [ “Quackson”, “Featherstone”, “Breadsworth”, “McDuck”, “Waddles” ] Also added some UI regarding the treasury and added a seperate birth rate for an additional child.
Made a Bussiness Tax for the government and let the simulator run for 150 days to see what happens, everyone is rich and most only last until they turn 8, will start tweaking the taxing, birth and death rate to simulate a realistic economy.
Main Menu Created and working, going to add more shops and machine learning capabilities to choosing different shops
Made a panel to click the ducks and check their age, money, name etc. More shops to come…
More accessories implemented based on wealth! Currently making the demo for shipping #1
Ships:
Created a duck themed economics simulator, implementing machine learning. I am extremely proud of this project, it was such a fun idea I randomly thought of on the bus home from school. I must add more playability and user interactivity in the next release! (the readme lists were made by AI, the rest was not, I wanted the emojis 🫠, just putting that out there if any of the shipwrighters are questioning it’s authenticity.)...
|
1793144841.879362
|
1793231241.879362
|
|
65413
|
Celestie by @sylvieisnton | Stardance
|
sylvieisnton
|
0
|
32.71
|
0
|
[]
|
[{"post_id": 80175, "ts": "202 [{"post_id": 80175, "ts": "2026-10-16T15:37:27Z", "hours": 27.3972, "text": "I FORGOT TO WRITE LOGS but icons were made and sadness was had for the 17.5 hours that aren’t counted"}, {"post_id": 73693, "ts": "2026-09-25T18:29:16Z", "hours": 5.31, "text": "Create logo, add SVG building"}]...
|
Title: Celestie by @sylvieisnton | Stardance
Devl Title: Celestie by @sylvieisnton | Stardance
Devlogs:
Create logo, add SVG building
I FORGOT TO WRITE LOGS but icons were made and sadness was had for the 17.5 hours that aren’t counted...
|
1793087422.4841146
|
1793692222.4841146
|
|
44244
|
Lost&Found by @yeagerist | Stardance
|
yeagerist
|
3
|
23.0
|
262
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-24T03:44:47Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "this is a tribute to my lost&found with a dead last ship with small update", "repo": "https://github.com/Aarjal/The_Bug", "demo": "https://the-bug.vercel.app/"}, {"ship_num": 2, "ts": "2026-09-25T10:20:33Z", "hours": 5.0, "multiplier": 11.08, "payout": 59, "blessing": "neutral", "text": "This is my second ship to my project lost&found with little css tweaks and UI/UX enhancements as per the reviews from first ship. This web app is basically a platform for people to perform actions regarding lost items. (either seek their lost item or post a found item) The basic workflow is : -Sign up with a random acc and post a lost item in feed -Sign up with a diff random acc and post a related found item in feed -The system will create a match between those two items and let you choose wat to do furthur with it. As per last ship reviews, One important suggestion i found was to include a demo video of whole workflow in my README and this time I’ve not missed that out dw. That might help yall a lot in this ship since signing in and our repeatedly is troublesome. Looking forward to hear from you guys. (Suggestions are immensely appreciated😋)", "repo": "https://github.com/Aarjal/The_Bug", "demo": "https://the-bug.vercel.app/"}, {"ship_num": 3, "ts": "2026-09-14T09:31:21Z", "hours": 16.0, "multiplier": 12.39, "payout": 203, "blessing": "neutral", "text": "I built Lost&Found mainly with the aim to make finding lost belongings a little less painful. Yes, it was a result of some disappointing personal experience. Instead of having to search through different media groups or hope someone sees your post, you can report a lost or found item here and let the system look for possible matches. The main part I’m proud of is the matching system. Lost and found posts are compared using things like category, description, location and dates to find possible matches, and users can get notified when one is found. I also added the usual stuff around it like authentication, notifications, resolving recovered cases, an admin dashboard, and as always a light/dark mode. It might seem quite like “Okay now how the hell am i supposed to use it then?” Here’s something important. A quick way to test it: create an account → make a Lost Item post → create another account →create a matching Found Item post with similar details → check the notifications/matches → if it’s the right item, you can resolve the case. (You can also try the flow the other way around by posting a found item first.) The backend is hosted through render and may take a LITTLE time to load but please be patient for a few seconds and the flow’s gonna go as mentioned above", "repo": "https://github.com/Aarjal/The_Bug", "demo": "https://the-bug.vercel.app/"}]...
|
[{"post_id": 80173, "ts": "202 [{"post_id": 80173, "ts": "2026-10-16T15:34:34Z", "hours": 1.5981, "text": "I got idea from some other open source web-app and added a new “Recent activity feature in my admin dashboard”. Here’s also the recent data of what ya’ll have been doing ><"}, {"post_id": 73264, "ts": "2026-09-24T18:16:20Z", "hours": 1.6661, "text": "Rewrote the READMe from sctrach and tuned up the CSS a bit cus they asked ¯ _ (ツ)_/¯"}, {"post_id": 70220, "ts": "2026-09-18T18:51:33Z", "hours": 0.8733, "text": "it seems the css wasnt responding well in feed page after the hosting. took me some time but i’ve fixed the code and it works as expected now :)"}, {"post_id": 68774, "ts": "2026-09-15T18:48:39Z", "hours": 0.4542, "text": "just improved the Readme a bit nothing much nothing more showed for review and now adjusted as per the recommendations. Now the next thing is finally the shipping of project Optimistic to hear your says on this😄😄"}, {"post_id": 68246, "ts": "2026-09-14T19:27:07Z", "hours": 2.3539, "text": "I spent some time cleaning up the frontend code and styles to make the app faster and easier to maintain. Split up bloated pages: Broke down massive files like Item Detail, Recovery Requests, Feed, and Navbar into smaller subcomponents (modals, media previews, contact info, filters). Now editing one UI block won’t risk breaking the whole page. Fixed React state quirks: Switched Feed categories to derive directly with useMemo to skip extra re-renders, fixed initial edit form state, and added cleanup guards on API calls so navigating away doesn’t trigger memory leak warnings. Cleaned up the CSS: Replaced duplicated skeleton loaders and empty-state styles across 5 files with shared rules in index.css. Swapped hardcoded colors and overlays across all stylesheets for theme tokens so dark and light modes behave properly everywhere."}, {"post_id": 67507, "ts": "2026-09-13T17:04:49Z", "hours": 1.1086, "text": "Finally got the main workflow of Lost&Found working! The posting flow and matching system are connected now, so users can actually post lost or found items and the backend can go through the matching logic to find possible matches. I also finished up the remaining bits around resolving cases, notifications, and the other backend connections. I’ve now made the project deployable too. The frontend is hosted on Vercel and the backend is running on Render, and I’ve connected the two so the live app can actually communicate with the backend. There are obviously still things I can improve later, but for now the main workflow is working properly and the project is finally ready to ship."}, {"post_id": 66169, "ts": "2026-09-11T20:27:49Z", "hours": 1.7531, "text": "Been working on connecting the rest of the backend now. I got the resolving part done so when someone gets their item back, they can mark the case as resolved and it gets taken out of the active feed instead of sitting there like it’s still available. I also worked on the privacy policy agreement during signup, making sure that gets properly handled instead of just being a checkbox that does nothing. Apart from that I’ve connected the remaining reports, notifications, matching and user posts so they all actually talk to the backend properly. Most of the main stuff is pretty much done now, just a few small things left to fix and test. After that it should finally be ready to ship. Next devlog is basically going to be getting everything ready for deployment😋"}, {"post_id": 66062, "ts": "2026-09-11T17:05:13Z", "hours": 2.1011, "text": "FINALLLLYY I’ve worked on the matching system. This is what the whole app was all about tbh. The backend compares lost and found posts instead of just showing everything as a possible match. It looks at things like the item category, description/details, location, and dates, so a lost wallet and a found wallet in a completely different place or with an impossible date won’t just get treated the same. I’m also working on the backend logic that calculates these matches and sends the relevant results back to the frontend. A certain kinda post and match is successfully tested and its GREEN > < but there’s still some testing to do with different combinations of posts and I’m not confident about it yet :’("}, {"post_id": 65444, "ts": "2026-09-10T16:08:19Z", "hours": 0.9175, "text": "I’ve started working more on the backend! This time I focused on the lost and found reporting system, making sure the reports actually get sent through the API and saved properly in MongoDB. Each report is linked to the user who created it, along with things like the category, description, location, date, and image info. I also added some validation so the backend doesn’t just accept whatever the frontend sends. There were a few annoying little issues between the form, authentication, API and database, but I’ve got the main flow working now."}, {"post_id": 64928, "ts": "2026-09-09T17:25:26Z", "hours": 1.2067, "text": "This time I worked on adding light and dark mode. Previously the button was just sitting there doing nothing. Now the app can adapt to the user’s system theme instead of forcing them to pick one manually. If someone has their device set to dark mode, Lost&Found can follow that preference, while still giving them the option to switch between light and dark mode themselves. Still doing some small tweaks here and there, but this might be the final goodbye to frontend now"}, {"post_id": 64676, "ts": "2026-09-09T08:28:09Z", "hours": 1.2125, "text": "Today I worked on the admin dashboard. The idea behind it is to give me a simple overview of what’s happening across the platform instead of having to dig through individual reports. It includes stats for total lost reports, found reports, resolved cases, recovery rate, average resolution time, and the most common item categories. It doesn’t look the best but works for now.."}, {"post_id": 64320, "ts": "2026-09-08T16:38:23Z", "hours": 1.1492, "text": "Okay the progress is I made a few changes and improvements across the app to make the main user flow feel more complete. Up untill now was just the frontend part. I’ve also started working on the backend side of things, connecting the frontend features with the actual application logic and getting the necessary API functionality in place. There’s still quite a bit to connect and test, but the project is gradually moving from just having separate features to having everything work together as one proper application."}, {"post_id": 50954, "ts": "2026-08-20T12:54:52Z", "hours": 0.9122, "text": "I spent this session working on more of the Lost&Found frontend. I worked on the news feed, the UI for reporting both lost and found items, and the notifications frontend. One thing I also noticed with Stardance: when I linked my other Hackatime projects (i was working on separate directories for client and server side) to this project, their tracked time got added to the time shown on my previous devlog. My first devlog originally showed around 1 hour, but after linking those projects it changed to 6h . It didn’t work like that previously on Flavortown. Other than that, the frontend is coming together and I’m getting closer to having the main Lost → Match → Notification flow fully connected."}, {"post_id": 41398, "ts": "2026-08-05T16:21:00Z", "hours": 6.0625, "text": "I’m working on a web-app which I’ve named ‘Lost&Found’. As the name suggests, it’s a community help oriented, supportive, efficient and easy to use application which people can hop onto to search for their lost belongings. The idea is to create match between lost items and found items based on their descriptions and filters to finally get a confidence match score of whether the item is actually the one the user is looking for ( basically checking if lost-item = found-item ) For now, the actual countable work i’ve done is created a few icons for the web_app and finalised on one which is followed by same favicon."}]...
|
Title: Lost&Found by @yeagerist | Stardance
D Title: Lost&Found by @yeagerist | Stardance
Devlogs:
I’m working on a web-app which I’ve named ‘Lost&Found’. As the name suggests, it’s a community help oriented, supportive, efficient and easy to use application which people can hop onto to search for their lost belongings. The idea is to create match between lost items and found items based on their descriptions and filters to finally get a confidence match score of whether the item is actually the one the user is looking for ( basically checking if lost-item = found-item ) For now, the actual countable work i’ve done is created a few icons for the web_app and finalised on one which is followed by same favicon.
I spent this session working on more of the Lost&Found frontend. I worked on the news feed, the UI for reporting both lost and found items, and the notifications frontend. One thing I also noticed with Stardance: when I linked my other Hackatime projects (i was working on separate directories for client and server side) to this project, their tracked time got added to the time shown on my previous devlog. My first devlog originally showed around 1 hour, but after linking those projects it changed to 6h . It didn’t work like that previously on Flavortown. Other than that, the frontend is coming together and I’m getting closer to having the main Lost → Match → Notification flow fully connected.
Okay the progress is I made a few changes and improvements across the app to make the main user flow feel more complete. Up untill now was just the frontend part. I’ve also started working on the backend side of things, connecting the frontend features with the actual application logic and getting the necessary API functionality in place. There’s still quite a bit to connect and test, but the project is gradually moving from just having separate features to having everything work together as one proper application.
Today I worked on the admin dashboard. The idea behind it is to give me a simple overview of what’s happening across the platform instead of having to dig through individual reports. It includes stats for total lost reports, found reports, resolved cases, recovery rate, average resolution time, and the most common item categories. It doesn’t look the best but works for now..
This time I worked on adding light and dark mode. Previously the button was just sitting there doing nothing. Now the app can adapt to the user’s system theme instead of forcing them to pick one manually. If someone has their device set to dark mode, Lost&Found can follow that preference, while still giving them the option to switch between light and dark mode themselves. Still doing some small tweaks here and there, but this might be the final goodbye to frontend now
I’ve started working more on the backend! This time I focused on the lost and found reporting system, making sure the reports actually get sent through the API and saved properly in MongoDB. Each report is linked to the user who created it, along with things like the category, description, location, date, and image info. I also added some validation so the backend doesn’t just accept whatever the frontend sends. There were a few annoying little issues between the form, authentication, API and database, but I’ve got the main flow working now.
FINALLLLYY I’ve worked on the matching system. This is what the whole app was all about tbh. The backend compares lost and found posts instead of just showing everything as a possible match. It looks at things like the item category, description/details, location, and dates, so a lost wallet and a found wallet in a completely different place or with an impossible date won’t just get treated the same. I’m also working on the backend logic that calculates these matches and sends the relevant results back to the frontend. A certain kinda post and match is successfully tested and its GREEN > < but there’s still some testing to do with different combinations of posts and I’m not confident about it yet :’(
Been working on connecting the rest of the backend now. I got the resolving part done so when someone gets their item back, they can mark the case as resolved and it gets taken out of the active feed instead of sitting there like it’s still available. I also worked on the privacy policy agreement during signup, making sure that gets properly handled instead of just being a checkbox that does nothing. Apart from that I’ve connected the remaining reports, notifications, matching and user posts so they all actually talk to the backend properly. Most of the main stuff is pretty much done now, just a few small things left to fix and test. After that it should finally be ready to ship. Next devlog is basically going to be getting everything ready for deployment😋
Finally got the main workflow of Lost&Found working! The posting flow and matching system are connected now, so users can actually post lost or found items and the backend can go through the matching logic to find possible matches. I also finished up the remaining bits around resolving cases, notifications, and the other backend connections. I’ve now made the project deployable too. The frontend is hosted on Vercel and the backend is running on Render, and I’ve connected the two so the live app can actually communicate with the backend. There are obviously still things I can improve later, but for now the main workflow is working properly and the project is finally ready to ship.
I spent some time cleaning up the frontend code and styles to make the app faster and easier to maintain. Split up bloated pages: Broke down massive files like Item Detail, Recovery Requests, Feed, and Navbar into smaller subcomponents (modals, media previews, contact info, filters). Now editing one UI block won’t risk breaking the whole page. Fixed React state quirks: Switched Feed categories to derive directly with useMemo to skip extra re-renders, fixed initial edit form state, and added cleanup guards on API calls so navigating away doesn’t trigger memory leak warnings. Cleaned up the CSS: Replaced duplicated skeleton loaders and empty-state styles across 5 files with shared rules in index.css. Swapped hardcoded colors and overlays across all stylesheets for theme tokens so dark and light modes behave properly everywhere.
just improved the Readme a bit nothing much nothing more showed for review and now adjusted as per the recommendations. Now the next thing is finally the shipping of project Optimistic to hear your says on this😄😄
it seems the css wasnt responding well in feed page after the hosting. took me some time but i’ve fixed the code and it works as expected now :)
Rewrote the READMe from sctrach and tuned up the CSS a bit cus they asked ¯ _ (ツ)_/¯
I got idea from some other open source web-app and added a new “Recent activity feature in my admin dashboard”. Here’s also the recent data of what ya’ll have been doing ><
Ships:
I built Lost&Found mainly with the aim to make finding lost belongings a little less painful. Yes, it was a result of some disappointing personal experience. Instead of having to search through different media groups or hope someone sees your post, you can report a lost or found item here and let the system look for possible matches. The main part I’m proud of is the matching system. Lost and found posts are compared using things like category, description, location and dates to find possible matches, and users can get notified when one is found. I also added the usual stuff around it like authentication, notifications, resolving recovered cases, an admin dashboard, and as always a light/dark mode. It might seem quite like “Okay now how the hell am i supposed to use it then?” Here’s something important. A quick way to test it: create an account → make a Lost Item post → create another account →create a matching Found Item post with similar details → check the notifications/matches → if it’s the right item, you can resolve the case. (You can also try the flow the other way around by posting a found item first.) The backend is hosted through render and may take a LITTLE time to load but please be patient for a few seconds and the flow’s gonna go as mentioned above
This is my second ship to my project lost&found with little css tweaks and UI/UX enhancements as per the reviews from first ship. This web app is basically a platform for people to perform actions regarding lost items. (either seek their lost item or post a found item) The basic workflow is : -Sign up with a random acc and post a lost item in feed -Sign up with a diff random acc and post a related found item in feed -The system will create a match between those two items and let you choose wat to do furthur with it. As per last ship reviews, One important suggestion i found was to include a demo video of whole workflow in my README and this time I’ve not missed that out dw. That might help yall a lot in this ship since signing in and our repeatedly is troublesome. Looking forward to hear from you guys. (Suggestions are immensely appreciated😋)
this is a tribute to my lost&found with a dead last ship with small update...
|
1793148633.364817
|
1793235033.364817
|
|
63761
|
Todo WinUI by @vilmer_hagelberg | Stardance
|
vilmer_hagelberg
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T15:42:38Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a todo app for windows built in C# with WinUI3. It is very easy to use, works well and has saves the todos.", "repo": "https://github.com/GamerReaper09/WinUI-Todo", "demo": "https://github.com/GamerReaper09/WinUI-Todo/releases/tag/release"}]...
|
[{"post_id": 80172, "ts": "202 [{"post_id": 80172, "ts": "2026-10-16T15:33:49Z", "hours": 1.9189, "text": "Finally done. I made the repo now i just have to do the first ship."}, {"post_id": 76792, "ts": "2026-10-04T16:08:55Z", "hours": 3.2731, "text": "Essentially working now. The add todo is now working and therefore the app is almost done"}, {"post_id": 74932, "ts": "2026-09-28T16:50:02Z", "hours": 1.91, "text": "An early prototype of the app is now working. So far there is only the task list, remove button, and a placeholder add button."}, {"post_id": 73169, "ts": "2026-09-24T15:03:41Z", "hours": 2.58, "text": "I completed microsofts tutorial on how to make a note app. So i now understand the basics and is ready to start making my own program."}, {"post_id": 70623, "ts": "2026-09-19T14:05:36Z", "hours": 0.5856, "text": "I added my first lines of code in the project 🥳🥳"}]...
|
Title: Todo WinUI by @vilmer_hagelberg | Stardance Title: Todo WinUI by @vilmer_hagelberg | Stardance
Devlogs:
I added my first lines of code in the project 🥳🥳
I completed microsofts tutorial on how to make a note app. So i now understand the basics and is ready to start making my own program.
An early prototype of the app is now working. So far there is only the task list, remove button, and a placeholder add button.
Essentially working now. The add todo is now working and therefore the app is almost done
Finally done. I made the repo now i just have to do the first ship.
Ships:
This is a todo app for windows built in C# with WinUI3. It is very easy to use, works well and has saves the todos....
|
1793155785.5398595
|
1793242185.5398595
|
|
70042
|
My own site! by @gokul2009136 | Stardance
|
gokul2009136
|
0
|
0.65
|
0
|
[]
|
[{"post_id": 80170, "ts": "202 [{"post_id": 80170, "ts": "2026-10-16T15:16:39Z", "hours": 0.65, "text": "i worked in the html and css and i used only the basic code then i created domain using vercel,this is one of the beginner website its look like the beginner website with a good color and fonts it is basically a self intro page like my name my hobby and my skills etc… thats it i think so"}]...
|
Title: My own site! by @gokul2009136 | Stardance
Title: My own site! by @gokul2009136 | Stardance
Devlogs:
i worked in the html and css and i used only the basic code then i created domain using vercel,this is one of the beginner website its look like the beginner website with a good color and fonts it is basically a self intro page like my name my hobby and my skills etc… thats it i think so...
|
1792946967.3746688
|
1793551767.3746688
|
|
69346
|
StudyFlow by @Rocky_3 | Stardance
|
Rocky_3
|
0
|
1.31
|
0
|
[]
|
[{"post_id": 80166, "ts": "202 [{"post_id": 80166, "ts": "2026-10-16T14:46:58Z", "hours": 0.3906, "text": "Bugs de la bibliothèque de cours…"}, {"post_id": 79985, "ts": "2026-10-15T19:07:30Z", "hours": 0.9156, "text": "Nouveau tableau de bord !"}]...
|
Title: StudyFlow by @Rocky_3 | Stardance
Devlogs: Title: StudyFlow by @Rocky_3 | Stardance
Devlogs:
Nouveau tableau de bord !
Bugs de la bibliothèque de cours…...
|
1793130915.1730332
|
1793735715.1730332
|
|
68947
|
swarnabindu by @threatsentinels | Stardance
|
threatsentinels
|
1
|
11.0
|
142
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T15:34:50Z", "hours": 11.0, "multiplier": 13.34, "payout": 142, "blessing": "neutral", "text": "This is a patient and vaccination management system for a government health facility in Nepal. This project taught me a lot about building software beyond just making things work , understanding real-world workflows, handling patient records, and making technology practical for the people who use it. Built with Django and PostgreSQL, with plenty more to learn and improve.", "repo": "https://github.com/threatsentinels/swarnabindu", "demo": "https://ahckhotang.ggsrclub.com/"}]...
|
[{"post_id": 80160, "ts": "202 [{"post_id": 80160, "ts": "2026-10-16T14:02:36Z", "hours": 1.6317, "text": "Devlog no 5 In the last 1 hr 37 mintures i worked on polishing the forms and its grids . I now have fully working self inrollment form . I am so close to finishing it ."}, {"post_id": 79702, "ts": "2026-10-15T03:46:48Z", "hours": 1.2564, "text": "DEVLOG NO 4 , in the last 1 hr i wrote the code for base.html and other templates to be used in the site . I have finally locked into a theme i.e. proper nepali government website theme . I have created a navbar and landing page that displays login form for hospital staff and self registration form for patients and it also displays current nepali date that is derived from AD using my custom code ."}, {"post_id": 79288, "ts": "2026-10-13T10:31:53Z", "hours": 2.3172, "text": "DEVLOG NO 3 : I wrote code for database backup . Since this system is going to be used in critical environment of hospital so it requires timely backups and ready to production data . For backups i have created a system for 2 kinds of backup one is on same drive backup and another is external backup . Project will backup the data in another seperate database and in plain json file too ."}, {"post_id": 78662, "ts": "2026-10-11T06:25:05Z", "hours": 1.2083, "text": "Nepal follows different calender from rest of the world that is BIKRAM SAMBAT (BS.) so currently NEPAL is in year 2083 which is 57 year older than AD . Our servers , databases and all other logical engines work in georgian calender so i wrote a code for conversion of BS TO AD AND AD TO BS for seamless no confusion system for users and admins . I used date time functions and other functions to do this work ."}, {"post_id": 78279, "ts": "2026-10-10T08:20:33Z", "hours": 4.2472, "text": "Swarnabindu is a gold infused ayurvedic medicine given to child below 5 years , it is widely practiced in Nepal . When i visited the hospital with my nephew i saw them writing details and medicine records in notebook so i have decided to make one management software them which will allow the workers to enter the details of the patients , add vaccination dates , manage dosage , create reports and other analytical and official work . In the First Phase i have build the project strucutre , tested it and wrote some basic code ."}]...
|
Title: swarnabindu by @threatsentinels | Stardance Title: swarnabindu by @threatsentinels | Stardance
Devlogs:
Swarnabindu is a gold infused ayurvedic medicine given to child below 5 years , it is widely practiced in Nepal . When i visited the hospital with my nephew i saw them writing details and medicine records in notebook so i have decided to make one management software them which will allow the workers to enter the details of the patients , add vaccination dates , manage dosage , create reports and other analytical and official work . In the First Phase i have build the project strucutre , tested it and wrote some basic code .
Nepal follows different calender from rest of the world that is BIKRAM SAMBAT (BS.) so currently NEPAL is in year 2083 which is 57 year older than AD . Our servers , databases and all other logical engines work in georgian calender so i wrote a code for conversion of BS TO AD AND AD TO BS for seamless no confusion system for users and admins . I used date time functions and other functions to do this work .
DEVLOG NO 3 : I wrote code for database backup . Since this system is going to be used in critical environment of hospital so it requires timely backups and ready to production data . For backups i have created a system for 2 kinds of backup one is on same drive backup and another is external backup . Project will backup the data in another seperate database and in plain json file too .
DEVLOG NO 4 , in the last 1 hr i wrote the code for base.html and other templates to be used in the site . I have finally locked into a theme i.e. proper nepali government website theme . I have created a navbar and landing page that displays login form for hospital staff and self registration form for patients and it also displays current nepali date that is derived from AD using my custom code .
Devlog no 5 In the last 1 hr 37 mintures i worked on polishing the forms and its grids . I now have fully working self inrollment form . I am so close to finishing it .
Ships:
This is a patient and vaccination management system for a government health facility in Nepal. This project taught me a lot about building software beyond just making things work , understanding real-world workflows, handling patient records, and making technology practical for the people who use it. Built with Django and PostgreSQL, with plenty more to learn and improve....
|
1793155880.2119997
|
1793242280.2119997
|
|
68306
|
Locate with Lois by @EshanDoes | Stardance
|
EshanDoes
|
0
|
13.67
|
0
|
[]
|
[{"post_id": 80158, "ts": "202 [{"post_id": 80158, "ts": "2026-10-16T13:40:37Z", "hours": 8.72, "text": "Yes, I know, second devlog is on the start of voting for the jam, likely not gonna get much in terms of storytelling. Either way though, the game was in a finished enough state for submission! Likely not gonna ship it yet though, because I’m gonna be working on a post-jam patch to patch up the rough spots."}, {"post_id": 78201, "ts": "2026-10-09T23:19:13Z", "hours": 4.9511, "text": "A bit late since there’s already under a week left until round 1 is finished, but I’ve been making progress! I finished the dialogue system as can be seen from this video on Tuesday, but I’ve still got a lot to go, especially in terms of assets. Hopefully I can get it done on time!"}]...
|
Title: Locate with Lois by @EshanDoes | Stardance
Title: Locate with Lois by @EshanDoes | Stardance
Devlogs:
A bit late since there’s already under a week left until round 1 is finished, but I’ve been making progress! I finished the dialogue system as can be seen from this video on Tuesday, but I’ve still got a lot to go, especially in terms of assets. Hopefully I can get it done on time!
Yes, I know, second devlog is on the start of voting for the jam, likely not gonna get much in terms of storytelling. Either way though, the game was in a finished enough state for submission! Likely not gonna ship it yet though, because I’m gonna be working on a post-jam patch to patch up the rough spots....
|
1793119941.6207297
|
1793724741.6207297
|
|
61791
|
Slack Bot Ichi by @rigid_valmeo | Stardance
|
rigid_valmeo
|
1
|
4.48
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T12:39:10Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created “Ichi Slack Bot,” an animal-themed Slack bot created as part of the NASA Stardance Challenge. This is my first coding project outside of school. I created it while learning the basics of JavaScript, APIs, Slack bot development, and programming through Stardance. The bot is designed around my interest in animals and chemistry. It provides information about cats and dogs, including animal-related chemistry, breeds, foods that dogs should avoid, and feeding reminders. I had fun while doing this, although I was quite puzzled about how to use GitHub at first!", "repo": "https://github.com/rigidvalmeo03/ichi-slack-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 80157, "ts": "202 [{"post_id": 80157, "ts": "2026-10-16T13:27:37Z", "hours": 0.4847, "text": "YIPPIEEE after so long I finally made it work!! The feeder reminder actually reminds!"}, {"post_id": 68619, "ts": "2026-09-15T12:29:57Z", "hours": 3.6483, "text": "Slack bot to know more about your pets!:3"}]...
|
Title: Slack Bot Ichi by @rigid_valmeo | Stardance Title: Slack Bot Ichi by @rigid_valmeo | Stardance
Devlogs:
Slack bot to know more about your pets!:3
YIPPIEEE after so long I finally made it work!! The feeder reminder actually reminds!
Ships:
I created “Ichi Slack Bot,” an animal-themed Slack bot created as part of the NASA Stardance Challenge. This is my first coding project outside of school. I created it while learning the basics of JavaScript, APIs, Slack bot development, and programming through Stardance. The bot is designed around my interest in animals and chemistry. It provides information about cats and dogs, including animal-related chemistry, breeds, foods that dogs should avoid, and feeding reminders. I had fun while doing this, although I was quite puzzled about how to use GitHub at first!...
|
1792813879.7822878
|
1793677879.7822878
|
|
65551
|
Profile by @iku_dev | Stardance
|
iku_dev
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T15:42:01Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my own personal site I joined the preanal site challenge and I think I made a got project for my first time. I am really proud of the animations and the general design as when I was making this I had no plan!! I got stuck a lot in this creation, not only knowledge issue but technical as well I did not know the difference between “id” and “class” so when I was labeling it as id I was calling it in CSS as a class so nothing was happening. :( my computer was crushing a lot I was writing 2 animations on one element hence sometimes the would not play I even once forgot to connect the html to CSS -honestly a lot happened and it will get to long to list them To use this web u can either use the online website or run it locally by downloading the files from GitHub and opening the index file !!!This was a really fun experience and I pushed to do as many projects before it closes!!!!", "repo": "https://github.com/ikumedev/MY-PROFILE-hackclub-", "demo": "https://ikumedev.github.io/MY-PROFILE-hackclub-/"}]...
|
[{"post_id": 80155, "ts": "202 [{"post_id": 80155, "ts": "2026-10-16T13:05:04Z", "hours": 3.1633, "text": "I KNOW 3 HOURS IS MAD!!! Okay today is my last day of my website development.:) what i did to day? firstly i made more visually pleasant and fixed a lot of bugs. i add a lot of animations to make it more responsive and overall better. i got help to make the adaptive part of my program but apart from that it was fun!!! i hope you like it as much as i did making it"}, {"post_id": 77414, "ts": "2026-10-06T21:29:16Z", "hours": 2.2919, "text": "As for today!! I cleaned up my website and removed some “over the top effects”:). I stool some sticker’s from hackclub website and animated everything.I add 4 more pages and decorated them All almost done!!!!"}, {"post_id": 76862, "ts": "2026-10-04T21:21:21Z", "hours": 2.9114, "text": "I spent today make making my web look better. But low-key spent most of my time learning css and HTML through vids. :)"}, {"post_id": 73839, "ts": "2026-09-26T04:27:14Z", "hours": 0.6089, "text": "Today I made ! plain html code. First of all am, making my own personal profile-page. So I made the basics parts, sections and random info about my self."}]...
|
Title: Profile by @iku_dev | Stardance
Devlogs:
T Title: Profile by @iku_dev | Stardance
Devlogs:
Today I made ! plain html code. First of all am, making my own personal profile-page. So I made the basics parts, sections and random info about my self.
I spent today make making my web look better. But low-key spent most of my time learning css and HTML through vids. :)
As for today!! I cleaned up my website and removed some “over the top effects”:). I stool some sticker’s from hackclub website and animated everything.I add 4 more pages and decorated them All almost done!!!!
I KNOW 3 HOURS IS MAD!!! Okay today is my last day of my website development.:) what i did to day? firstly i made more visually pleasant and fixed a lot of bugs. i add a lot of animations to make it more responsive and overall better. i got help to make the adaptive part of my program but apart from that it was fun!!! i hope you like it as much as i did making it
Ships:
I made my own personal site I joined the preanal site challenge and I think I made a got project for my first time. I am really proud of the animations and the general design as when I was making this I had no plan!! I got stuck a lot in this creation, not only knowledge issue but technical as well I did not know the difference between “id” and “class” so when I was labeling it as id I was calling it in CSS as a class so nothing was happening. :( my computer was crushing a lot I was writing 2 animations on one element hence sometimes the would not play I even once forgot to connect the html to CSS -honestly a lot happened and it will get to long to list them To use this web u can either use the online website or run it locally by downloading the files from GitHub and opening the index file !!!This was a really fun experience and I pushed to do as many projects before it closes!!!!...
|
1793155803.259789
|
1793242203.259789
|
|
48156
|
AI3DSTUDIO by @Madhanraj | Stardance
|
Madhanraj
|
1
|
43.81
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T11:59:39Z", "hours": 33.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I am shipping Stardance in its current state because my available development time has been limited by my Class 12 studies and school schedule. Although the complete vision for AI3D Studio is much larger and several features are still under development, I wanted to submit the working progress I have achieved rather than leave the project unshipped. The current version represents a major milestone of the project, with a functional 3D environment, AI interaction, computer-vision-based interaction, and database integration already implemented. I plan to continue developing the remaining features after shipping. This is not the final version of AI3D Studio — it is the first major milestone toward the complete system I originally envisioned.", "repo": "https://github.com/maddy9002/AI3DSTUDIO", "demo": "https://ai-3-dstudio-beta.vercel.app/"}]...
|
[{"post_id": 80154, "ts": "202 [{"post_id": 80154, "ts": "2026-10-16T13:02:11Z", "hours": 2.0864, "text": "Worked on the new ui for the html file, implementing necessary features for cad operations"}, {"post_id": 78229, "ts": "2026-10-10T01:32:38Z", "hours": 3.5311, "text": "Worked on AI3DSTUDIO’s advanced modeling capabilities, implementing Merge/Weld Vertices, Vertex Dissolve, Edge Dissolve, and Face Dissolve, including topology updates and Undo/Redo support.I also created requirements.txt and README.md, resolved Python dependency conflicts involving MediaPipe, NumPy, and OpenCV, verified the application launches successfully, and pushed the changes to the advanced-modeling branch on GitHub.Next, I’ll test the installation process in a fresh environment to make AI3DSTUDIO easier for others to try."}, {"post_id": 76640, "ts": "2026-10-04T07:39:58Z", "hours": 2.7172, "text": "After implementing Inset, AI3DSTUDIO’S mesh-editing system was expanded with several advanced modeling features, including Loop Cut, Bevel, Merge/Weld Vertices, Vertex Dissolve, Edge Dissolve, Face Dissolve, and Bridge Edge Loops. The editing workflow was also improved with Vertex, Edge, and Face selection and manipulation, along with Undo/Redo support for mesh-editing operations, significantly improving AI3DSTUDIO’S overall polygon-modeling capabilities."}, {"post_id": 74257, "ts": "2026-09-27T02:43:36Z", "hours": 2.4761, "text": "While upgrading the UI the features that I made had disappeared and now I worked to create a html file where i can link it to Stardance."}, {"post_id": 71170, "ts": "2026-09-20T11:58:49Z", "hours": 0.8817, "text": "Worked to improve the UI"}, {"post_id": 70963, "ts": "2026-09-20T03:52:57Z", "hours": 2.2081, "text": "Implemented and stabilized hand-based viewport interaction. The system now supports a screen-space hand cursor controlled by the index finger, pinch-based selection of vertices, edges, and faces, and two-hand gesture editing. Vertex movement is working, while edge and face movement are being integrated by transforming their underlying mesh vertices. Object Mode gestures for movement, rotation, and scaling remain functional. The next focus is completing reliable hand-based edge/face manipulation and improving pinch-based selection accuracy."}, {"post_id": 68678, "ts": "2026-09-15T15:07:33Z", "hours": 2.2633, "text": "Completed till multi-face selection"}, {"post_id": 64857, "ts": "2026-09-09T15:32:34Z", "hours": 5.7969, "text": "Completed the undo redo system for all the edit options."}, {"post_id": 47430, "ts": "2026-08-15T11:13:47Z", "hours": 22.1772, "text": "WORKING TO UPGRADE THE 3D DESIGNING SOFTWARE"}]...
|
Title: AI3DSTUDIO by @Madhanraj | Stardance
Devlo Title: AI3DSTUDIO by @Madhanraj | Stardance
Devlogs:
WORKING TO UPGRADE THE 3D DESIGNING SOFTWARE
Completed the undo redo system for all the edit options.
Completed till multi-face selection
Implemented and stabilized hand-based viewport interaction. The system now supports a screen-space hand cursor controlled by the index finger, pinch-based selection of vertices, edges, and faces, and two-hand gesture editing. Vertex movement is working, while edge and face movement are being integrated by transforming their underlying mesh vertices. Object Mode gestures for movement, rotation, and scaling remain functional. The next focus is completing reliable hand-based edge/face manipulation and improving pinch-based selection accuracy.
Worked to improve the UI
While upgrading the UI the features that I made had disappeared and now I worked to create a html file where i can link it to Stardance.
After implementing Inset, AI3DSTUDIO’S mesh-editing system was expanded with several advanced modeling features, including Loop Cut, Bevel, Merge/Weld Vertices, Vertex Dissolve, Edge Dissolve, Face Dissolve, and Bridge Edge Loops. The editing workflow was also improved with Vertex, Edge, and Face selection and manipulation, along with Undo/Redo support for mesh-editing operations, significantly improving AI3DSTUDIO’S overall polygon-modeling capabilities.
Worked on AI3DSTUDIO’s advanced modeling capabilities, implementing Merge/Weld Vertices, Vertex Dissolve, Edge Dissolve, and Face Dissolve, including topology updates and Undo/Redo support.I also created requirements.txt and README.md, resolved Python dependency conflicts involving MediaPipe, NumPy, and OpenCV, verified the application launches successfully, and pushed the changes to the advanced-modeling branch on GitHub.Next, I’ll test the installation process in a fresh environment to make AI3DSTUDIO easier for others to try.
Worked on the new ui for the html file, implementing necessary features for cad operations
Ships:
I am shipping Stardance in its current state because my available development time has been limited by my Class 12 studies and school schedule. Although the complete vision for AI3D Studio is much larger and several features are still under development, I wanted to submit the working progress I have achieved rather than leave the project unshipped. The current version represents a major milestone of the project, with a functional 3D environment, AI interaction, computer-vision-based interaction, and database integration already implemented. I plan to continue developing the remaining features after shipping. This is not the final version of AI3D Studio — it is the first major milestone toward the complete system I originally envisioned....
|
1793148468.8246431
|
1793234868.8246431
|
|
29376
|
Flipper Echo by @GreatJoel | Stardance
|
GreatJoel
|
0
|
83.46
|
0
|
[]
|
[{"post_id": 80153, "ts": "202 [{"post_id": 80153, "ts": "2026-10-16T13:01:46Z", "hours": 5.4058, "text": "i worked on the ui and setuped the wifi AP and STA. also added a password feature so it can connect easily and its own. other side i annded the scan so it can scan live all the wifi around it."}, {"post_id": 76143, "ts": "2026-10-02T14:17:37Z", "hours": 19.2397, "text": "right now i ahve worked for like the ui stuff. and from here i had added few more updates to the device hardware.. like vibrations when button click an indication led also added a tansisitor for the led display so its led bakclight can be controlled using the gpio in the supermini. here i also added a update over the wifi.. since it doesnt have any keyboard. i added a qr scanner which can scan to any wifi network and connect its own.. it can save the network and use when ever it avalable."}, {"post_id": 71595, "ts": "2026-09-21T03:51:21Z", "hours": 58.8139, "text": "now i have added teo esp board one for the streaming and one for displaying it in the display beacuse the esp32 cam wont able to get sdcard and tft streaming at same time it doesnt gpios the one i am useing here is esp32 devboard and esp32cam,, ESP32 cam captures the live video frame fromthe OV3660 camera sensor at 160x128 (tft resolution) with JPEG auality 18 fragments, each frame is 244byte with espnow packerts and transmit them to esp32 dev bored. the esp32 borad reassembles the packets to compelete JEPG frame it decodes using TJpgDec into 160x128, rigthn now i have only working in the firmware i have made my own firmware it works but have some issue since it suing wifi to transmit th packet to i tried ot make the use softAP to connect esp each so less packets will lose, when the fps drops or packers fails to reach i will ahve to adjuest the STREAM_QUAITY also the cmaera supports the Mirror effect making it much more alive. i have made a prototype"}]...
|
Title: Flipper Echo by @GreatJoel | Stardance
Dev Title: Flipper Echo by @GreatJoel | Stardance
Devlogs:
now i have added teo esp board one for the streaming and one for displaying it in the display beacuse the esp32 cam wont able to get sdcard and tft streaming at same time it doesnt gpios the one i am useing here is esp32 devboard and esp32cam,, ESP32 cam captures the live video frame fromthe OV3660 camera sensor at 160x128 (tft resolution) with JPEG auality 18 fragments, each frame is 244byte with espnow packerts and transmit them to esp32 dev bored. the esp32 borad reassembles the packets to compelete JEPG frame it decodes using TJpgDec into 160x128, rigthn now i have only working in the firmware i have made my own firmware it works but have some issue since it suing wifi to transmit th packet to i tried ot make the use softAP to connect esp each so less packets will lose, when the fps drops or packers fails to reach i will ahve to adjuest the STREAM_QUAITY also the cmaera supports the Mirror effect making it much more alive. i have made a prototype
right now i ahve worked for like the ui stuff. and from here i had added few more updates to the device hardware.. like vibrations when button click an indication led also added a tansisitor for the led display so its led bakclight can be controlled using the gpio in the supermini. here i also added a update over the wifi.. since it doesnt have any keyboard. i added a qr scanner which can scan to any wifi network and connect its own.. it can save the network and use when ever it avalable.
i worked on the ui and setuped the wifi AP and STA. also added a password feature so it can connect easily and its own. other side i annded the scan so it can scan live all the wifi around it....
|
1792684067.1951468
|
1793288867.1951468
|
|
17907
|
Image to ASCII convertor by @Nandan | Stardance
|
Nandan
|
0
|
0.9
|
0
|
[]
|
[{"post_id": 8015, "ts": "2026 [{"post_id": 8015, "ts": "2026-06-13T11:37:40Z", "hours": 0.8989, "text": "The program takes a live webcam feed and converts into ASCII characters. Made using Python"}]...
|
Title: Image to ASCII convertor by @Nandan | Stard Title: Image to ASCII convertor by @Nandan | Stardance
Devlogs:
The program takes a live webcam feed and converts into ASCII characters. Made using Python...
|
1793177409.1622076
|
1793782209.1622076
|
|
38966
|
HydroLarm by @DCoder | Stardance
|
DCoder
|
0
|
1.22
|
0
|
[]
|
[{"post_id": 80149, "ts": "202 [{"post_id": 80149, "ts": "2026-10-16T12:36:11Z", "hours": 0.5053, "text": "PCB Today, I focuesed on making the PCB, where I had to search for almost 30 minutes for a valid footprint library for my ESP32. Once I found it, the rest was pretty fun. I wired everything together, added the 3d Model, and was pretty proud of myself!"}, {"post_id": 80015, "ts": "2026-10-15T23:58:50Z", "hours": 0.2689, "text": "HydroLarm Schematics Hello everyone! Today, I focused on creating the schematics for HydroLarm. I added an Esp32 C3 Supermini, a buzzer, a switch, and the hx711 module. This was my second time working on KiCad, and I really enjoyed connecting all the wires together. DevLog tommorow! (i hope)"}, {"post_id": 79673, "ts": "2026-10-15T01:04:35Z", "hours": 0.4483, "text": "HydroLarm This was my first DevLog, and I must say, it was great! I started off by building the base of HydroLarm, using 120 MM as my diameter because im going to 3d print this, and I don’t have a gigantic printer 😭. Anyways, I searched up shematics for the Arduino NANO EVERY, which I’ll be using for the project, as it’s compact. I then proceeded by building the walls, leaving a 8mm USB Gap for the USB thingy. I also embossed ‘HydroLarm’ on the front for extra style 😏. And, yep! That’s it! Thanks for reading! New DevLog tommorow (i hope)"}]...
|
Title: HydroLarm by @DCoder | Stardance
Devlogs:
Title: HydroLarm by @DCoder | Stardance
Devlogs:
HydroLarm This was my first DevLog, and I must say, it was great! I started off by building the base of HydroLarm, using 120 MM as my diameter because im going to 3d print this, and I don’t have a gigantic printer 😭. Anyways, I searched up shematics for the Arduino NANO EVERY, which I’ll be using for the project, as it’s compact. I then proceeded by building the walls, leaving a 8mm USB Gap for the USB thingy. I also embossed ‘HydroLarm’ on the front for extra style 😏. And, yep! That’s it! Thanks for reading! New DevLog tommorow (i hope)
HydroLarm Schematics Hello everyone! Today, I focused on creating the schematics for HydroLarm. I added an Esp32 C3 Supermini, a buzzer, a switch, and the hx711 module. This was my second time working on KiCad, and I really enjoyed connecting all the wires together. DevLog tommorow! (i hope)
PCB Today, I focuesed on making the PCB, where I had to search for almost 30 minutes for a valid footprint library for my ESP32. Once I found it, the rest was pretty fun. I wired everything together, added the 3d Model, and was pretty proud of myself!...
|
1792806745.1628304
|
1793411545.1628304
|
|
69537
|
automatic humidifier by @mr_kn5196 | Stardance
|
mr_kn5196
|
0
|
2.39
|
0
|
[]
|
[{"post_id": 80148, "ts": "202 [{"post_id": 80148, "ts": "2026-10-16T12:36:10Z", "hours": 0.5667, "text": "PCB IS DONE!! YAYYYY now i need to make the Case for it and work on the firmware"}, {"post_id": 79838, "ts": "2026-10-15T16:18:36Z", "hours": 0.2833, "text": "added the footprint"}, {"post_id": 79821, "ts": "2026-10-15T15:19:26Z", "hours": 1.5375, "text": "Schematic done for the automatic humdifier Plan for it 3 servo to open a door to let the steam come out , 1 for each ear and 1 on top of the head the 3D model will be Anger from Inide Out movie Display to display its emotions and eyes A bettery level checker to see the battery level on phone and to get reminder to charge it when its low TP4056 to charge the battery A water level float to check and notify you when water level is low A humidity sensor to sense when the humidity is low Red color LED to display anger feel when water vapour comes out"}]...
|
Title: automatic humidifier by @mr_kn5196 | Starda Title: automatic humidifier by @mr_kn5196 | Stardance
Devlogs:
Schematic done for the automatic humdifier Plan for it 3 servo to open a door to let the steam come out , 1 for each ear and 1 on top of the head the 3D model will be Anger from Inide Out movie Display to display its emotions and eyes A bettery level checker to see the battery level on phone and to get reminder to charge it when its low TP4056 to charge the battery A water level float to check and notify you when water level is low A humidity sensor to sense when the humidity is low Red color LED to display anger feel when water vapour comes out
added the footprint
PCB IS DONE!! YAYYYY now i need to make the Case for it and work on the firmware...
|
1792857093.579323
|
1793461893.579323
|
|
69546
|
Esp32-Jammer by @Siyam | Stardance
|
Siyam
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T12:38:12Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have built a noise generator who generates noise in 2.4ghz and jam it. It uses 16000000hz noise to jam, and it has 2x nrf for Vspi and Hspi jamming. it jams all channels needed for Wifi and Bluetooth. I just made it for ethical purpose and only use in my devices, I will never use it with anyone else without permission, i know that its illegal. #Used components, (Main) 2x Nrf24l01 1x 0.96” oled 1x Esp32 c3 zero #Used components (Extra) 1x Capacitor 1x Breadboard and some jumpers", "repo": "https://github.com/Tanzil-Alam/2.4Ghz-Noise-Generator", "demo": ""}]...
|
[{"post_id": 80147, "ts": "202 [{"post_id": 80147, "ts": "2026-10-16T12:19:31Z", "hours": 1.7203, "text": "Finalized the project. added comments in code, fixed all errors in code, tested the feature. And also added another Nrf Module."}, {"post_id": 80126, "ts": "2026-10-16T09:32:30Z", "hours": 0.9658, "text": "I have connected another nrf, but unfortunately, all of the wires got mixed and some of them got short-circuit. i have to fix everything again………."}, {"post_id": 79847, "ts": "2026-10-15T16:34:58Z", "hours": 2.3731, "text": "I have uploaded the code and connected the hardware. I have used Esp32 c3 zero 0.96 inch i2c oled Nrf24l01 radio The jamming is working well, My wifi and Bluetooth is getting noised. But i just made it for ethical use, i will never test on anyone else."}]...
|
Title: Esp32-Jammer by @Siyam | Stardance
Devlogs Title: Esp32-Jammer by @Siyam | Stardance
Devlogs:
I have uploaded the code and connected the hardware. I have used Esp32 c3 zero 0.96 inch i2c oled Nrf24l01 radio The jamming is working well, My wifi and Bluetooth is getting noised. But i just made it for ethical use, i will never test on anyone else.
I have connected another nrf, but unfortunately, all of the wires got mixed and some of them got short-circuit. i have to fix everything again……….
Finalized the project. added comments in code, fixed all errors in code, tested the feature. And also added another Nrf Module.
Ships:
I have built a noise generator who generates noise in 2.4ghz and jam it. It uses 16000000hz noise to jam, and it has 2x nrf for Vspi and Hspi jamming. it jams all channels needed for Wifi and Bluetooth. I just made it for ethical purpose and only use in my devices, I will never use it with anyone else without permission, i know that its illegal. #Used components, (Main) 2x Nrf24l01 1x 0.96” oled 1x Esp32 c3 zero #Used components (Extra) 1x Capacitor 1x Breadboard and some jumpers...
|
1793155777.9099233
|
1793242177.9099233
|
|
24969
|
Taikyoku Shogi by @Harry_wct | Stardance
|
Harry_wct
|
0
|
46.52
|
0
|
[]
|
[{"post_id": 80146, "ts": "202 [{"post_id": 80146, "ts": "2026-10-16T12:15:24Z", "hours": 4.4033, "text": "Made the UI not horrible! I’ve spent some time reading design courses. I should make the boxes a bit taller, but in general I feel like this is at the very least much better than the disorganized slop before."}, {"post_id": 78756, "ts": "2026-10-11T14:44:18Z", "hours": 4.8028, "text": "I finally got my ass to write the stupid code to let you actually play against the model on the website! Now you can get your ass beat to this random model that still kinda doesn’t know how to checkmate but besides!"}, {"post_id": 77764, "ts": "2026-10-08T06:16:29Z", "hours": 4.5239, "text": "making some very very basic visual improvements to my site. I am NOT A SITE DESIGN EXPERT please do not murder me. If you have any ideas please leave in comments. In terms of the bot, struggling as usual. Did some more speedups with the help of Claude though. Hopefully next update I’ll be able to chuck it into the board to play with."}, {"post_id": 73180, "ts": "2026-09-24T15:16:11Z", "hours": 4.1522, "text": "A whole lot of nothingness… Right now the work is mostly trying to debug whatever the heck is wrong with the bot that is learning this game. Other than that though, some actual quality-of-life features (like this ingame display) is being coded. Holidays upcoming, so with stardance extended I can actually spend a bunch of time working on this!"}, {"post_id": 66968, "ts": "2026-09-12T23:17:32Z", "hours": 8.33, "text": "There’s not that much visible stuff, but I’ve spent absolutely monumental amounts of time trying to get the engine working. Thank you marimo for allowing me to use free cloud GPUs lol Either way, I’ve somewhat procrastinated on actually getting the more Quality-of-Life aspects of the board viewer to work. In the next release I probably will include a move-sample viewer, a “pieces in danger” viewer, and a promotions list for the convenience of the end user."}, {"post_id": 60835, "ts": "2026-09-03T13:44:03Z", "hours": 5.7703, "text": "The board is complete now, and unfortunately I have to resort to using claude code to write optimized C code so that the base corpus of move generation doesn’t take literally 90 years to do. (ALL of the green “U” is claude-generated)"}, {"post_id": 56636, "ts": "2026-08-28T13:59:18Z", "hours": 11.7144, "text": "More pieces! God it’s been so long since I uploaded one of these."}, {"post_id": 14787, "ts": "2026-06-24T00:54:13Z", "hours": 2.8278, "text": "still stuck in board creation hell…"}]...
|
Title: Taikyoku Shogi by @Harry_wct | Stardance
D Title: Taikyoku Shogi by @Harry_wct | Stardance
Devlogs:
still stuck in board creation hell…
More pieces! God it’s been so long since I uploaded one of these.
The board is complete now, and unfortunately I have to resort to using claude code to write optimized C code so that the base corpus of move generation doesn’t take literally 90 years to do. (ALL of the green “U” is claude-generated)
There’s not that much visible stuff, but I’ve spent absolutely monumental amounts of time trying to get the engine working. Thank you marimo for allowing me to use free cloud GPUs lol Either way, I’ve somewhat procrastinated on actually getting the more Quality-of-Life aspects of the board viewer to work. In the next release I probably will include a move-sample viewer, a “pieces in danger” viewer, and a promotions list for the convenience of the end user.
A whole lot of nothingness… Right now the work is mostly trying to debug whatever the heck is wrong with the bot that is learning this game. Other than that though, some actual quality-of-life features (like this ingame display) is being coded. Holidays upcoming, so with stardance extended I can actually spend a bunch of time working on this!
making some very very basic visual improvements to my site. I am NOT A SITE DESIGN EXPERT please do not murder me. If you have any ideas please leave in comments. In terms of the bot, struggling as usual. Did some more speedups with the help of Claude though. Hopefully next update I’ll be able to chuck it into the board to play with.
I finally got my ass to write the stupid code to let you actually play against the model on the website! Now you can get your ass beat to this random model that still kinda doesn’t know how to checkmate but besides!
Made the UI not horrible! I’ve spent some time reading design courses. I should make the boxes a bit taller, but in general I feel like this is at the very least much better than the disorganized slop before....
|
1792579775.6198254
|
1793184575.6198254
|
|
69613
|
My web os by @rishith12 | Stardance
|
rishith12
|
2
|
6.0
|
2
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T11:45:11Z", "hours": 1.0, "multiplier": 1.52, "payout": 2, "blessing": "neutral", "text": "I added and extended its features further by adding a fully functional Todo App, Notepad, and a fully functional countdown timer .", "repo": "https://github.com/Rishith88/My_web_OS/", "demo": "https://rishith88.github.io/My_web_OS/"}, {"ship_num": 2, "ts": "2026-10-15T12:34:19Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is the final product, finally done after a lot of hardwork this is a my own web os with a cool cyberpunk there and also teh date and time (IS- Indian Standard Time) with a calculater ,Calendar and a stop watch. The stop watch was teh most difficualt part so i had to refere many youtube tutorials to understand hwo it works but calendar and teh calculater were relatively easy and also the IST time one i had to do some ggogling liek visit otehr wbesite and see how it wokred good leanring for me .It also has a good pop up screen taht vanishes.", "repo": "https://github.com/Rishith88/My_web_OS/", "demo": "https://rishith88.github.io/My_web_OS/"}]...
|
[{"post_id": 80142, "ts": "202 [{"post_id": 80142, "ts": "2026-10-16T11:43:46Z", "hours": 1.2842, "text": "Finally done with my todo app, note pad and the new timer app."}, {"post_id": 79788, "ts": "2026-10-15T12:31:31Z", "hours": 0.6722, "text": "This is the final product guys finally done after a lot of hardwork this is a my own web os with a cool cyberpunk there and also teh date and time (IS- Indian Standard Time) with a calculater ,Calendar and a stop watch"}, {"post_id": 79764, "ts": "2026-10-15T09:35:24Z", "hours": 1.7678, "text": "Stopwatch and a screen timer added broskis less gooooooooo"}, {"post_id": 79618, "ts": "2026-10-14T18:47:30Z", "hours": 1.2136, "text": "Done with my first app guys"}, {"post_id": 79485, "ts": "2026-10-14T08:01:59Z", "hours": 1.0, "text": "My first layout guys less gooooo"}]...
|
Title: My web os by @rishith12 | Stardance
Devlog Title: My web os by @rishith12 | Stardance
Devlogs:
My first layout guys less gooooo
Done with my first app guys
Stopwatch and a screen timer added broskis less gooooooooo
This is the final product guys finally done after a lot of hardwork this is a my own web os with a cool cyberpunk there and also teh date and time (IS- Indian Standard Time) with a calculater ,Calendar and a stop watch
Finally done with my todo app, note pad and the new timer app.
Ships:
This is the final product, finally done after a lot of hardwork this is a my own web os with a cool cyberpunk there and also teh date and time (IS- Indian Standard Time) with a calculater ,Calendar and a stop watch. The stop watch was teh most difficualt part so i had to refere many youtube tutorials to understand hwo it works but calendar and teh calculater were relatively easy and also the IST time one i had to do some ggogling liek visit otehr wbesite and see how it wokred good leanring for me .It also has a good pop up screen taht vanishes.
I added and extended its features further by adding a fully functional Todo App, Notepad, and a fully functional countdown timer ....
|
1793155918.5798566
|
1793242318.5798566
|
|
69880
|
Buhtig by @evanxdsouza | Stardance
|
evanxdsouza
|
0
|
0.85
|
0
|
[]
|
[{"post_id": 80141, "ts": "202 [{"post_id": 80141, "ts": "2026-10-16T11:31:07Z", "hours": 0.8467, "text": "Buhtig, my first Rails project So basically, I have been wanting to learn Rails for a while, and I decided to start by coding a GitHub clone. so I first had Claude created a step by step for me on the concepts for this and then looked through Google and docs to find how to do each step. I started by implementing users. When I normalized emails, I put it in the wrong file so it took me some time to figure that out and then there were a few problems with singular plural with validates and exclusion. But I finally managed to get user creation up"}]...
|
Title: Buhtig by @evanxdsouza | Stardance
Devlogs Title: Buhtig by @evanxdsouza | Stardance
Devlogs:
Buhtig, my first Rails project So basically, I have been wanting to learn Rails for a while, and I decided to start by coding a GitHub clone. so I first had Claude created a step by step for me on the concepts for this and then looked through Google and docs to find how to do each step. I started by implementing users. When I normalized emails, I put it in the wrong file so it took me some time to figure that out and then there were a few problems with singular plural with validates and exclusion. But I finally managed to get user creation up...
|
1792918132.1490412
|
1793522932.1490412
|
|
57208
|
the thing by @rizz | Stardance
|
rizz
|
1
|
11.93
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-14T14:05:06Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What I Made I made Toolbox , a small website where people can find useful everyday tools in one place. It includes a focus timer, task list, notes, password generator, unit converter, customs calculator, color picker, calculator, random picker, and habit tracker. I also added a hand drawn style, pastel colours, dark mode, local saving, breadcrumbs, loading animations, keyboard support, and an interactive 3D background with floating shapes and particle effects. What Was Challenging The hardest part was making the website look interesting without making it difficult to use. I tried several different styles before finding the current hand drawn and colourful look. Adding the 3D background was also challenging because it needed to feel alive while keeping the text and tools easy to see. Another difficult part was making all the tools work properly inside the same modal system. Each tool needed its own controls, buttons, results, reset behavior, and error handling. The breadcrumb navigation and deep links were also challenging. I wanted users to be able to open a specific tool directly and still use the browser back button normally. Dark mode took more work than expected too. Changing only the background colour looked bad, so I had to adjust the cards, text, borders, shadows, forms, and 3D background separately. What I Am Proud Of I am proud that Toolbox is not just a design mockup. The tools actually work. You can add tasks, write notes, generate passwords, convert values, calculate numbers, choose random options, and track habits. Notes, tasks, habits, and theme settings can also be saved in the browser. I am especially proud of the 3D background because I built it with a canvas instead of relying on a large 3D library. It reacts to the mouse, moves objects through depth, and creates particles when the page is clicked. I am also proud of the small accessibility details. The cards, icons, and arrows can be opened with the keyboard. Modals can be closed with Escape, and the site has reduced motion support. What People Should Know Before Testing The project currently works without an account or backend. Tasks, notes, habits, and theme settings are saved only in the browser being used. If browser storage is cleared, that information will disappear. The data will not automatically appear on another device. Authentication and cloud sync are planned but are not active yet. The customs calculator is only a rough estimate using simple example rates. It should not be used as official tax or customs advice. To test the project, try these things: Open a tool card. Click the icon on a card. Click the arrow on a card. Open a card with Enter or Space. Close a modal with Escape. Try the “See the tools” button. Switch between light mode and dark mode. Add and complete a task. Write a note, reload the page, and check if it stayed saved. Mark a few days in the habit tracker. Open a calculator directly with ?tool=calculator . Open a tool and use the browser back button. Move the mouse around the 3D background. Click the page and watch the particle effect. For the best test, run the project with a local server: python3 -m http.server 8000", "repo": "https://github.com/STEVEALEX-source/bleh", "demo": "https://stevealex-source.github.io/bleh/"}]...
|
[{"post_id": 80124, "ts": "202 [{"post_id": 80124, "ts": "2026-10-16T09:25:02Z", "hours": 2.6553, "text": "added new stuff and made it into a proper webos with all the features"}, {"post_id": 70060, "ts": "2026-09-18T11:25:41Z", "hours": 1.2719, "text": "changed the UI cuz it got flagged as AI even tho i didn’t use Ai"}, {"post_id": 68063, "ts": "2026-09-14T13:38:02Z", "hours": 3.0397, "text": "Devlog 08 — Current state and the next backend stepToolbox now combines a pastel hand-drawn interface, ten working browser tools, skeleton loading states, breadcrumb navigation, deep links, local persistence, and an interactive 3D canvas background.The current app works as a static frontend. Tasks, notes, habits, and theme preferences stay in browser storage. No account is required for the existing version.Supabase was selected as the planned backend for the next stage. The intended implementation is email authentication, user-owned records, row-level security, cloud sync, offline fallback, and migration from local storage after sign-in.That backend work has not been faked or partially hidden in the frontend. It still needs a Supabase project URL, public anon key, database schema, and security policies before it can be connected safely.The current deployable project contains index.html, style.css, script.js, and 404.html. The frontend can be deployed now, while authentication and synchronization remain the next planned milestone."}, {"post_id": 65759, "ts": "2026-09-11T03:25:29Z", "hours": 2.2308, "text": "so aghh i have rewrote the code and added some more options but i accidentally deleted my Os cuz i tried to play val by dual booting ahem…i lost all my files."}, {"post_id": 62934, "ts": "2026-09-06T14:09:01Z", "hours": 0.2836, "text": "Devlog 06 — Breadcrumbs, deep links, and history The site now has an actual navigation state instead of relying only on scrolling. A breadcrumb row shows the current location and a live status message. It changes between Home, Tools, and About as the user moves through the page. Hovering over a tool card reports the tool name in the status area. Opening a tool updates the URL with a query parameter such as: Plain Text /?tool=calculator This means a specific tool can be shared directly. Browser back and forward navigation also restores or closes the modal correctly. This stage made the application feel more like a small web app instead of a static collection of panels."}, {"post_id": 62216, "ts": "2026-09-05T14:04:37Z", "hours": 0.2981, "text": "Devlog 05 — Adding more tools and loading feedback I expanded Toolbox from seven tools to ten. The new tools are a basic calculator, a random picker, and a habit tracker. The calculator handles basic arithmetic, decimals, clearing, backspace, and divide-by-zero handling. The random picker accepts one option per line and chooses one result. The habit tracker stores a habit name and marks progress across the last seven days. I also added a visible skeleton loader when opening a modal. The loading state is short, but it gives the interface a clear transition instead of making the tool appear abruptly. The habit tracker still works without an account by using local browser storage."}, {"post_id": 61358, "ts": "2026-09-04T07:23:04Z", "hours": 0.3933, "text": "Devlog 04 — Improving the tools and interaction The project then moved from visual work into interaction design. Tool cards became keyboard accessible. Users can open cards with Enter or Space, and tool icons and arrows can also be focused and activated directly. The modal now manages focus more carefully. It moves focus into the dialog when opened, locks page scrolling, closes on Escape, and returns focus to the original card after closing. The password generator was also improved to use cryptographically stronger random values instead of relying only on Math.random(). The theme toggle stores its state locally and exposes its state through aria-pressed. These changes made the site feel less like a visual experiment and more like a real usable interface."}, {"post_id": 60714, "ts": "2026-09-03T08:37:07Z", "hours": 0.8158, "text": "Devlog 03 — Adding the hand-drawn style The next pass moved Toolbox toward a hand-drawn notebook style. I added handwritten display fonts, uneven rotations, sketch borders, paper textures, dashed outlines, irregular icon shapes, and offset shadows. The goal was to make the interface feel assembled by hand rather than generated from a standard component library. The cards received small imperfections instead of perfectly symmetrical decoration. Buttons, labels, notes, and headings started using a more informal visual language. I also added reduced-motion support so the hand-drawn animation would not become a problem for users who prefer less movement. This was the point where Toolbox developed a recognisable personality."}, {"post_id": 60116, "ts": "2026-09-02T08:48:56Z", "hours": 0.3106, "text": "Devlog 02 — Reworking the visual direction The first visual direction felt too much like a generic landing page, so I rebuilt the layout around a quieter utility interface. I changed the typography, spacing, card proportions, modal layout, and responsive behavior. The hero became less promotional and more like an entry point into a small collection of tools. The copy was shortened and made more direct. Instead of trying to sell the product, the page started explaining what it actually does. The card layout became easier to scan. Each card received a number, a short description, a category label, and a clear open action. This stage established the basic visual rule for the project: the interface should feel like a useful object, not a marketing page."}, {"post_id": 59686, "ts": "2026-09-01T16:39:17Z", "hours": 0.7372, "text": "Devlog 01 — Starting with a small toolbox I started building Toolbox as a simple browser page for the little tasks that usually lead to opening five more tabs. The first version focused on three files: index.html, style.css, and script.js. The page had a hero section, a tool grid, a modal system, a theme toggle, and a few local utilities. The first tools were a focus timer, task list, notes area, password generator, unit converter, customs estimate, and color picker. The goal was deliberately small: open the page, choose a tool, finish the job, and leave. The important early decision was to keep everything client-side. Tasks and notes could use browser storage, while calculators and converters could work without a server."}]...
|
Title: the thing by @rizz | Stardance
Devlogs:
De Title: the thing by @rizz | Stardance
Devlogs:
Devlog 01 — Starting with a small toolbox I started building Toolbox as a simple browser page for the little tasks that usually lead to opening five more tabs. The first version focused on three files: index.html, style.css, and script.js. The page had a hero section, a tool grid, a modal system, a theme toggle, and a few local utilities. The first tools were a focus timer, task list, notes area, password generator, unit converter, customs estimate, and color picker. The goal was deliberately small: open the page, choose a tool, finish the job, and leave. The important early decision was to keep everything client-side. Tasks and notes could use browser storage, while calculators and converters could work without a server.
Devlog 02 — Reworking the visual direction The first visual direction felt too much like a generic landing page, so I rebuilt the layout around a quieter utility interface. I changed the typography, spacing, card proportions, modal layout, and responsive behavior. The hero became less promotional and more like an entry point into a small collection of tools. The copy was shortened and made more direct. Instead of trying to sell the product, the page started explaining what it actually does. The card layout became easier to scan. Each card received a number, a short description, a category label, and a clear open action. This stage established the basic visual rule for the project: the interface should feel like a useful object, not a marketing page.
Devlog 03 — Adding the hand-drawn style The next pass moved Toolbox toward a hand-drawn notebook style. I added handwritten display fonts, uneven rotations, sketch borders, paper textures, dashed outlines, irregular icon shapes, and offset shadows. The goal was to make the interface feel assembled by hand rather than generated from a standard component library. The cards received small imperfections instead of perfectly symmetrical decoration. Buttons, labels, notes, and headings started using a more informal visual language. I also added reduced-motion support so the hand-drawn animation would not become a problem for users who prefer less movement. This was the point where Toolbox developed a recognisable personality.
Devlog 04 — Improving the tools and interaction The project then moved from visual work into interaction design. Tool cards became keyboard accessible. Users can open cards with Enter or Space, and tool icons and arrows can also be focused and activated directly. The modal now manages focus more carefully. It moves focus into the dialog when opened, locks page scrolling, closes on Escape, and returns focus to the original card after closing. The password generator was also improved to use cryptographically stronger random values instead of relying only on Math.random(). The theme toggle stores its state locally and exposes its state through aria-pressed. These changes made the site feel less like a visual experiment and more like a real usable interface.
Devlog 05 — Adding more tools and loading feedback I expanded Toolbox from seven tools to ten. The new tools are a basic calculator, a random picker, and a habit tracker. The calculator handles basic arithmetic, decimals, clearing, backspace, and divide-by-zero handling. The random picker accepts one option per line and chooses one result. The habit tracker stores a habit name and marks progress across the last seven days. I also added a visible skeleton loader when opening a modal. The loading state is short, but it gives the interface a clear transition instead of making the tool appear abruptly. The habit tracker still works without an account by using local browser storage.
Devlog 06 — Breadcrumbs, deep links, and history The site now has an actual navigation state instead of relying only on scrolling. A breadcrumb row shows the current location and a live status message. It changes between Home, Tools, and About as the user moves through the page. Hovering over a tool card reports the tool name in the status area. Opening a tool updates the URL with a query parameter such as: Plain Text /?tool=calculator This means a specific tool can be shared directly. Browser back and forward navigation also restores or closes the modal correctly. This stage made the application feel more like a small web app instead of a static collection of panels.
so aghh i have rewrote the code and added some more options but i accidentally deleted my Os cuz i tried to play val by dual booting ahem…i lost all my files.
Devlog 08 — Current state and the next backend stepToolbox now combines a pastel hand-drawn interface, ten working browser tools, skeleton loading states, breadcrumb navigation, deep links, local persistence, and an interactive 3D canvas background.The current app works as a static frontend. Tasks, notes, habits, and theme preferences stay in browser storage. No account is required for the existing version.Supabase was selected as the planned backend for the next stage. The intended implementation is email authentication, user-owned records, row-level security, cloud sync, offline fallback, and migration from local storage after sign-in.That backend work has not been faked or partially hidden in the frontend. It still needs a Supabase project URL, public anon key, database schema, and security policies before it can be connected safely.The current deployable project contains index.html, style.css, script.js, and 404.html. The frontend can be deployed now, while authentication and synchronization remain the next planned milestone.
changed the UI cuz it got flagged as AI even tho i didn’t use Ai
added new stuff and made it into a proper webos with all the features
Ships:
What I Made I made Toolbox , a small website where people can find useful everyday tools in one place. It includes a focus timer, task list, notes, password generator, unit converter, customs calculator, color picker, calculator, random picker, and habit tracker. I also added a hand drawn style, pastel colours, dark mode, local saving, breadcrumbs, loading animations, keyboard support, and an interactive 3D background with floating shapes and particle effects. What Was Challenging The hardest part was making the website look interesting without making it difficult to use. I tried several different styles before finding the current hand drawn and colourful look. Adding the 3D background was also challenging because it needed to feel alive while keeping the text and tools easy to see. Another difficult part was making all the tools work properly inside the same modal system. Each tool needed its own controls, buttons, results, reset behavior, and error handling. The breadcrumb navigation and deep links were also challenging. I wanted users to be able to open a specific tool directly and still use the browser back button normally. Dark mode took more work than expected too. Changing only the background colour looked bad, so I had to adjust the cards, text, borders, shadows, forms, and 3D background separately. What I Am Proud Of I am proud that Toolbox is not just a design mockup. The tools actually work. You can add tasks, write notes, generate passwords, convert values, calculate numbers, choose random options, and track habits. Notes, tasks, habits, and theme settings can also be saved in the browser. I am especially proud of the 3D background because I built it with a canvas instead of relying on a large 3D library. It reacts to the mouse, moves objects through depth, and creates particles when the page is clicked. I am also proud of the small accessibility details. The cards, icons, and arrows can be opened with the keyboard. Modals can be closed with Escape, and the site has reduced motion support. What People Should Know Before Testing The project currently works without an account or backend. Tasks, notes, habits, and theme settings are saved only in the browser being used. If browser storage is cleared, that information will disappear. The data will not automatically appear on another device. Authentication and cloud sync are planned but are not active yet. The customs calculator is only a rough estimate using simple example rates. It should not be used as official tax or customs advice. To test the project, try these things: Open a tool card. Click the icon on a card. Click the arrow on a card. Open a card with Enter or Space. Close a modal with Escape. Try the “See the tools” button. Switch between light mode and dark mode. Add and complete a task. Write a note, reload the page, and check if it stayed saved. Mark a few days in the habit tracker. Open a calculator directly with ?tool=calculator . Open a tool and use the browser back button. Move the mouse around the 3D background. Click the page and watch the particle effect. For the best test, run the project with a local server: python3 -m http.server 8000...
|
1793152237.3416996
|
1793238637.3416996
|
|
69540
|
dumb bot by @Aarjav_3 | Stardance
|
Aarjav_3
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T08:59:59Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a slack bot that replies to ur commands hosting it on nest was a bit challenging Slack bot hosted 24/7 on Nest. Test with /dumb-bot-ping, /dumb-bot-catfact, and /dumb-bot-help in #bot-spam.", "repo": "https://github.com/aarjavjain-in/slack-bot", "demo": "https://hackclub.com/slack/"}]...
|
[{"post_id": 80118, "ts": "202 [{"post_id": 80118, "ts": "2026-10-16T08:53:24Z", "hours": 0.2736, "text": "deployed slcak bot to nest so tht it can work 24/7"}, {"post_id": 79854, "ts": "2026-10-15T16:52:54Z", "hours": 0.3428, "text": "made a slack bot tht replies to ur commands"}]...
|
Title: dumb bot by @Aarjav_3 | Stardance
Devlogs: Title: dumb bot by @Aarjav_3 | Stardance
Devlogs:
made a slack bot tht replies to ur commands
deployed slcak bot to nest so tht it can work 24/7
Ships:
i made a slack bot that replies to ur commands hosting it on nest was a bit challenging Slack bot hosted 24/7 on Nest. Test with /dumb-bot-ping, /dumb-bot-catfact, and /dumb-bot-help in #bot-spam....
|
1793155771.9599497
|
1793242171.9599497
|
|
69979
|
RiddleBot by @avycado13 | Stardance
|
avycado13
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T19:37:07Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made riddlebot. A bot to riddel you.!", "repo": "https://github.com/avycado13/riddlebot", "demo": "https://hackclub.enterprise.slack.com/archives/C0C9GCQ4LUX"}]...
|
[{"post_id": 80117, "ts": "202 [{"post_id": 80117, "ts": "2026-10-16T08:52:01Z", "hours": 0.6928, "text": "I finished up the README and also the systemd unit to run on my nixos server"}, {"post_id": 80109, "ts": "2026-10-16T08:06:09Z", "hours": 0.4189, "text": "I wrote a basic slack app in socket mode using bolt to send riddles when a slash command is recieved. I tried using bun for this but turns out. that bun’s undici wrapper is super stupid and fails so good old node and pnpm worked instead"}]...
|
Title: RiddleBot by @avycado13 | Stardance
Devlog Title: RiddleBot by @avycado13 | Stardance
Devlogs:
I wrote a basic slack app in socket mode using bolt to send riddles when a slash command is recieved. I tried using bun for this but turns out. that bun’s undici wrapper is super stupid and fails so good old node and pnpm worked instead
I finished up the README and also the systemd unit to run on my nixos server
Ships:
I made riddlebot. A bot to riddel you.!...
|
1793198874.8033488
|
1793285274.8033488
|
|
55446
|
Blare thing i guess by @CharlieCatMeow | Stardance
|
CharlieCatMeow
|
0
|
6.35
|
0
|
[]
|
[{"post_id": 80113, "ts": "202 [{"post_id": 80113, "ts": "2026-10-16T08:40:48Z", "hours": 2.6056, "text": "Blare Devlog #5 Finished building it now! This is my second time soldering so it went a lot faster than last time. I fixed a couple bugs with the screen not working, it’s kind of weird. Everything works now though, but I don’t have any complex functionality programmed yet."}, {"post_id": 60909, "ts": "2026-09-03T15:54:08Z", "hours": 0.3836, "text": "Blare Devlog #4 I was wrong. Turns out I still had to do the firmware. So here it is. It’s not much, but it should suffice. I can always work on it later but for now I’ll leave it like that so that I can make sure the screen works first once I get the parts."}, {"post_id": 59749, "ts": "2026-09-01T17:57:33Z", "hours": 1.5397, "text": "Blare Devlog #3 Decorated the case a bit I added some things to the case. I don’t know if it looks good but it looks like that now. Also the PCB I added a bunch of SVG’s to the silkscreen. Forgot a picture. That should be all, I should be able to submit now, once I organize the repo a bit and write a README."}, {"post_id": 57411, "ts": "2026-08-29T15:39:06Z", "hours": 1.0061, "text": "Blare Devlog #2 Rewiring the PCB and making the case I had to rewire the PCB since I forgot to flip some parts. Also finished creating the case in the guide. I can move on to decorating the thing now :D"}, {"post_id": 56765, "ts": "2026-08-28T17:34:26Z", "hours": 0.8186, "text": "Blare Devlog #1 I made the PCB. There’s nothing special about it yet. I haven’t added any designs. Yeah thats it I already did a lot on the hackpad mission so this wasn’t really that hard."}]...
|
Title: Blare thing i guess by @CharlieCatMeow | St Title: Blare thing i guess by @CharlieCatMeow | Stardance
Devlogs:
Blare Devlog #1 I made the PCB. There’s nothing special about it yet. I haven’t added any designs. Yeah thats it I already did a lot on the hackpad mission so this wasn’t really that hard.
Blare Devlog #2 Rewiring the PCB and making the case I had to rewire the PCB since I forgot to flip some parts. Also finished creating the case in the guide. I can move on to decorating the thing now :D
Blare Devlog #3 Decorated the case a bit I added some things to the case. I don’t know if it looks good but it looks like that now. Also the PCB I added a bunch of SVG’s to the silkscreen. Forgot a picture. That should be all, I should be able to submit now, once I organize the repo a bit and write a README.
Blare Devlog #4 I was wrong. Turns out I still had to do the firmware. So here it is. It’s not much, but it should suffice. I can always work on it later but for now I’ll leave it like that so that I can make sure the screen works first once I get the parts.
Blare Devlog #5 Finished building it now! This is my second time soldering so it went a lot faster than last time. I fixed a couple bugs with the screen not working, it’s kind of weird. Everything works now though, but I don’t have any complex functionality programmed yet....
|
1793162978.1652536
|
1793767778.1652536
|
|
67649
|
CharliePet by @CharlieCatMeow | Stardance
|
CharlieCatMeow
|
1
|
5.0
|
28
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-18T09:10:12Z", "hours": 5.0, "multiplier": 6.22, "payout": 28, "blessing": "neutral", "text": "CharliePet A cat that lives inside your computer. It can follow your cursor, stretch, look around and if you don’t move your mouse for 8 seconds it goes to sleep. All art is drawn by me, it’s meant to resemble my cat Charlie. (Look at my profile picture) (This only works on Windows so if you don’t use Windows please skip)", "repo": "https://github.com/CharlieTheCatMeow/CharliePet", "demo": "https://charliecatmeow.itch.io/charliepet"}]...
|
[{"post_id": 80112, "ts": "202 [{"post_id": 80112, "ts": "2026-10-16T08:37:23Z", "hours": 1.0853, "text": "CharliePet Devlog #4 Basically finished now! I made it stay in one place if you click it. It also meows. The cat now has a wake up animation (just the going to sleep animation but reversed) The README and demo is done now. Also fixed a couple of small bugs"}, {"post_id": 79038, "ts": "2026-10-12T13:47:20Z", "hours": 1.0478, "text": "Charlie Pet Devlog #3 Animations and stuff! The el gato now follows your cursor. If it gets close it may play a short animation. If you don’t move for too long it will get tired and go to sleep. Uh yeah"}, {"post_id": 78779, "ts": "2026-10-11T16:14:45Z", "hours": 1.4336, "text": "Charlie Pet Devlog #2 Charlie! This is what I drew in 1.5 hours. It is supposed to resemble the cat seen in my profile picture. I added a couple animations that Charlie does. This is also my first time using Aseprite so it took me a while to figure out."}, {"post_id": 78699, "ts": "2026-10-11T10:48:35Z", "hours": 0.9836, "text": "Charlie Pet It works? I just used the Crow Assets for now. I followed the guide and it works now. It bounces like a DVD logo, though it is a bit broken."}]...
|
Title: CharliePet by @CharlieCatMeow | Stardance
Title: CharliePet by @CharlieCatMeow | Stardance
Devlogs:
Charlie Pet It works? I just used the Crow Assets for now. I followed the guide and it works now. It bounces like a DVD logo, though it is a bit broken.
Charlie Pet Devlog #2 Charlie! This is what I drew in 1.5 hours. It is supposed to resemble the cat seen in my profile picture. I added a couple animations that Charlie does. This is also my first time using Aseprite so it took me a while to figure out.
Charlie Pet Devlog #3 Animations and stuff! The el gato now follows your cursor. If it gets close it may play a short animation. If you don’t move for too long it will get tired and go to sleep. Uh yeah
CharliePet Devlog #4 Basically finished now! I made it stay in one place if you click it. It also meows. The cat now has a wake up animation (just the going to sleep animation but reversed) The README and demo is done now. Also fixed a couple of small bugs
Ships:
CharliePet A cat that lives inside your computer. It can follow your cursor, stretch, look around and if you don’t move your mouse for 8 seconds it goes to sleep. All art is drawn by me, it’s meant to resemble my cat Charlie. (Look at my profile picture) (This only works on Windows so if you don’t use Windows please skip)...
|
1793155830.606136
|
1793242230.606136
|
|
58518
|
HackerOS by @XeroDay | Stardance
|
XeroDay
|
0
|
3.24
|
0
|
[]
|
[{"post_id": 80110, "ts": "202 [{"post_id": 80110, "ts": "2026-10-16T08:06:57Z", "hours": 0.8436, "text": "Devlog #3 - HackerOS I built a Web Browser inside my WebOS - HackerOS! So this website doesn’t load youtube.com cuz of same origin policy, I can’t youtube.com into the frame cuz it won’t allow me to and also due to same origin policy I can’t serve any of it’s data on to my browser. But example.com loads successfully!!"}, {"post_id": 62224, "ts": "2026-09-05T14:14:56Z", "hours": 1.0258, "text": "Devlog #2 - HackerOS I’ve Done it!! I’ve built a Virtual File System in my Web OS - Hacker OS!! Now you can save and delete files and it will be persistent!! It was pretty messy at the start but I did it!"}, {"post_id": 62168, "ts": "2026-09-05T13:02:07Z", "hours": 1.3725, "text": "Devlog #1 - HackerOS I am building Hacker-OS, because I am a cybersecurity enthusiast"}]...
|
Title: HackerOS by @XeroDay | Stardance
Devlogs:
Title: HackerOS by @XeroDay | Stardance
Devlogs:
Devlog #1 - HackerOS I am building Hacker-OS, because I am a cybersecurity enthusiast
Devlog #2 - HackerOS I’ve Done it!! I’ve built a Virtual File System in my Web OS - Hacker OS!! Now you can save and delete files and it will be persistent!! It was pretty messy at the start but I did it!
Devlog #3 - HackerOS I built a Web Browser inside my WebOS - HackerOS! So this website doesn’t load youtube.com cuz of same origin policy, I can’t youtube.com into the frame cuz it won’t allow me to and also due to same origin policy I can’t serve any of it’s data on to my browser. But example.com loads successfully!!...
|
1792756056.3243177
|
1793360856.3243177
|
|
4074
|
Project Luminescence by @vindognz | Stardance
|
vindognz
|
1
|
5.45
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-12T23:04:15Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a custom heart-shaped PCB with 10 LEDs and 3 modes (ON, breathing, OFF). It’s a birthday gift for my girlfriend! Making the trimpot voltage divider took some iteration, but breadboard testing saved me big time. I’m super proud of the entire architecture, as this is my first completed hardware project. Thanks for voting!", "repo": "https://github.com/vindognz/project-luminescence", "demo": ""}]...
|
[{"post_id": 80102, "ts": "202 [{"post_id": 80102, "ts": "2026-10-16T07:11:24Z", "hours": 1.4517, "text": "[Friday, Oct 16] - Tweaks before review Almost exactly two months since my last devlog.. I spent this entire devlog polishing my README, reorganising, reformatting my BOM.csv, etc. to ensure Project Luminescence is ready for review!"}, {"post_id": 29945, "ts": "2026-07-17T04:06:01Z", "hours": 0.4667, "text": "[Friday, July 17] - Hardware Assembly Complete Okay so… it’s been a month since my last devlog. I ordered the PCBs June 16th, and they arrived while I was on holiday, but we’re finally back to building! The PCBs arrived absolutely beautiful. The heart shape clean, and the blue solder mask + white silkscreen looks fabulous. Soldering was a journey… I got every component on except the battery holder with relative ease (forgot to track the time 🫠). I tested the complete board using an Arduino as a PSU and everything worked perfectly! There was a lot of residual flux left around the joints (looked like someone sneezed on my board) which I cleaned with an old toothbrush and some hand sanitiser 💀 Next: Solder battery holder, cut the LED legs, then ship!"}, {"post_id": 12846, "ts": "2026-06-21T01:07:36Z", "hours": 0.8319, "text": "[Tuesday, Jun 16] - Analog Brightness + PCB Finalized Firmware is DONE! Got trimpot brightness control working - turn the knob, watch the LED respond beautifully. Hardware: Rerouted the whole back to fit the trimpot voltage divider properly, added a power switch to toggle it on/off (goodbye battery drain anxiety!). PCB is ready to manufacture! After many firmware bugs, all three pieces are finally working together: smooth fading firmware + trimpot brightness control + clean power management. Next: Export Gerbers and ship this to JLCPCB!"}, {"post_id": 9572, "ts": "2026-06-15T23:00:36Z", "hours": 0.4061, "text": "[Tuesday, Jun 16] - Smooth fading and PCB polishing. Firmware: I got the smooth PWM fading working with gamma corrected brightness. The breathing effect is absolutely GORGEOUS and way better than the old blinking. Hardware: Did some PCB cleaning up. Rescaled the silkscreen text to be bigger and more readable, and repositioned everything to look cleaner on the front. Both parts are coming together nicely! Firmware is almost done (just need trimpot brightness control), and the PCB design is ready to order soon! Next up: Integrate analog brightness control from the trimpot."}, {"post_id": 3228, "ts": "2026-06-06T01:49:43Z", "hours": 0.8261, "text": "[Saturday, Jun 6th] - Mode cycling and debouncing. Core firmware structure updated. Button debouncing is solid (50ms), and mode cycling is working cleanly through OFF, ON and FADE. Right now, the fade is just blinking, but that’s next on the list. Once I add smooth PWM fading with gamma correction, the breathing effect will be 🤌 Git log (attached) shows my iteration. We’re getting close to ordering our PCBs!"}, {"post_id": 3085, "ts": "2026-06-05T23:55:03Z", "hours": 0.4589, "text": "[Saturday, Jun 6th] - Core Firmware. Got the basic firmware working. Just simple button press turns LED on/off. Nothing fancy yet, but big things are in the near future. Next up: Debouncing, mode cycling (off, on, breathe), and trimpot brightness control. But for now, the core loop works and proves my ATtiny85 isn’t fried lol."}, {"post_id": 2716, "ts": "2026-06-05T13:17:46Z", "hours": 1.0261, "text": "[Friday, Jun 5th] - PCB Designed. My first devlog! I got my first prototype of the board completed, designed so all the ugly components are on the back. This design features: ATTINY85 microcontroller A CR2032 battery holder 10x 5mm red LEDs A trimmer potentiometer from Aliexpress 💀 A button for switching modes"}]...
|
Title: Project Luminescence by @vindognz | Stardan Title: Project Luminescence by @vindognz | Stardance
Devlogs:
[Friday, Jun 5th] - PCB Designed. My first devlog! I got my first prototype of the board completed, designed so all the ugly components are on the back. This design features: ATTINY85 microcontroller A CR2032 battery holder 10x 5mm red LEDs A trimmer potentiometer from Aliexpress 💀 A button for switching modes
[Saturday, Jun 6th] - Core Firmware. Got the basic firmware working. Just simple button press turns LED on/off. Nothing fancy yet, but big things are in the near future. Next up: Debouncing, mode cycling (off, on, breathe), and trimpot brightness control. But for now, the core loop works and proves my ATtiny85 isn’t fried lol.
[Saturday, Jun 6th] - Mode cycling and debouncing. Core firmware structure updated. Button debouncing is solid (50ms), and mode cycling is working cleanly through OFF, ON and FADE. Right now, the fade is just blinking, but that’s next on the list. Once I add smooth PWM fading with gamma correction, the breathing effect will be 🤌 Git log (attached) shows my iteration. We’re getting close to ordering our PCBs!
[Tuesday, Jun 16] - Smooth fading and PCB polishing. Firmware: I got the smooth PWM fading working with gamma corrected brightness. The breathing effect is absolutely GORGEOUS and way better than the old blinking. Hardware: Did some PCB cleaning up. Rescaled the silkscreen text to be bigger and more readable, and repositioned everything to look cleaner on the front. Both parts are coming together nicely! Firmware is almost done (just need trimpot brightness control), and the PCB design is ready to order soon! Next up: Integrate analog brightness control from the trimpot.
[Tuesday, Jun 16] - Analog Brightness + PCB Finalized Firmware is DONE! Got trimpot brightness control working - turn the knob, watch the LED respond beautifully. Hardware: Rerouted the whole back to fit the trimpot voltage divider properly, added a power switch to toggle it on/off (goodbye battery drain anxiety!). PCB is ready to manufacture! After many firmware bugs, all three pieces are finally working together: smooth fading firmware + trimpot brightness control + clean power management. Next: Export Gerbers and ship this to JLCPCB!
[Friday, July 17] - Hardware Assembly Complete Okay so… it’s been a month since my last devlog. I ordered the PCBs June 16th, and they arrived while I was on holiday, but we’re finally back to building! The PCBs arrived absolutely beautiful. The heart shape clean, and the blue solder mask + white silkscreen looks fabulous. Soldering was a journey… I got every component on except the battery holder with relative ease (forgot to track the time 🫠). I tested the complete board using an Arduino as a PSU and everything worked perfectly! There was a lot of residual flux left around the joints (looked like someone sneezed on my board) which I cleaned with an old toothbrush and some hand sanitiser 💀 Next: Solder battery holder, cut the LED legs, then ship!
[Friday, Oct 16] - Tweaks before review Almost exactly two months since my last devlog.. I spent this entire devlog polishing my README, reorganising, reformatting my BOM.csv, etc. to ensure Project Luminescence is ready for review!
Ships:
I made a custom heart-shaped PCB with 10 LEDs and 3 modes (ON, breathing, OFF). It’s a birthday gift for my girlfriend! Making the trimpot voltage divider took some iteration, but breadboard testing saved me big time. I’m super proud of the entire architecture, as this is my first completed hardware project. Thanks for voting!...
|
1793127015.8531847
|
1793213415.8531847
|
|
67654
|
wake up!!! by @Brokie | Stardance
|
Brokie
|
0
|
10.19
|
0
|
[]
|
[{"post_id": 80101, "ts": "202 [{"post_id": 80101, "ts": "2026-10-16T07:09:33Z", "hours": 1.1867, "text": "so made some changes both in pcb and cad readjusted everything in place"}, {"post_id": 79746, "ts": "2026-10-15T08:34:45Z", "hours": 1.5653, "text": "made sum further changes with the alarm clock added more button in 2*3 matrix and some other stuff"}, {"post_id": 79486, "ts": "2026-10-14T08:16:46Z", "hours": 1.5947, "text": "continued the cad design of my alarm clock added back plate and cutout for usb c cable and added some screw holes for pcb"}, {"post_id": 78063, "ts": "2026-10-09T12:48:41Z", "hours": 1.6267, "text": "so i wanted to create an alarm clock that resembled the brick phone from 90s so i was trying to create the body the clock in fusion"}, {"post_id": 77546, "ts": "2026-10-07T12:18:13Z", "hours": 1.6206, "text": "So i finished the pcb added sum stickers on it and started working on the case for it rn i have only made a simple layout for the case i will work on the case tomorrow"}, {"post_id": 77010, "ts": "2026-10-05T11:09:30Z", "hours": 0.7, "text": "currently working on my alarm clocks pcb layout"}, {"post_id": 76400, "ts": "2026-10-03T12:58:48Z", "hours": 1.8958, "text": "i started blare challenge and i created the schematic of my pcb today"}]...
|
Title: wake up!!! by @Brokie | Stardance
Devlogs: Title: wake up!!! by @Brokie | Stardance
Devlogs:
i started blare challenge and i created the schematic of my pcb today
currently working on my alarm clocks pcb layout
So i finished the pcb added sum stickers on it and started working on the case for it rn i have only made a simple layout for the case i will work on the case tomorrow
so i wanted to create an alarm clock that resembled the brick phone from 90s so i was trying to create the body the clock in fusion
continued the cad design of my alarm clock added back plate and cutout for usb c cable and added some screw holes for pcb
made sum further changes with the alarm clock added more button in 2*3 matrix and some other stuff
so made some changes both in pcb and cad readjusted everything in place...
|
1793112745.5048783
|
1793717545.5048783
|
|
66367
|
Myco OS by @adwitya | Stardance
|
adwitya
|
0
|
5.68
|
0
|
[]
|
[{"post_id": 80099, "ts": "202 [{"post_id": 80099, "ts": "2026-10-16T06:57:57Z", "hours": 5.1186, "text": "After setting up the initial project the next step was to figure out how to approach the firmware without making the first prototype unnecessarily complicated Ai assistance was used as a reference for choosing a firmware folder structure and planning a simple architecture . The idea was to keep the code separated into modules so that individual component could be changed later without having to rewrite the entire system. the initial structure uses PlatformIO with the Arduino framework for the ESP32 . The Sensor-related files were placed in a separate sensor folder , with for climate control , power management and controller logic as the project develops. The First piece of firmware work was the sensor abstraction . A common Sensor interface and a SensorData structure were created , along with two sensor implementation : FakeSensor and Sht31Sensor The fake senor returns fixed temperature and humidity values which makes it possible to develop the basic firmware without having the physical sensor connected . The Sh31 implementation is intended to read actual temperature and humidity measurement using Adafruit SH31 library. The initial main.cpp was written to select a sensor, initialize it and print its reading through the serial monitor . This gives the project a starting point for checking the senor interface before moving on to climate control. There is still issue to resolve with Sh31 Library being recognized by VS Code .The Physical sensor has not yet been tested with the ESP32(due to lack of funding) ,so real reading have not been verified. Fan Control , humidification and automatic humidity regulation are also pending . For now the focus is on getting the sensor layer working reliably before adding more features. Once the ESP32 can read actual environmental data , the next step will be to start building the control logic"}, {"post_id": 74668, "ts": "2026-09-27T23:16:50Z", "hours": 0.56, "text": "Devlog-1~Project Foundation Overview today i laid the foundation of Myco OS , an open source ecosystem planned for low cost mushroom cultivation. The objective is to build a system that is inexpensive , reliable , scalable, and fully repairable using commodity hardware I’m trying to integrate my engineering skills will my passion of farming to make a functional project which may really make an impact on my life and other activity Principles Cheap Reliable Scalable Open These Priciple will guide every hardware and software decision through development Task Repository The GitHub Repo was initialized with the Mit License, CERN open hardware License . The repo structure was planned for firmware hardware cad dashboard doc Scope the first prototype will focus on the core environmental controller: Esp32 temp and humidity sensing Automatic Humidity control(kinda tough) fan control Local optimaztion Easy Integration Features for next release QR Tracking, Multi Chamber networking and ‘’’.myco’’’ will be planned and worked upon after the first release Why Existing cultivation system are often expensive , proprietary, or difficult to repair .MycoOS Aims to Provide reproducibly open hardware Alternative that anyone can build modify and maintain Next Step Finalize Hardware Select exact Component Design Wiring diagram Begin firmware development"}]...
|
Title: Myco OS by @adwitya | Stardance
Devlogs:
D Title: Myco OS by @adwitya | Stardance
Devlogs:
Devlog-1~Project Foundation Overview today i laid the foundation of Myco OS , an open source ecosystem planned for low cost mushroom cultivation. The objective is to build a system that is inexpensive , reliable , scalable, and fully repairable using commodity hardware I’m trying to integrate my engineering skills will my passion of farming to make a functional project which may really make an impact on my life and other activity Principles Cheap Reliable Scalable Open These Priciple will guide every hardware and software decision through development Task Repository The GitHub Repo was initialized with the Mit License, CERN open hardware License . The repo structure was planned for firmware hardware cad dashboard doc Scope the first prototype will focus on the core environmental controller: Esp32 temp and humidity sensing Automatic Humidity control(kinda tough) fan control Local optimaztion Easy Integration Features for next release QR Tracking, Multi Chamber networking and ‘’’.myco’’’ will be planned and worked upon after the first release Why Existing cultivation system are often expensive , proprietary, or difficult to repair .MycoOS Aims to Provide reproducibly open hardware Alternative that anyone can build modify and maintain Next Step Finalize Hardware Select exact Component Design Wiring diagram Begin firmware development
After setting up the initial project the next step was to figure out how to approach the firmware without making the first prototype unnecessarily complicated Ai assistance was used as a reference for choosing a firmware folder structure and planning a simple architecture . The idea was to keep the code separated into modules so that individual component could be changed later without having to rewrite the entire system. the initial structure uses PlatformIO with the Arduino framework for the ESP32 . The Sensor-related files were placed in a separate sensor folder , with for climate control , power management and controller logic as the project develops. The First piece of firmware work was the sensor abstraction . A common Sensor interface and a SensorData structure were created , along with two sensor implementation : FakeSensor and Sht31Sensor The fake senor returns fixed temperature and humidity values which makes it possible to develop the basic firmware without having the physical sensor connected . The Sh31 implementation is intended to read actual temperature and humidity measurement using Adafruit SH31 library. The initial main.cpp was written to select a sensor, initialize it and print its reading through the serial monitor . This gives the project a starting point for checking the senor interface before moving on to climate control. There is still issue to resolve with Sh31 Library being recognized by VS Code .The Physical sensor has not yet been tested with the ESP32(due to lack of funding) ,so real reading have not been verified. Fan Control , humidification and automatic humidity regulation are also pending . For now the focus is on getting the sensor layer working reliably before adding more features. Once the ESP32 can read actual environmental data , the next step will be to start building the control logic...
|
1793098263.938873
|
1793703063.938873
|
|
11806
|
vsprocessing by @ilovesilverwolf | Stardance
|
ilovesilverwolf
|
1
|
45.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T07:06:26Z", "hours": 45.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "VS Processing is a fork of Code - OSS customized to deliver a near-native browser-based development experience. It adds support for writing, compiling, and running Processing & Java code directly in the browser, plus IntelliSense for all supported languages, a virtual file system, and GitHub integration (pull & push directly to GitHub!) VS Processing is designed specifically for Advanced Placement Computer Science A (AP CSA) classrooms to enable students to develop and run Java/Processing programs without installing any local software. We also found it useful in teaching Java to new members of our FIRST robotics team.", "repo": "https://github.com/CloudTronUSA/vsprocessing", "demo": "https://vsp.cloudtron.us/"}]...
|
[{"post_id": 80098, "ts": "202 [{"post_id": 80098, "ts": "2026-10-16T06:56:42Z", "hours": 6.8725, "text": "added github support - experimental"}, {"post_id": 8687, "ts": "2026-06-14T13:06:32Z", "hours": 2.0592, "text": "added online assignment fetching"}, {"post_id": 7820, "ts": "2026-06-13T01:44:38Z", "hours": 7.47, "text": "added assignments; updated java runtime to support more features, fixed mismatch between official java and our implementation; updated language server; updated vsp ui."}, {"post_id": 7199, "ts": "2026-06-12T00:47:01Z", "hours": 8.7086, "text": "implemented a filesystem that can read and write files from vscode and other places using fetch and java coroutine; fixed processing graphics implementation."}, {"post_id": 6143, "ts": "2026-06-10T10:21:05Z", "hours": 1.4119, "text": "fixed minor issues."}, {"post_id": 6102, "ts": "2026-06-10T08:13:23Z", "hours": 4.5678, "text": "added reference guides; worked on buildding system; deployed to vercel"}, {"post_id": 5463, "ts": "2026-06-09T08:08:26Z", "hours": 8.2408, "text": "added linting, fixed EVIL SAFARI stuff."}, {"post_id": 4645, "ts": "2026-06-08T01:35:19Z", "hours": 5.4681, "text": "optimizing error trace"}]...
|
Title: vsprocessing by @ilovesilverwolf | Stardanc Title: vsprocessing by @ilovesilverwolf | Stardance
Devlogs:
optimizing error trace
added linting, fixed EVIL SAFARI stuff.
added reference guides; worked on buildding system; deployed to vercel
fixed minor issues.
implemented a filesystem that can read and write files from vscode and other places using fetch and java coroutine; fixed processing graphics implementation.
added assignments; updated java runtime to support more features, fixed mismatch between official java and our implementation; updated language server; updated vsp ui.
added online assignment fetching
added github support - experimental
Ships:
VS Processing is a fork of Code - OSS customized to deliver a near-native browser-based development experience. It adds support for writing, compiling, and running Processing & Java code directly in the browser, plus IntelliSense for all supported languages, a virtual file system, and GitHub integration (pull & push directly to GitHub!) VS Processing is designed specifically for Advanced Placement Computer Science A (AP CSA) classrooms to enable students to develop and run Java/Processing programs without installing any local software. We also found it useful in teaching Java to new members of our FIRST robotics team....
|
1793199099.0384219
|
1793285499.0384219
|
|
69897
|
J.A.R.V.I.S by @mail4reyansh | Stardance
|
mail4reyansh
|
0
|
0.39
|
0
|
[]
|
[{"post_id": 80096, "ts": "202 [{"post_id": 80096, "ts": "2026-10-16T06:38:35Z", "hours": 0.385, "text": "Hey, everyone, I am working on a J.A.R.V.I.S. project, which I am trying to make as realistic as possible. I don’t have much to show yet, but I will post updates soon, hopefully!"}]...
|
Title: J.A.R.V.I.S by @mail4reyansh | Stardance
D Title: J.A.R.V.I.S by @mail4reyansh | Stardance
Devlogs:
Hey, everyone, I am working on a J.A.R.V.I.S. project, which I am trying to make as realistic as possible. I don’t have much to show yet, but I will post updates soon, hopefully!...
|
1792918153.5193877
|
1793522953.5193877
|
|
69786
|
smiski hackpad by @chlocolatess | Stardance
|
chlocolatess
|
0
|
0.87
|
0
|
[]
|
[{"post_id": 80094, "ts": "202 [{"post_id": 80094, "ts": "2026-10-16T06:29:26Z", "hours": 0.8689, "text": "my initial goal with this project was to create a cute hackpad that is smiski themed! with the hackpad tutorial, i was guided through on the schematics, pcb design, and the cad. although for NOW i am simply following the tutorial, i plan to add additional components and parts to this project!"}]...
|
Title: smiski hackpad by @chlocolatess | Stardance Title: smiski hackpad by @chlocolatess | Stardance
Devlogs:
my initial goal with this project was to create a cute hackpad that is smiski themed! with the hackpad tutorial, i was guided through on the schematics, pcb design, and the cad. although for NOW i am simply following the tutorial, i plan to add additional components and parts to this project!...
|
1792860456.6375413
|
1793465256.6375413
|
|
6208
|
Space Janitor by @bawad2 | Stardance
|
bawad2
|
1
|
51.42
|
376
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-07T09:38:21Z", "hours": 51.0, "multiplier": 7.31, "payout": 376, "blessing": "neutral", "text": "This is the first project I will ship for Hackclub. It was originally supposed to be shipped after i fully finished it. But slowly i started losing attachment to the project and now i dont want to work on it anymore. So, since it has a working loop for gameplay already im gonna ship it here. That game has a playable demo in itch at https://bawad2.itch.io/space-janitors Also in the repo there is a file called “Hourly logs” in that file I have been writing down what i was working on what my plan is and what my thought process is from day one, I think it will be a interesting thing for you to check out. I hope you find my 53 hours interesting at the very least.", "repo": "https://github.com/Bawad2/Space-Janitors", "demo": "https://bawad2.itch.io/space-janitors"}]...
|
[{"post_id": 80092, "ts": "202 [{"post_id": 80092, "ts": "2026-10-16T06:25:10Z", "hours": 0.4167, "text": "I fixed the things i was told to fix :D"}, {"post_id": 77517, "ts": "2026-10-07T09:35:31Z", "hours": 2.6994, "text": "did some final work on the game and decided to give up and just ship it. Made some upgrades to the main menu"}, {"post_id": 58897, "ts": "2026-08-31T13:50:06Z", "hours": 1.3658, "text": "not much really i just studied GML for a while and also worked on a bunch of UI stuff"}, {"post_id": 50582, "ts": "2026-08-19T19:42:45Z", "hours": 1.6197, "text": "DevLog 23 Iv been real busy lately This devlog is boil down of maybe like a week or so of work. I have been so busy that there wasnt a single day this week that I worked before 12AM. Anyways some of the stuff that I made in this logged time includes: A functional game over screen. yep thats it. It was really hard to make tho. I had to figure out a bunch of stuff such as how to make the stats show in the UI layer and a bunch of other stuff I hope I wont be as busy as this anymore"}, {"post_id": 46264, "ts": "2026-08-13T11:43:46Z", "hours": 0.5503, "text": "DevLog #22 Fixed up my repo and also fixed a fatal bug within my repo I basically had a bug which made me unable to push to origin. I ended up resorting to ai to help me fix this bug. But in the end even the ai failed but the things I learned for the ai ended up helping me fixing it myself. I also rewrote the Readme. And sent new version of the game to itch."}, {"post_id": 45500, "ts": "2026-08-12T01:21:32Z", "hours": 2.0303, "text": "DevLog #21 Random miscellaneous stuff I also threw out the timer sprite Made it so new rocks spawn when old ones are broken. Also made a Fuel meter sprite to use instead of the timer. Made the code for the fuel meter as a timer work.( It was a bunch of hard math.) And of course I had to spend like 1 whole hour debugging all this. Check out the [game](Space Janitors by Bawad2 ) I updated it in itch again."}, {"post_id": 43445, "ts": "2026-08-08T18:13:13Z", "hours": 1.6792, "text": "DevLog #20 PAINLOG #1 Repetition is the worst form of torture. (Also I hate myself) Even if every single one of my trillions of cells had the word “ Pain ” written on them 100 times, It wouldn’t even come close to representing the sheer amount of pain I had to go throw to to finish this sprite. I know there was better ways to do this then to spend nearly 2 hours drawing 180 frames by hand, but I was the one who brought this upon myself. I have no one to blame but me. I hope the pain ends now."}, {"post_id": 41282, "ts": "2026-08-05T12:16:15Z", "hours": 3.1014, "text": "DevLog #19 Productivity just sky-rocketed(Pun intended) I making a game where you collect money by cleaning up space junk and use that money to upgrade your rocket I did a real lot of stuff today . Finished the new shop menu and its fully working Started work on the health system for the rocket and realized the many things i need to work on I have made the rocket upgradable. Now the logged time includes the pain from the clock sprite but that is a story for the next log"}, {"post_id": 40848, "ts": "2026-08-04T17:09:27Z", "hours": 2.4, "text": "DevLog #18 Well this is a long one. I making a game where you collect money by cleaning up space junk and use that money to upgrade your rocket Well, I did a lot of stuff today. Finished Implementing click to move everywhere Made it so the sprites are highLighted when you hover you mouse over them. This took me a lot of time to figure out -# I used chatgpt for a hint during this part. I worked on a sprite for the research lab where you buy upgrades for you rocket This took me like almost the whole hour. Made the basics for the shop menu. I just need to draw a few buttons for the upgrades and it will be done. I used up a lot of the time I was supposed to be studying today to work so im lwk cooked."}, {"post_id": 40246, "ts": "2026-08-03T17:27:02Z", "hours": 0.8933, "text": "Devlog #17 Money works and I got rid of the character I making a game where you collect money by cleaning up space junk and use that money to upgrade your rocket Money system I fixed the bug with the money counter. Now your money is properly shown. It also goes up when you break asteroids, so you can earn money . Point and click system I also started work on the click and move system . All the things I need to make for it are complete but I just need to implement them everywhere now. life update Im still quite busy with my studies so I have a bit less time to work on the game. Thats why development is slowing down."}, {"post_id": 39574, "ts": "2026-08-02T17:06:58Z", "hours": 1.3411, "text": "DevLog #16 Finally doing some real stuff again! I making a game where you collect money by cleaning up space junk and use that money to upgrade your rocket This day wasn’t that productive because I had school for like 9 hours of the day. But I still manged to add some stuff I basically added a money system in to the game and made the HUD elements. For now you can only see how much money you have and not earn any. I ran into bug( not a bug just a coding mistake) which drove me nuts. Basically I was drawing the HUD on the top left side of the room instead of the screen. It took me a while to figure out. But alas I’m out of time so I cant fix it today D:"}, {"post_id": 38818, "ts": "2026-08-01T11:48:51Z", "hours": 1.0, "text": "Devlog #15 I Finally made a proper plan for the game!! I was making a game where you do a bunch of stuff like climbing the corporate ladder and shi but now i changed my mind I have finally made a proper game plan for myself to follow so i can make the game more easily. Basically I used a planning software named milanote to properly plan out all my stuff. These are what I have made the plan for now: IDEAS Make a day system where every day has a set amount of time you earn money by destroying asteroids you upgrade the rocket so you can break more asteroids faster As more days pass increase the difficulty of the game. Make it so the character has to do spend money to in his house for stuff like water bill, food bill, electricity which gives him nerfs if he doesn’t buy these. GET RID OF ANY VISIBLE CHARACTER make it feel kinda like a visual novel type shi when the rocket runs out of health the day ends early and you are fined. GAMEPLAY LOOP(INTENDED) Player wakes up at home goes outside takes a car to go to the rocket launch site transfer to the rocket launch screen(the upgrades can be accessed from here) flys the rocket earns money by breaking asteroids (Bigger asteroid pay more and are harder to break) when time ends he is returned home he decides whether he wants to pay his bills or not sleeps and repeat game ends when he maxs out the rocket also make sure to check out the current state of the game"}, {"post_id": 38108, "ts": "2026-07-31T10:11:25Z", "hours": 0.7, "text": "DEVLOG 14 After a long long time IM FINALLY BACK Basically I had a exam for the whole month and now its finally over. That being said coming back after a long time, I realize that there are some things I really need to change about the game. First of all Im changing what this game is about This is no longer about some corporate ladder bs Im just gonna make a arcade simulator type thing. im gonna make the scope of the game smaller . I realize i dont have much time rn so i will try to work daily but in small amounts! Also I finished some work today. Like finally fixing the HTML issue . Turns out instead of fixing it I just needed to not export to HTML. Also started work on a game over screen. That all for today!! also check out the Game"}, {"post_id": 20637, "ts": "2026-07-02T08:52:25Z", "hours": 0.7, "text": "tried to fix the issues with the html5 export( failed miserably )"}, {"post_id": 19138, "ts": "2026-06-30T11:51:25Z", "hours": 0.4311, "text": "i worked on rearranging my files inside the game. Not worth a full devlog"}, {"post_id": 15740, "ts": "2026-06-25T16:47:17Z", "hours": 0.9833, "text": "Devlog #13 WE ARE SO BACK!! I’m making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. for the past week I have been really busy with school and stuff so I could really work much or at all . So, I have’nt worked on the game for an entire week. But today I decided to change that. So cus Im coming back after a bit of time i decided to not do to much work. So all the things I did today was make a car sprite."}, {"post_id": 10831, "ts": "2026-06-17T19:30:31Z", "hours": 1.5683, "text": "DevLog #12 It actually took me this long to make the player take a nap . I’m making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. I spent this whole time figuring out how to make the player animate when laying down and animate again when getting out of bed. It actually took me 3 different approach to finally find one that works, and even after that when I exported the game to itch for some reason it stops working. It works perfectly fine in the windows build though. I plan on working on fixing this things that happen only on itch tmrw."}, {"post_id": 10152, "ts": "2026-06-16T19:25:28Z", "hours": 1.77, "text": "Devlog #11 You can now play the game yourself🎉!! I’m making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. I did a bunch of stuff in the logged time and the most notable one of the bunch is that i finally made a itch page . i also worked on a few other stuff such as: Made a animation of the player getting in bed ( have’nt implemented it yet tho ) -Work on fixing the bugs that come with making a executable for you game. -Also fix some ui related bugs Please check out the game"}, {"post_id": 9754, "ts": "2026-06-16T05:42:52Z", "hours": 1.2594, "text": "DevLog #10 I spent a ton of time re writing the past devlogs to make them more voter friendly. I’m making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. I basically went back and re-did all my devlogs and added the new markdown formatting stuff I learnt thanks to a hint from @tongyu . You can see the before and after <–– Here I also plan on working on my repo today but I have school in an hour now so I cant do that now :("}, {"post_id": 9428, "ts": "2026-06-15T19:49:04Z", "hours": 1.2389, "text": "Devlog #9 I worked on a pause menu and bunch of other UI stuff. Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. Adding a pause menu is quite a easy task and should not have taken this long. But alas I ran into a bug that took me 30 mins to solve. And the worst part is that fact that it was because of a misplaced “!” symbol. I also re worked on some of the sprites to add some small tweaks. Well the pause menu is still lackluster but I will expand upon it later. Also there is a bug still in the game that makes it so you cant close out of the menu."}, {"post_id": 9180, "ts": "2026-06-15T12:24:39Z", "hours": 1.1825, "text": "DevLog #8 The game now has a Main Menu!! Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. This may not feel like much but with this I have laid all the groundwork needed for the rest of the UI . Now I can complete all the UI stuff in no time. I also lwk need to touch up on the sprites"}, {"post_id": 8731, "ts": "2026-06-14T14:47:21Z", "hours": 3.29, "text": "Devlog #7 Worked on a bunch of stuff in the logged time. Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. The most notable ones would be : New Tileset to match the palette A bunch of other remade sprites (the bed and the sofa) Started Work on UI Drew the Title sprite and quite a bit more. I have been busy with school lately so the devlog frequency has dropped D:"}, {"post_id": 6881, "ts": "2026-06-11T15:16:09Z", "hours": 1.6881, "text": "DevLog #6 Decided to select a style / palette for my game. Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. Took me a bit of time to find a concrete palette for my game. And after a while I found a good palette. Then I decide to re-remake the character . Also I decided to make the artstyle for the game low-res"}, {"post_id": 5654, "ts": "2026-06-09T15:10:33Z", "hours": 1.5761, "text": "Devlog #5 I Started work on some Juicy juicy lore. Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship.( This may be subject to change ) I’m not gonna spoil any of the lore here but just know that I did work on it. I also remade the main player sprite ( This time lore accurate ) and also worked on a few bugs"}, {"post_id": 4945, "ts": "2026-06-08T16:02:09Z", "hours": 1.1394, "text": "Devlog #4 The player can now board upon the rocket! Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. And now the two parts of the game are finally connected. Now the player can walk out of his house , then go to the launch site and board on the rocket. I did run into a bunch of problems when trying to implement this. At first I was trying to do all the work on the boarder object but then I realized it would be much easier if I just did that in the player instead. So it works now."}, {"post_id": 4253, "ts": "2026-06-07T14:33:13Z", "hours": 1.0903, "text": "Made the final sprite for the rocket launch site! Usually I get the artwork for my game done by teammates. But since I dont have any teammates this time I decided to start learning pixel art myself! Since I’m just starting now even the simple things take me quite a long time. The entire time logged here was spent working on this one sprite ( This doesn’t include the time spent on the rocket btw)"}, {"post_id": 3606, "ts": "2026-06-06T16:38:54Z", "hours": 0.8453, "text": "Remade the rocket sprite. Definitely the best artwork of my life. I will happily take any advice you guys have."}, {"post_id": 3479, "ts": "2026-06-06T13:06:17Z", "hours": 2.8403, "text": "DEVLOG #3 You can now TOUCH GRASS! not really tho. I added the inside of a house and outside portion to the game. The character can now walk out of his house and then walk over to the rocket launch station and then fly the rocket I also made a few sprites for decoration inside of the house"}, {"post_id": 2704, "ts": "2026-06-05T12:38:40Z", "hours": 1.2025, "text": "Drew and implemented a tileset for the main house of the game The tileset will be used to line the inside of the house so you can tell the wall apart from the void"}, {"post_id": 2668, "ts": "2026-06-05T10:42:41Z", "hours": 1.5236, "text": "Made a new sprite for the main character"}, {"post_id": 1984, "ts": "2026-06-04T07:49:07Z", "hours": 3.0933, "text": "DEVLOG #2 The rocket🚀 can now reach space🌌! Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. As you can probably tell I added space to my game. I also : drew a bunch of janky looking stars🌠 and added them to the game. I also added 2 types of clouds , Normal and storm clouds . The storm clouds🌩️ make your rocket blow up if you crash into it and normal clouds☁️ are only for cosmetic purposes . I also fixed up a fix bugs👾 with the throttle system for the rocket. btw you can click on the underlined words to see the sprites"}, {"post_id": 1373, "ts": "2026-06-03T11:17:05Z", "hours": 4.6692, "text": "DevLog #1 Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. So far I have added quite a lot of stuff and am only now realizing that i should have made devlogs earlier. So this devlog gonna be a bit long . The things I have added are : a moveable character . the rocket . I finished the dynamic thrust system ( controlling the thrust of the rocket using the scroll wheel ) . On day 2 I started work on making the rocket tilt so it can move side to side. When doing this I ran into a problem due to the way I made the rocket fly. Basically I was increasing the “Y” value of the rocket to make it fly but that doesnt work with the way I want to tilt the rocket so I scraped that and used a method thats already built-into GMS2. Then I made the rocket explode if it hit a surface too hard ( I wasted 30 mins on the explosion sprite ). Check out the sprite I added so the rocket can actually shoot I also added breakable rocks that you can shoot down. Then I spent the next hour on making a teleport system so the rocket can move from one stage from to another. On my way to make this I broke the thrust system so I spent 30 mins trying to figure it out only for it to be the fault of a “-” sign instead of a “+” sign. I plan on working on new sprites for the character later"}]...
|
Title: Space Janitor by @bawad2 | Stardance
Devlo Title: Space Janitor by @bawad2 | Stardance
Devlogs:
DevLog #1 Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. So far I have added quite a lot of stuff and am only now realizing that i should have made devlogs earlier. So this devlog gonna be a bit long . The things I have added are : a moveable character . the rocket . I finished the dynamic thrust system ( controlling the thrust of the rocket using the scroll wheel ) . On day 2 I started work on making the rocket tilt so it can move side to side. When doing this I ran into a problem due to the way I made the rocket fly. Basically I was increasing the “Y” value of the rocket to make it fly but that doesnt work with the way I want to tilt the rocket so I scraped that and used a method thats already built-into GMS2. Then I made the rocket explode if it hit a surface too hard ( I wasted 30 mins on the explosion sprite ). Check out the sprite I added so the rocket can actually shoot I also added breakable rocks that you can shoot down. Then I spent the next hour on making a teleport system so the rocket can move from one stage from to another. On my way to make this I broke the thrust system so I spent 30 mins trying to figure it out only for it to be the fault of a “-” sign instead of a “+” sign. I plan on working on new sprites for the character later
DEVLOG #2 The rocket🚀 can now reach space🌌! Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. As you can probably tell I added space to my game. I also : drew a bunch of janky looking stars🌠 and added them to the game. I also added 2 types of clouds , Normal and storm clouds . The storm clouds🌩️ make your rocket blow up if you crash into it and normal clouds☁️ are only for cosmetic purposes . I also fixed up a fix bugs👾 with the throttle system for the rocket. btw you can click on the underlined words to see the sprites
Made a new sprite for the main character
Drew and implemented a tileset for the main house of the game The tileset will be used to line the inside of the house so you can tell the wall apart from the void
DEVLOG #3 You can now TOUCH GRASS! not really tho. I added the inside of a house and outside portion to the game. The character can now walk out of his house and then walk over to the rocket launch station and then fly the rocket I also made a few sprites for decoration inside of the house
Remade the rocket sprite. Definitely the best artwork of my life. I will happily take any advice you guys have.
Made the final sprite for the rocket launch site! Usually I get the artwork for my game done by teammates. But since I dont have any teammates this time I decided to start learning pixel art myself! Since I’m just starting now even the simple things take me quite a long time. The entire time logged here was spent working on this one sprite ( This doesn’t include the time spent on the rocket btw)
Devlog #4 The player can now board upon the rocket! Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. And now the two parts of the game are finally connected. Now the player can walk out of his house , then go to the launch site and board on the rocket. I did run into a bunch of problems when trying to implement this. At first I was trying to do all the work on the boarder object but then I realized it would be much easier if I just did that in the player instead. So it works now.
Devlog #5 I Started work on some Juicy juicy lore. Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship.( This may be subject to change ) I’m not gonna spoil any of the lore here but just know that I did work on it. I also remade the main player sprite ( This time lore accurate ) and also worked on a few bugs
DevLog #6 Decided to select a style / palette for my game. Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. Took me a bit of time to find a concrete palette for my game. And after a while I found a good palette. Then I decide to re-remake the character . Also I decided to make the artstyle for the game low-res
Devlog #7 Worked on a bunch of stuff in the logged time. Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. The most notable ones would be : New Tileset to match the palette A bunch of other remade sprites (the bed and the sofa) Started Work on UI Drew the Title sprite and quite a bit more. I have been busy with school lately so the devlog frequency has dropped D:
DevLog #8 The game now has a Main Menu!! Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. This may not feel like much but with this I have laid all the groundwork needed for the rest of the UI . Now I can complete all the UI stuff in no time. I also lwk need to touch up on the sprites
Devlog #9 I worked on a pause menu and bunch of other UI stuff. Im making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. Adding a pause menu is quite a easy task and should not have taken this long. But alas I ran into a bug that took me 30 mins to solve. And the worst part is that fact that it was because of a misplaced “!” symbol. I also re worked on some of the sprites to add some small tweaks. Well the pause menu is still lackluster but I will expand upon it later. Also there is a bug still in the game that makes it so you cant close out of the menu.
DevLog #10 I spent a ton of time re writing the past devlogs to make them more voter friendly. I’m making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. I basically went back and re-did all my devlogs and added the new markdown formatting stuff I learnt thanks to a hint from @tongyu . You can see the before and after <–– Here I also plan on working on my repo today but I have school in an hour now so I cant do that now :(
Devlog #11 You can now play the game yourself🎉!! I’m making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. I did a bunch of stuff in the logged time and the most notable one of the bunch is that i finally made a itch page . i also worked on a few other stuff such as: Made a animation of the player getting in bed ( have’nt implemented it yet tho ) -Work on fixing the bugs that come with making a executable for you game. -Also fix some ui related bugs Please check out the game
DevLog #12 It actually took me this long to make the player take a nap . I’m making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. I spent this whole time figuring out how to make the player animate when laying down and animate again when getting out of bed. It actually took me 3 different approach to finally find one that works, and even after that when I exported the game to itch for some reason it stops working. It works perfectly fine in the windows build though. I plan on working on fixing this things that happen only on itch tmrw.
Devlog #13 WE ARE SO BACK!! I’m making a game where you work your way up the corporate ladder to finally fulfill your dream of piloting a space ship. for the past week I have been really busy with school and stuff so I could really work much or at all . So, I have’nt worked on the game for an entire week. But today I decided to change that. So cus Im coming back after a bit of time i decided to not do to much work. So all the things I did today was make a car sprite.
i worked on rearranging my files inside the game. Not worth a full devlog
tried to fix the issues with the html5 export( failed miserably )
DEVLOG 14 After a long long time IM FINALLY BACK Basically I had a exam for the whole month and now its finally over. That being said coming back after a long time, I realize that there are some things I really need to change about the game. First of all Im changing what this game is about This is no longer about some corporate ladder bs Im just gonna make a arcade simulator type thing. im gonna make the scope of the game smaller . I realize i dont have much time rn so i will try to work daily but in small amounts! Also I finished some work today. Like finally fixing the HTML issue . Turns out instead of fixing it I just needed to not export to HTML. Also started work on a game over screen. That all for today!! also check out the Game
Devlog #15 I Finally made a proper plan for the game!! I was making a game where you do a bunch of stuff like climbing the corporate ladder and shi but now i changed my mind I have finally made a proper game plan for myself to follow so i can make the game more easily. Basically I used a planning software named milanote to properly plan out all my stuff. These are what I have made the plan for now: IDEAS Make a day system where every day has a set amount of time you earn money by destroying asteroids you upgrade the rocket so you can break more asteroids faster As more days pass increase the difficulty of the game. Make it so the character has to do spend money to in his house for stuff like water bill, food bill, electricity which gives him nerfs if he doesn’t buy these. GET RID OF ANY VISIBLE CHARACTER make it feel kinda like a visual novel type shi when the rocket runs out of health the day ends early and you are fined. GAMEPLAY LOOP(INTENDED) Player wakes up at home goes outside takes a car to go to the rocket launch site transfer to the rocket launch screen(the upgrades can be accessed from here) flys the rocket earns money by breaking asteroids (Bigger asteroid pay more and are harder to break) when time ends he is returned home he decides whether he wants to pay his bills or not sleeps and repeat game ends when he maxs out the rocket also make sure to check out the current state of the game
DevLog #16 Finally doing some real stuff again! I making a game where you collect money by cleaning up space junk and use that money to upgrade your rocket This day wasn’t that productive because I had school for like 9 hours of the day. But I still manged to add some stuff I basically added a money system in to the game and made the HUD elements. For now you can only see how much money you have and not earn any. I ran into bug( not a bug just a coding mistake) which drove me nuts. Basically I was drawing the HUD on the top left side of the room instead of the screen. It took me a while to figure out. But alas I’m out of time so I cant fix it today D:
Devlog #17 Money works and I got rid of the character I making a game where you collect money by cleaning up space junk and use that money to upgrade your rocket Money system I fixed the bug with the money counter. Now your money is properly shown. It also goes up when you break asteroids, so you can earn money . Point and click system I also started work on the click and move system . All the things I need to make for it are complete but I just need to implement them everywhere now. life update Im still quite busy with my studies so I have a bit less time to work on the game. Thats why development is slowing down.
DevLog #18 Well this is a long one. I making a game where you collect money by cleaning up space junk and use that money to upgrade your rocket Well, I did a lot of stuff today. Finished Implementing click to move everywhere Made it so the sprites are highLighted when you hover you mouse over them. This took me a lot of time to figure out -# I used chatgpt for a hint during this part. I worked on a sprite for the research lab where you buy upgrades for you rocket This took me like almost the whole hour. Made the basics for the shop menu. I just need to draw a few buttons for the upgrades and it will be done. I used up a lot of the time I was supposed to be studying today to work so im lwk cooked.
DevLog #19 Productivity just sky-rocketed(Pun intended) I making a game where you collect money by cleaning up space junk and use that money to upgrade your rocket I did a real lot of stuff today . Finished the new shop menu and its fully working Started work on the health system for the rocket and realized the many things i need to work on I have made the rocket upgradable. Now the logged time includes the pain from the clock sprite but that is a story for the next log
DevLog #20 PAINLOG #1 Repetition is the worst form of torture. (Also I hate myself) Even if every single one of my trillions of cells had the word “ Pain ” written on them 100 times, It wouldn’t even come close to representing the sheer amount of pain I had to go throw to to finish this sprite. I know there was better ways to do this then to spend nearly 2 hours drawing 180 frames by hand, but I was the one who brought this upon myself. I have no one to blame but me. I hope the pain ends now.
DevLog #21 Random miscellaneous stuff I also threw out the timer sprite Made it so new rocks spawn when old ones are broken. Also made a Fuel meter sprite to use instead of the timer. Made the code for the fuel meter as a timer work.( It was a bunch of hard math.) And of course I had to spend like 1 whole hour debugging all this. Check out the [game](Space Janitors by Bawad2 ) I updated it in itch again.
DevLog #22 Fixed up my repo and also fixed a fatal bug within my repo I basically had a bug which made me unable to push to origin. I ended up resorting to ai to help me fix this bug. But in the end even the ai failed but the things I learned for the ai ended up helping me fixing it myself. I also rewrote the Readme. And sent new version of the game to itch.
DevLog 23 Iv been real busy lately This devlog is boil down of maybe like a week or so of work. I have been so busy that there wasnt a single day this week that I worked before 12AM. Anyways some of the stuff that I made in this logged time includes: A functional game over screen. yep thats it. It was really hard to make tho. I had to figure out a bunch of stuff such as how to make the stats show in the UI layer and a bunch of other stuff I hope I wont be as busy as this anymore
not much really i just studied GML for a while and also worked on a bunch of UI stuff
did some final work on the game and decided to give up and just ship it. Made some upgrades to the main menu
I fixed the things i was told to fix :D
Ships:
This is the first project I will ship for Hackclub. It was originally supposed to be shipped after i fully finished it. But slowly i started losing attachment to the project and now i dont want to work on it anymore. So, since it has a working loop for gameplay already im gonna ship it here. That game has a playable demo in itch at https://bawad2.itch.io/space-janitors Also in the repo there is a file called “Hourly logs” in that file I have been writing down what i was working on what my plan is and what my thought process is from day one, I think it will be a interesting thing for you to check out. I hope you find my 53 hours interesting at the very least....
|
1793152441.6150627
|
1793238841.6150627
|
|
69972
|
Orbit Survivor by @Ankit_7 | Stardance
|
Ankit_7
|
1
|
5.0
|
3
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T07:58:02Z", "hours": 5.0, "multiplier": 1.38, "payout": 3, "blessing": "neutral", "text": "I have make Aafast-paced sci-fi survival game where you pilot a lone spacecraft trapped in a collapsing star system. Use planetary gravity to slingshot through space, dodge deadly hazards, gather resources, and survive as long as possible. Learing about Godot was interesting. I am proud that i have been able to make a game. to test the project just simply go to the link that i have provided …or click on this link : https://ankit-7.itch.io/orbit-survivor", "repo": "https://github.com/Ankit-dev-7/Orbit__Survivor", "demo": "https://ankit-7.itch.io/orbit-survivor"}]...
|
[{"post_id": 80091, "ts": "202 [{"post_id": 80091, "ts": "2026-10-16T06:22:08Z", "hours": 4.6794, "text": "A fast-paced sci-fi survival game where you pilot a lone spacecraft trapped in a collapsing star system. Use planetary gravity to slingshot through space, dodge deadly hazards, gather resources, and survive as long as possible."}]...
|
Title: Orbit Survivor by @Ankit_7 | Stardance
Dev Title: Orbit Survivor by @Ankit_7 | Stardance
Devlogs:
A fast-paced sci-fi survival game where you pilot a lone spacecraft trapped in a collapsing star system. Use planetary gravity to slingshot through space, dodge deadly hazards, gather resources, and survive as long as possible.
Ships:
I have make Aafast-paced sci-fi survival game where you pilot a lone spacecraft trapped in a collapsing star system. Use planetary gravity to slingshot through space, dodge deadly hazards, gather resources, and survive as long as possible. Learing about Godot was interesting. I am proud that i have been able to make a game. to test the project just simply go to the link that i have provided …or click on this link : https://ankit-7.itch.io/orbit-survivor...
|
1793198858.9031653
|
1793285258.9031653
|
|
69355
|
INTRO by @wnxvra011 | Stardance
|
wnxvra011
|
0
|
2.13
|
0
|
[]
|
[{"post_id": 80088, "ts": "202 [{"post_id": 80088, "ts": "2026-10-16T06:12:29Z", "hours": 2.1333, "text": "hey!! guy’s this is the start btw,lets work hard"}]...
|
Title: INTRO by @wnxvra011 | Stardance
Devlogs:
h Title: INTRO by @wnxvra011 | Stardance
Devlogs:
hey!! guy’s this is the start btw,lets work hard...
|
1793130926.6826358
|
1793735726.6826358
|