|
15801
|
My very own WebOS by @mertozcan | Stardance
|
mertozcan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @mertozcan | Stardance
|
1793267682.7258122
|
1793872482.7258122
|
|
15802
|
Untitled by @Vya | Stardance
|
Vya
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Vya | Stardance
|
1793458549.4665365
|
1794063349.4665365
|
|
15803
|
My very own WebOS by @mmatei695 | Stardance
|
mmatei695
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @mmatei695 | Stardance
|
1793562646.09702
|
1794167446.09702
|
|
15804
|
Crunchyroll Multi Sub by @AndyNoob | Stardance
|
AndyNoob
|
1
|
46.9
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-22T22:15:32Z", "hours": 46.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Alright, it’s been a pretty long ride, so let me try to sum this up. - The idea for this extension sprang forth when I was trying to watch Frieren. For context, on Crunchyroll dubbed shows, there are two types of subtitles (for the most part, AD subs also exist but are very uncommon), closed caption and on screen translation subtitles: closed caption captures only character dialogues (generally), whereas the on screen translation subs translate signs and such on screen, typically using ASS subtitles (so fancy typesetting texts). - As it so turned out, you can’t pick both subtitles at the same time, which makes it really annoying for me to hear what the dialogues are saying if there are a lot of sound effects and BGM. So, I decided to look into how I can render both types of subtitles. - After a long course of development, and many hurdles (mostly related to Crunchyroll’s internal API being very not external developer friendly, I wonder why…), I was able to ship this little extension, which currently has about 200 or so active users? - -TLDR: Crunchyroll default subtitle system sucks so I made it better. Also if you don’t have Crunchyroll just watch this slightly outdated demo video: https://www.youtube.com/watch?v=C6fvmeJ0SoM", "repo": "https://github.com/AndyNoob/crunchyroll-dual-subs", "demo": "https://chromewebstore.google.com/detail/crunchyroll-dual-subs/mahcmkjllaabldhminilhldfiickigmi"}]...
|
[{"post_id": 79415, "ts": "202 [{"post_id": 79415, "ts": "2026-10-13T21:22:25Z", "hours": 0.9047, "text": "NEW FEATURE ALERT - Due to popular requests (one person on Github who opened an issue), I have added a spanking new feature to move subtitles up and down. LIFE CHANGING, I know. - Rahaha, more stuff incoming. Also the more I work on tis the more I realize my code sucks."}, {"post_id": 72422, "ts": "2026-09-22T22:05:42Z", "hours": 1.7556, "text": "Yoo - Kind of forgot to post this one. Basically, I just made it so the subtitles loaded from the original audio are marked as [original] , you can pick either or. - That’s about it. Yay"}, {"post_id": 39304, "ts": "2026-08-02T06:02:52Z", "hours": 9.5822, "text": "Been a minute. - Let’s see what I worked on… Mostly fixing minor issues. LIke subtitles being unmovable. And after that fixed it teleporting to Narnia when being moved. While I was doing that, I actually finished the subtitle editor in last devlog that I actually didn’t finish. - Aside from the UI, there’s also numerous minor bugs that sometimes causes the side bar to malfunction. And some that causes the extension to not load. All that good stuff. - The biggest update, however, is that the extension, using a very, very sneaky method, now loads additional subtitles for dubbed episodes. Typically, the majority of subtitles are made for the original audio language (Japanese mostly), and they are usually drag-and-drop ready for other audio languages. The idea is nothing new, but I had to brainstorm a new way of achieving that. - Essentially, the extension “mimics” the Crunchyroll player by making a stream request to the original audio language, and capturing the subtitles. All before the actual player starts its own stream request. This way, we don’t trigger the concurrent stream limit. Pretty neat! - Also added a on/off switch because you never know when this might break. Peak CSS right here haha."}, {"post_id": 33250, "ts": "2026-07-23T00:31:38Z", "hours": 7.1061, "text": "Worked on a bunch of stuff, mostly random issues: extension broken on Opera, extension randomly not updating subtitles, features of extension randomly bricking if you do a specific set of stuff (like adding and deleting masks really fast). - Other than that, I added a new subtitle style editor. I thought it was gonna be a 30min quick change. And then it ended up being like 4 hours long. The font selector is so damn annoying to add because there’s really only one way to do it, and that’s through Google. And of course it’s going to be a pain in the rear when it’s Google. - Whatever, at least it looks good."}, {"post_id": 29868, "ts": "2026-07-17T00:59:24Z", "hours": 3.2006, "text": "Fixed a bunnnnnch of issues as an aftermath of the last devlog… Took a minute but I finally released 0.12.0 (and immediately realized there’s more bugs. Also cleaned up the README and made it look real fancy."}, {"post_id": 28206, "ts": "2026-07-14T10:49:37Z", "hours": 7.2869, "text": "Ok, it’s been a minute, so let me go over the changes. (also i finally figured out you need to shift + enter to do new line bruh) Firstly, in preparation for the subtitle masking feature, I changed the extension popup to be a side bar/panel instead. This way, you can keep it open while you interact with the page. Secondly, I swapped the old “Reset subtitle position” button (which didn’t even work LMAO) with the new “Edit subtitle configuration” button. When you click it, a new section expands. This is where my other project (move-it) plays in! (see video). When you add a mask, it will block out subtitles using the CSS clip-path property, which is pretty neat! I also fixed a bunch of random issues along the way, so yay!"}, {"post_id": 25032, "ts": "2026-07-08T23:35:26Z", "hours": 6.48, "text": "Forgot to post devlogs ngl… Anyways, I fixed a bunch of weird bugs and compatibility issues with other extensions and userscripts. And then, I spent a few hours restyling the scoped options menu. Look at it moveee- Anyways, the moving part is made with a see through ::after element that is moved using the CSS transform: translateX element. I am able to move it programmatically by changing a CSS property/variable that translateX reads from. And then, I slapped a fancy transition on there. Works like a charm! (I had considered doing slide effect on the actual options, but that seemed like too much work haha.)"}, {"post_id": 10370, "ts": "2026-06-17T01:40:31Z", "hours": 3.7725, "text": "Working on the prerequisite parts of implementing a subtitle masking feature (hide subtitle base on defined areas). Also released 0.11.0 of the extension. Out on chrome already but firefox will probably be another month :sigh:"}, {"post_id": 8287, "ts": "2026-06-13T19:39:02Z", "hours": 0.7133, "text": "Nice… negative notes. The users’ll absolutely adore this."}, {"post_id": 7889, "ts": "2026-06-13T05:08:58Z", "hours": 3.8869, "text": "IT MOVESSS!! What’s happening here is that the extension loads JSON data from an unlisted Gist and reads the developer notes that I put down every 5 hours. Once it does, it populates the popup with those notes. The “1 new notes” thing isn’t actively updated yet, so I’ll implement that next. Just need to keep track of opened notes using their slug. Only took 4 hrs 🫠"}, {"post_id": 7250, "ts": "2026-06-12T02:53:56Z", "hours": 2.3333, "text": "Currently trying to add a dev note/changelog system by loading a gist that I have loaded on my system as a git repo and then symlinked as a file in my actual project. I actually did not know you could do that, learned it from Claude ha! Anyways, adding a new section to the popup menu, so I had to make some space. My solution: SMOOOOTH drop down. Note how the border-radius on the bottom of the overlay settings change from 0 to rounded at different speed depending on if the drop down is retracting vs. extending. CSS is a pain in the rear even when AI is helping…"}]...
|
Title: Crunchyroll Multi Sub by @AndyNoob | Starda Title: Crunchyroll Multi Sub by @AndyNoob | Stardance
Devlogs:
Currently trying to add a dev note/changelog system by loading a gist that I have loaded on my system as a git repo and then symlinked as a file in my actual project. I actually did not know you could do that, learned it from Claude ha! Anyways, adding a new section to the popup menu, so I had to make some space. My solution: SMOOOOTH drop down. Note how the border-radius on the bottom of the overlay settings change from 0 to rounded at different speed depending on if the drop down is retracting vs. extending. CSS is a pain in the rear even when AI is helping…
IT MOVESSS!! What’s happening here is that the extension loads JSON data from an unlisted Gist and reads the developer notes that I put down every 5 hours. Once it does, it populates the popup with those notes. The “1 new notes” thing isn’t actively updated yet, so I’ll implement that next. Just need to keep track of opened notes using their slug. Only took 4 hrs 🫠
Nice… negative notes. The users’ll absolutely adore this.
Working on the prerequisite parts of implementing a subtitle masking feature (hide subtitle base on defined areas). Also released 0.11.0 of the extension. Out on chrome already but firefox will probably be another month :sigh:
Forgot to post devlogs ngl… Anyways, I fixed a bunch of weird bugs and compatibility issues with other extensions and userscripts. And then, I spent a few hours restyling the scoped options menu. Look at it moveee- Anyways, the moving part is made with a see through ::after element that is moved using the CSS transform: translateX element. I am able to move it programmatically by changing a CSS property/variable that translateX reads from. And then, I slapped a fancy transition on there. Works like a charm! (I had considered doing slide effect on the actual options, but that seemed like too much work haha.)
Ok, it’s been a minute, so let me go over the changes. (also i finally figured out you need to shift + enter to do new line bruh) Firstly, in preparation for the subtitle masking feature, I changed the extension popup to be a side bar/panel instead. This way, you can keep it open while you interact with the page. Secondly, I swapped the old “Reset subtitle position” button (which didn’t even work LMAO) with the new “Edit subtitle configuration” button. When you click it, a new section expands. This is where my other project (move-it) plays in! (see video). When you add a mask, it will block out subtitles using the CSS clip-path property, which is pretty neat! I also fixed a bunch of random issues along the way, so yay!
Fixed a bunnnnnch of issues as an aftermath of the last devlog… Took a minute but I finally released 0.12.0 (and immediately realized there’s more bugs. Also cleaned up the README and made it look real fancy.
Worked on a bunch of stuff, mostly random issues: extension broken on Opera, extension randomly not updating subtitles, features of extension randomly bricking if you do a specific set of stuff (like adding and deleting masks really fast). - Other than that, I added a new subtitle style editor. I thought it was gonna be a 30min quick change. And then it ended up being like 4 hours long. The font selector is so damn annoying to add because there’s really only one way to do it, and that’s through Google. And of course it’s going to be a pain in the rear when it’s Google. - Whatever, at least it looks good.
Been a minute. - Let’s see what I worked on… Mostly fixing minor issues. LIke subtitles being unmovable. And after that fixed it teleporting to Narnia when being moved. While I was doing that, I actually finished the subtitle editor in last devlog that I actually didn’t finish. - Aside from the UI, there’s also numerous minor bugs that sometimes causes the side bar to malfunction. And some that causes the extension to not load. All that good stuff. - The biggest update, however, is that the extension, using a very, very sneaky method, now loads additional subtitles for dubbed episodes. Typically, the majority of subtitles are made for the original audio language (Japanese mostly), and they are usually drag-and-drop ready for other audio languages. The idea is nothing new, but I had to brainstorm a new way of achieving that. - Essentially, the extension “mimics” the Crunchyroll player by making a stream request to the original audio language, and capturing the subtitles. All before the actual player starts its own stream request. This way, we don’t trigger the concurrent stream limit. Pretty neat! - Also added a on/off switch because you never know when this might break. Peak CSS right here haha.
Yoo - Kind of forgot to post this one. Basically, I just made it so the subtitles loaded from the original audio are marked as [original] , you can pick either or. - That’s about it. Yay
NEW FEATURE ALERT - Due to popular requests (one person on Github who opened an issue), I have added a spanking new feature to move subtitles up and down. LIFE CHANGING, I know. - Rahaha, more stuff incoming. Also the more I work on tis the more I realize my code sucks.
Ships:
Alright, it’s been a pretty long ride, so let me try to sum this up. - The idea for this extension sprang forth when I was trying to watch Frieren. For context, on Crunchyroll dubbed shows, there are two types of subtitles (for the most part, AD subs also exist but are very uncommon), closed caption and on screen translation subtitles: closed caption captures only character dialogues (generally), whereas the on screen translation subs translate signs and such on screen, typically using ASS subtitles (so fancy typesetting texts). - As it so turned out, you can’t pick both subtitles at the same time, which makes it really annoying for me to hear what the dialogues are saying if there are a lot of sound effects and BGM. So, I decided to look into how I can render both types of subtitles. - After a long course of development, and many hurdles (mostly related to Crunchyroll’s internal API being very not external developer friendly, I wonder why…), I was able to ship this little extension, which currently has about 200 or so active users? - -TLDR: Crunchyroll default subtitle system sucks so I made it better. Also if you don’t have Crunchyroll just watch this slightly outdated demo video: https://www.youtube.com/watch?v=C6fvmeJ0SoM...
|
1793674059.6269627
|
1793760459.6269627
|
|
15805
|
Test game by @noah337 | Stardance
|
noah337
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Test game by @noah337 | Stardance
|
1793559300.5500007
|
1794164100.5500007
|
|
15806
|
Minecraft by @Allen | Stardance
|
Allen
|
0
|
5.0
|
0
|
[]
|
[{"post_id": 7130, "ts": "2026 [{"post_id": 7130, "ts": "2026-06-11T22:15:43Z", "hours": 5.0, "text": "I tried to make the game as much like the Minecraft-like browser survival game: added chunk saving/loading, smoother chunk performance, pointer-lock mouse controls, respawn/coords/HUD, health/hunger/armor, mobs with damage/health, food/eating, mining/placing, crafting recipes, chests, furnaces, beds/spawn, water/lava, more blocks/items/tools/armor, better textures and inventory icons, improved terrain generation with biomes, rivers, beaches, cliffs, mountains, caves, ores, trees, cactus/desert features, and fixed bugs like full starting inventory, chunks deloading, laggy loading, bad deployment config, and underwater terrain being hidden."}]...
|
Title: Minecraft by @Allen | Stardance
Devlogs:
I Title: Minecraft by @Allen | Stardance
Devlogs:
I tried to make the game as much like the Minecraft-like browser survival game: added chunk saving/loading, smoother chunk performance, pointer-lock mouse controls, respawn/coords/HUD, health/hunger/armor, mobs with damage/health, food/eating, mining/placing, crafting recipes, chests, furnaces, beds/spawn, water/lava, more blocks/items/tools/armor, better textures and inventory icons, improved terrain generation with biomes, rivers, beaches, cliffs, mountains, caves, ores, trees, cactus/desert features, and fixed bugs like full starting inventory, chunks deloading, laggy loading, bad deployment config, and underwater terrain being hidden....
|
1792914797.928518
|
1793778797.928518
|
|
15807
|
My very own WebOS by @AmeliaMarcoux | Stardance
|
AmeliaMarcoux
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @AmeliaMarcoux | Stard Title: My very own WebOS by @AmeliaMarcoux | Stardance...
|
1793508673.815247
|
1794113473.815247
|
|
15808
|
Frictionless by @lilabrownie126 | Stardance
|
lilabrownie126
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @lilabrownie126 | Stardance
|
1793570188.5927982
|
1794174988.5927982
|
|
15809
|
Website by @clara_123_satter | Stardance
|
clara_123_satter
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-08T02:51:57Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is the homepage for my website. Obviously, its not finished, but I am pretty happy with the way it looks so far. I was honestly suprised by how easy it was to learn css, but I did have some trouble with the buttons. In the future, I would like to add to the blog sections and add animations to the buttons when they are pressed", "repo": "https://github.com/QwertyShmerty-8/website", "demo": "https://qwertyshmerty-8.github.io/website/"}]...
|
[{"post_id": 24495, "ts": "202 [{"post_id": 24495, "ts": "2026-07-08T02:17:30Z", "hours": 2.1511, "text": "Just finished the homepage for my website! I also created separate pages for my blog, projects and about me using buttons. I also spent a significant amount of time planning and creating graphics"}, {"post_id": 24193, "ts": "2026-07-07T16:32:05Z", "hours": 0.8728, "text": "I am currently trying to set up the homepage for my website. I decided to create a basic homepage that links to an about me, blog and personal projects page. My main focus is to make a visually appealing website that showcases my personality. My first focus was setting up the welcome banner. I am using the a star is born font, and I copy pasted screenshots of the letters I needed into canva to create a transparent png of the website banner."}]...
|
Title: Website by @clara_123_satter | Stardance
D Title: Website by @clara_123_satter | Stardance
Devlogs:
I am currently trying to set up the homepage for my website. I decided to create a basic homepage that links to an about me, blog and personal projects page. My main focus is to make a visually appealing website that showcases my personality. My first focus was setting up the welcome banner. I am using the a star is born font, and I copy pasted screenshots of the letters I needed into canva to create a transparent png of the website banner.
Just finished the homepage for my website! I also created separate pages for my blog, projects and about me using buttons. I also spent a significant amount of time planning and creating graphics
Ships:
This is the homepage for my website. Obviously, its not finished, but I am pretty happy with the way it looks so far. I was honestly suprised by how easy it was to learn css, but I did have some trouble with the buttons. In the future, I would like to add to the blog sections and add animations to the buttons when they are pressed...
|
1793728451.863183
|
1793814851.863183
|
|
15810
|
Building A Macropad !! by @ruhani_bhagdev | Starda Building A Macropad !! by @ruhani_bhagdev | Stardance...
|
ruhani_bhagdev
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Building A Macropad !! by @ruhani_bhagdev | Title: Building A Macropad !! by @ruhani_bhagdev | Stardance...
|
1793479867.3781157
|
1794084667.3781157
|
|
15811
|
Wind by @z1 | Stardance
|
z1
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Wind by @z1 | Stardance
|
1793426165.073269
|
1794030965.073269
|
|
15812
|
My awesome macropad! by @cheesecat | Stardance
|
cheesecat
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @cheesecat | Starda Title: My awesome macropad! by @cheesecat | Stardance...
|
1793407642.3418956
|
1794012442.3418956
|
|
15813
|
Blended wing body drome by @pho | Stardance
|
pho
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Blended wing body drome by @pho | Stardance
|
1793325308.1809006
|
1793930108.1809006
|
|
15814
|
Frictionless by @etaiami09-cmd | Stardance
|
etaiami09-cmd
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @etaiami09-cmd | Stardance
|
1793202778.4756336
|
1793807578.4756336
|
|
15815
|
Labconnect by @annieappiah7878 | Stardance
|
annieappiah7878
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Labconnect by @annieappiah7878 | Stardance
|
1793544812.4738858
|
1794149612.4738858
|
|
15816
|
My first slack bot! by @Atotom | Stardance
|
Atotom
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Atotom | Stardance
|
1793188066.415248
|
1793792866.415248
|
|
15817
|
My very own WebOS by @Fatima-Latif | Stardance
|
Fatima-Latif
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @Fatima-Latif | Starda Title: My very own WebOS by @Fatima-Latif | Stardance...
|
1793249346.2745435
|
1793854146.2745435
|
|
15818
|
PSim - Particle Simulator by @etaiami09-cmd | Star PSim - Particle Simulator by @etaiami09-cmd | Stardance...
|
etaiami09-cmd
|
1
|
64.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T21:25:14Z", "hours": 64.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "PSimUltimate Is Ready! I made a particle simulator desktop application in C++ with heavy extension support. Overview PSimUltimate models real physics, but also allows you to inject your own behavior. Using a simple development API that even someone with no C++ experience can understand, you can create, compile and load your own custom modules to the simulator and watch the behavior you’ve coded in action. PSim even ships with 2 of these modules built into the binary, and 3 more modules that you can load dynamically. PSimUltimate also comes with a very simple UI, one that anyone could be comfortable with within minutes. How it works PSimUltimate has documentation for creating your own modules, and compiling them is very simple with a few commands. You can then load the modules, and PSim knows how to run your module and follow its physics. PSimUltimate is written in modern C++, using Raylib and Dear ImGui to provide a clean UI and good support in multiple platforms. While it only ships a Windows binary, you can easily follow the instructions in README.md to compile in other platforms. How to try it You can download the PSimUltimate installation wizard in this page . For more instructions and information, including information on support for other platforms, check out README.md in the source code. Challenges I’ve faced This project took a lot of effort to complete. It is the largest single solo project I have worked on since I started programming, and it included a lot of technical software design and infrastructure that I had to familiarize myself with, like dynamic libraries and using and altering 3rd party libraries (I altered portable file dialogs and Dear ImGui to suit my needs). I also had to deal with moving to a new computer, and then when that computer broke down due to a faulty motherboard, I had to move back to my old computer. I also started a full-time internship at a tech company. All that, coupled with some massive life changes, made it much harder to work on this project. But I enjoyed making it nonetheless, and I’m proud to show off what I’ve created.", "repo": "https://github.com/etaiami09-cmd/PSimUltimate", "demo": "https://github.com/etaiami09-cmd/PSimUltimate/releases/tag/v1.0"}]...
|
[{"post_id": 65606, "ts": "202 [{"post_id": 65606, "ts": "2026-09-10T20:55:45Z", "hours": 7.9922, "text": "Devlog #13 - Time To Ship! PSimUltimate is finally ready to ship. I have put a lot of effort into this project, and I feel genuinely proud of my what I have achieved. While working on this project I have gotten a new computer, lost that computer due to a faulty motherboard, got an internship at a tech company, and started working there full time. Suffice to say, I haven’t had much time to work on PSim in the last month. But I did. I spent time polishing what I have already created and now I feel content with my product. What I’ve done since the last devlog PSimUltimate now has a logo, designed by me. I have also run PSim on WSL and fixed various issues that only appeared on Linux. There is now a way to use your mouse to set the next particle’s position There is now a menu for editing particle data - you can delete a particle and change its position, velocity, mass, etc. PSim is now ready for release. I’m happy and proud to present it and show what I’ve done, and I hope other people receive it well. Thank you all for your support!"}, {"post_id": 48457, "ts": "2026-08-16T20:12:07Z", "hours": 4.1594, "text": "Half Devlog - Short Update: Sorry for not posting for a while. My computer broke and I’m waiting for the repair. Hopefully I’ll be back next week! Thank you for your patience."}, {"post_id": 32968, "ts": "2026-07-22T13:52:27Z", "hours": 8.5469, "text": "Devlog #12 - Solid, Boring Progress I’ve spent the last few days making regular feature updates to PSim. Here are the highlights: 1. Unload Modules Until now, if a user loaded a module and didn’t want it anymore, he would have to reopen the app. Additionally, there was no way to unload the built-in modules. I added an options tooltip in the module order GUI that allows the user to unload a module and everything it has registered. 2. Confirm Action Menu If a user is about to do an action which might lead to loss of data (close the window, override a save file), we want to confirm they know about the potential consequences and accept it. For this, I created an interface for creating a blocking modal that forces the user to either confirm an action or cancel it. 3. Graphics Handlers Behavior Improved The default should obviously be for graphics callbacks to have what they draw to the screen be projected into the actual intended buffer - that is, not anywhere in the top menu bar or the left-hand control panel. This is also already where particles are drawn, so a particle at 0, 0 is drawn in the top-left corner where the top menu bar and control panel intersect. This math had to be applied to every single thing drawn by a graphics callback, and I decided to fix it by calling graphics callbacks while in a raylib 2D mode that offsets everything so that 0, 0 is where a particle at 0,0 is drawn. 4. DPI Scaling I switched to a new laptop this week, and went from a 14 Inch 1080p screen to a 14 Inch 1440p screen. Suddenly, the menu became much smaller, because the program was drawing by pixel instead of by the system’s default scaling (which, on my new laptop, is 200%). I fixed this by making Raylib scale everything by the user’s system DPI. 5. Module Internal Serialization If a module has any internal state that should be preserved when a save file is written, it can now register a callback that returns a std::string and a callback that accepts one, and those can be used to serialize and deserialize its internal state. 6. Extended Module API Documentation I’ve now written documentation for everything but the feature discussed in point 5. 7. New Particle Target I’ve added a cross target placed in the position where a new particle would be placed according to the Position buffer, to ease on visualizing the new particle. This cross is customizeable in the settings menu and you can change width, length and color."}, {"post_id": 27577, "ts": "2026-07-13T09:02:19Z", "hours": 5.8525, "text": "Devlog #11 - Adding A Settings Page, A Config System, And More Module API Yesterday I wrote about my commitment to making PSim an actual, usable desktop application that doesn’t feel limiting to the user. What I did yesterday was create an error notification system, so if something goes wrong the user can understand why and code has a standard philosophy to handle issues. Today, I put my focus on improving the user experience by adding a settings page to PSim. The Layout Personally, when I think of a settings page in a desktop application, I usually imagine a blocking pop-up (as in, a subwindow inside the application window that while opened, does not let you touch anything outside of it) with a few tabs for different categories of settings. ImGui actually has great support for this, with OpenPopup to create one. the smaller, left-side portion of the settings page is a tab-selection area, and the right-side portion is the tab which is selected. There are 4 tabs: General Simulation Modules - modules can register custom settings About - basically just the full text of the MIT License + a link to the project’s GitHub page The Config System Personally, when I change a setting on a desktop application, I generally expect that change to still be in effect when I close and reopen it. To do this, PSim needs to get to the target platform’s app data folder, create a folder for itself if one doesn’t already exist, and then save whatever information it needs there. Now, this is obviously annoying to have to re-write every time you want to save something as simple as what FPS the user wants, so I wrote a template system to save and access binary settings files on the fly. I now had a way to make it so arbitrary settings stay the same every time I open the app. Now, I need to make it so modules have the same privilege. I created 3 new functions in the module API, writeConfig , readConfig , and registerSwitch . Each of these does as the name implies, and it allows you to add on-off switches (support for more will come later) and read/write configs to disk. Conclusion It may have taken 6 hours of work, but I managed to create a fully-functional settings UI with module support to my first desktop application. This is an important piece of architechture and makes it much easier to add more features in the future and expand the app into something I can be very proud of. Thank you very much for reading! Please enjoy this proof-of-concept video of me changing settings and reopening the app."}, {"post_id": 27058, "ts": "2026-07-12T08:08:01Z", "hours": 3.7278, "text": "Devlog #10 - Don’t Hate The User One of the most important unwritten (though I’m sure it is written somewhere) rules of writing good software is responsible error handling. I’m writing a desktop application, and personally, when I’m using a desktop application, I don’t like it when it suddenly crashes with no useful error message. This is especially possible in a desktop application written in C++, where irresponsible coding practices can lead to segfaults and other crashes without so much as a Java-style “NullPointerException”. It would be incredibly frustrating for the user to lose progress and not even know why. Another potentially frustrutaing situation is when the program fails silently. It doesn’t quite crash, but when you ask a program to do something and it just doesn’t do it, that can be frustrating. When a program can’t satisfy an action the user wants it to make, it should make it as clear as possible that it’s aware of its failure, and attempt to clarify what went wrong. What I’ve Been Doing Until Now Up until now I have handled runtime errors by… well… not handling them. I wrote my application under the assumption that everything works smoothly, every module loaded by the user exports the correct signature, every file opened by the user is well-formed, and every file the user wants to write to has the necessary permissions. If any of this went wrong, the program entered undefined behavior. Most likely, it will crash. My Solution Whenever the user requests an action by the program, for example, trying to open a saved simulation state JSON, the program goes through the following steps: Make sure the file is actually opened Make sure the file is correctly-formed JSON syntax Make sure the actual data in the file aligns with PSimUltimate’s requirements and constraints Actually deserialize the file If any of these goes wrong, the deserialization process immidiately ends and an error notification is pushed to the bottom-right corner of the screen. If multiple things are wrong about the data in the file, only the first thing in the deserialization order is written. There can be up to 3 error notifications displayed at once, with any more notifications being queued for when those are closed by the user . This solves the issue of responsible, user-friendly error handling, and is an important piece of infrastructure for a usable desktop application."}, {"post_id": 25930, "ts": "2026-07-10T13:04:03Z", "hours": 1.7719, "text": "Devlog #9 - Expanding The Module Developer API Before I begin this devlog, I would like to apologize for being inactive over the past week. I have had quite a busy week, and I did not have much of an opportunity to work on PSimUltimate unfortunately. What I Have Been Working On I’ve been putting more attention to the module API, modules are the most important part of PSim, and their API should be more advanced than the very basic one that currently exists. I’ve split the API into 5 different sections: Physics Behavior - callbacks into force, velocity, and positions of particles User Input - adding new keyboard shortcuts, reading mouse positions, reading which keys are being pressed Graphical Behavior - being able to draw stuff on the screen GUI - adding buttons, settings pages, descriptions, and more for specific modules. Other Modules - modules should be able to register dependencies and force certain modules to be either lower or higher than them on the callback order. I have been hard at work (when I can) on designing and implementing these needs. So far I have made some progress, but there is still much to do and research, and I’m sorry it’s not so juicy for a week’s worth of progress. Either way, thank you for reading, attached is an example of custom buttons that can be registered by modules in the top bar, and please keep following the project for more updates."}, {"post_id": 19922, "ts": "2026-07-01T11:10:57Z", "hours": 3.965, "text": "Devlog #8 - I Need Your Help This devlog is not so focused on what I’ve been doing since the last one, but what I have been doing is pretty cool, so I’ll go over it: PSim uses Dear ImGui as the backend for its GUI. Up until now, the font size in the GUI has been way too small (13px) and the GUI sidebar could not be resized in any way. I had to make it so resizing is possible and the font is more readable, because I want the app to be properly useable. The first thing I did switch fonts from Dear ImGui’s default non-scalable font to Dear ImGui’s default scalable version, ProggyForever. This took a few minutes but the big challenge was getting resizing to do exactly what I wanted. Despite Dear ImGui usually having exactly the correct amount of features, there is no option to make resizing only possible from one side or disable the completely free bottom-right resize grip. I had to go directly into Dear ImGui’s source code and manually disable those things myself, which was a first for me. What I Need Help With Right now whenever I try to do anything I realize that I don’t actually have a good feel for what’s missing and what needs improvement. If anyone reading this could spare some time of their day to install my application and play around with it, maybe write a module. I have added proper documentation for modules to make the whole process much easier, so hopefully someone will be able to help me find issues and missing features. You can get the release on GitHub . Thank you for reading and thank you for helping out!"}, {"post_id": 17653, "ts": "2026-06-28T15:14:57Z", "hours": 1.375, "text": "Devlog #7 - Steady Progress Is Not Interesting Sorry for the low logged time, I’ve actually been working for several hours but I forgot to install wakatime after switching to CLion. What I’ve Been Working On One of the most important things when working with multiple modules that work on a callback-based system is the ability to reorder modules so some callbacks get called before others. Imagine this: You have a module foo which clamps all particles to the window border so they can never escape the boundaries of the window. You also have module bar which increments the X position of each particle by 3, each frame. Say foo gets registered after bar , particles will get clamped to the border AND THEN move 3 pixels, breaking the behavior both module authors likely intended. The Solution Create a GUI which allows the user to reorder modules by, so a module placed after another module gets called last. Implementation Challenges I had to learn how std::list works (a linked list was the obvious choice for this use case), and let me tell you, it is by far one of the worst STL containers I’ve had to work with, and anyone who writes C++ code knows that MEANS somethimg. Conclusion Again, not much to write about today, but steady progress just isn’t all that interesting. Thanks for reading!"}, {"post_id": 14586, "ts": "2026-06-23T19:08:32Z", "hours": 1.7331, "text": "Mini Devlog - How Writing Unit Tests Made Me Fight C++ For An Hour Whenever I spend some time fighting with C++ instead of actually being productive, I feel like I at least need to get a devlog out of it, so here goes. Background I’ve been writing unit tests for my particle simulator, and one thing I’ve noticed is that I have no code to protect global state when a single module is registered more than once, which leads to weird and unintended behavior. My solution is lazy: silent failure. If a module already exists when addModule(const std::string& name) is called through the module interface function registerModule(const std::string& name) (You can read about why these are separated in an earlier blog post, it’s very cool!), the function just doesn’t register it again. Simple enough, but I wanted to implement it in “correct” C++. The Implementation (Where Things Went Wrong) What I did was create a function in module.cpp with internal linkage called getModuleByName which returns a std::optional<Module&> . Well, apparently for the C++ standard that amounts to heresy, since up until C++26 the committee never managed to agree on how to handle std::optional s that contain references. Well, I thought, I am already compiling with -std=c++26 in my project, so this should work. But it didn’t. I needed an updated libc++ implementation, which I managed to get through MinGW. I spent 30 more minutes fighting with CMake as it insisted to link against MSVC’s headers, but eventually I did manage to get it to compile. A normal programmer would have just used std::optional<Module*> but I am definitely not normal. Was it worth it? probably not. Especially when it’s all for a function which only has internal linkage and is only used in one place. But I like to think that writing code I’m comfortable with will help maintain the codebase in the future."}, {"post_id": 14286, "ts": "2026-06-23T10:40:41Z", "hours": 2.7964, "text": "Devlog #6 - Adding Testing To My Particle Simulator I’ve been working on adding unit testing to my project. It was important for me to add unit tests for several reasons: I have never written unit tests in C++, so it’s a good learning experience I genuinely want this project to end up as a polished desktop application, and that’s not really possible without following best practices. Tests are important. Parts of my application are already extremely vulnerable to bugs It’s easier to catch bugs through unit tests than through actual use of the application Catch2 as the framework I chose Catch2 as my framework because it seemed easy to work with and not too verbose. Current sensitive parts of the application Position , Velocity , and Force are all independent wrappers around Vec2<float> . It is extremely important to me that these have proper arithmetic, but are not implicitly convertible, since that is almost definitely not intended behavior. This is why I wrote almost 200 lines of code’s worth of unit tests to make sure that the typing system is strong and acts the way I want it to. Catching bugs easily through unit testing While a user will most likely eventually stumble upon any bug worth fixing, I don’t really have any users yet! I would like to ship an app that isn’t obviously broken, and to do that, I need unit tests that stress the logic of my program to make sure it can survive users messing with it. Current progress on writing tests I’ve written fairly extensive tests to enforce the Vec2<float> variants type system, and to enforce particles working and ticking correctly and interacting with modules correctly. I still have many more tests to write, and I expect to spend the next couple of hours doing that. Thank you for reading!"}, {"post_id": 11527, "ts": "2026-06-18T20:30:02Z", "hours": 1.4006, "text": "Mini Devlog - Just Spent An Hour Fighting With The C++ Standard Library + Live Showcase! I just finished spending 8 hours on a massive refactor and new features, so I thought it would be nice to sit for a little while and play around with the program and fix some errors, and generally try to make the code a little safer. I’ve spent the past hour looking at various crashes i’ve had and tryint to pinpoint and debug them, and pretty much every single one of them came down to the fact that I keep forgetting that std::vector<T>::resize(n) does not have the same functionality as std::vector<T>::clear(); std::vector<T>::reserve(n) . This should be a very simple concept, and yet it’s apperently riddled my program with bugs. That’s all solved now, and you can try release 0.1.4 here with an example boxing module! Happy programming! Also, here’s a live demo of the program in action. The recording doesn’t capture the file dialog opening up, but you can tell it’s there before the particles spawn and when I load in the module."}, {"post_id": 11357, "ts": "2026-06-18T15:58:33Z", "hours": 8.3031, "text": "Devlog #5 - I spent 8 hours overengineering my desktop application to avoid spaghetti code A few days ago I wrote about how my small desktop app was already suffering from spaghetti code due to interaction between its modules. I had originally set out to create an application with just 3 modes: Gravity, Electrostatic movement, and chemical bonds. But this has a big problem: The scope is small, making development uninteresting and the actual application pointless to users. The Change In order to solve my spaghetti code problem, I came up with a solution: Instead of implementing 3 different modes, implement an interface that allows you to add as many modes as you want. The Process My first step was to decide what the public API should be for creating a new module. I settled for this: What the module author needs The module author may want to intercept a few different things: Change Force, Velocity and Position values every frame when they are being evaluated Add an attribute for a particle (like how a particle needs a charge in electrostatics) Add a universal physical constant (like Coulomb’s constant or the gravitational constant) Render something on top of the application What I need to do I built a module system to register all of the above, plus a psim_module_api.hpp header for the module author. It defines a C-ABI entry point that calls a C++ init function the author provides. I was almost done with the entire process when I discovered that Windows apparently doesn’t properly support the ability of DLLs to access functions in the main program by linking against them at compile time, and had to rewrite a large chunk from scratch. All the user has to do is include the header and define a void initializePSimModule() which is forward-declared by the header and called by the entry point after populating the function pointer table. Then we just use user-friendly functions to register anything the module might need. An example module is shown in the screenshots, along with its source code. This module creates constants for boundaries that particles cannot cross, effectively boxing them in a rectangle. I rewrote the Gravity and Electric modules in the module system. They are part of the core application, so I’m not loading them dynamically every time, but they use the same API as dynamic extensions. This makes it essentially impossible to create spaghetti code around the different modes, and now all I have to do to load a new module into the program is call loadModule(const std::string& path) . The final flow is something like this: The module entry point is a function that receives a function pointer table to all the C-ABI functions that the module uses under the hood. It populates the module’s function pointer table (the one I added because of Windows) and then calls the main initialization function implemented by the module author. To put things in perspective, here is what happens when you register a constant: You call registerConstant(...) with a std::string and a std::function => they’re destructured into C-friendly structs => the module finds _regConstant(const char* module, size_t moduleLen, ..., PSIM_Constant_Change_Callback) in the pointer table and calls it => the main program restructures the C parameters back into C++ types => the main program calls the real registration function. And this is precisely the hard part: The module author can believe that he’s dealing with the same exact std::span<Particle> that is passed to him by the main program, but in reality that span was destructured into a Particle* and a size_t and was then restructured, all before his callback was even called. This took me 8 hours, and out of everything I’ve done with PSimUltimate for now, this has definitely been the most valuable learning experience. I learned how to expose C++ APIs while maintaining a stable C ABI backend. Very cool!"}, {"post_id": 9226, "ts": "2026-06-15T14:32:40Z", "hours": 3.5978, "text": "Devlog - 04 - Fast JSON Serialization And Deserialization I need a way to save the simulation’s state. My options were few: Create a custom binary format (pretty easy, but not readable) Create a custom text format (hard but readable) Use an existing JSON library and format state into a JSON (very easy, very readable) Option 3 is naturally the best one, so that’s the one I went with. I used nlohmann/json as my JSON library, and for now I have just gone with the native approach of manually looping through the particles to build an object tree and walking the object tree to deserialize files. Now, I know that technically this part of the application doesn’t really require any form of optimization, since even with 1,000 particles and O3 compiler optimizations this native approach takes a small enough time that there isn’t even one frame of overhead. But I still didn’t want to leave performance on the table for no reason. I started with a 10000 particle serialization benchmark. It originally took 100ms to serialize and write to disk with O3 optimizations. After a few changes, mainly first formatting the json object to a std::string and then piping it to a std::ofstream to reduce OS overhead, I quickly reached about 40ms for building an object tree and writing to disk. I got similar results without really adding any optimizations to the deserialization process. Now, this is definitely fast enough for the kind of application that PSimUltimate is, but it still seems slow. People manage to write gigabytes of JSON per second, why is my process so slow? Well, turns out the main reason is the fact that nlohmann/json is, well, pretty slow to build an object tree with. Every single item in the tree is a heap-allocated object, which means both malloc and free overhead and cache-unfriendliness. You can see in the benchmark that serializeState and deserializeState both take a couple milliseconds despite not doing anything but set up the work for the other functions, and this is because of the time it takes to malloc and free the object trees. Theoretically, there are ways to write faster nlohmann/json code that doesn’t rely on as many heap allocations, but it’s not really worth it for me to do spend time looking into it and designing it right now, so this is good enough for me for now."}, {"post_id": 9148, "ts": "2026-06-15T10:03:31Z", "hours": 0.3217, "text": "(Advice Welcome) Devlog - 03 - How to design extensible architechture for my particle simulator desktop application I tried making a simple refactor - when I was first experimenting with the code, Whenever electrostatics were disabled the vector of charges for each particle was reset. This is obviously not great behavior for when you want to be able to quickly toggle modes on and off, so I tried making it so toggling electrostatics simply switches whether the simulation notices them or not, and not whether the data exists. This took 4 different attempts at compilation and playing around before I arrived at the expected behavior - and all I was doing was just deleting some code! It became clear that even though my application is still tiny (under 1k lines of code) and even though I have only 2 modes (gravity and electrostatics), I already have spaghetti code. Now I need to do one thing: design a safe and extensible architechture for adding new types of forces. The first thing that needs to happen is deciding how each mode interacts with the particles. This is the easiest part: Each mode is told to calculate the force for which it is responsible for every particle, and those forces get added to an array of forces, and then the sum force for each particle is used to determine its new position. This alone means there will never be any meaningful spaghetti code. Now comes the hard part: deciding how modes should be declared and added to the application. There are two approaches: Create an interface for modes which is known at compile time. This will lead to better performance due to optimizations, faster startup times, and more control for me over how the application works. Create an interface for modes which is registered dynamically at startup, this approach allows for 3rd-party extensions in the form of dll files that are dropped into some folder in the install directory. This leads to slower startup times, less optimizations due to the need of a stable ABI, and an overall increase in architechture size. I don’t know what I should choose, but I would love to have someone’s input on which would be better for my project."}, {"post_id": 7542, "ts": "2026-06-12T16:19:21Z", "hours": 3.0608, "text": "Devlog - 02 - Before Shabbos Since the last blogpost I have been working on cleaning up the existing codebase, improving some APIs and laying down the groundwork for electrostatic movement. I spent over an hour splitting the GUI rendering process into multiple independent files that are each much smaller than the monolithic “graphical.cpp” from before, which allowed for a cleaner structure which enabled me to think about the code more cleanly and refactor it further. I created a generic Holder struct which runs some function when constructed (and can receive arguments for that function when constructed) and calls another function when it goes out of scope. This is useful in ImGui because very often you have stuff like ImGui::BeginGroup() which must be followed with ImGui::EndGroup() which can easily be forgotten and also leads to unclean and spaghetti code. Instead, All that needs to be done now is a declaration of a GroupHolder variable, and then ImGui::EndGroup() is automatically called when that variable goes out of scope. I moved a bunch of constants from graphical.cpp to a PSimImpl namespace which allows them to be accessed from anywhere without polluting the global namespace. Additionally, I spent some time laying down the groundwork for electrostatic movement, which includes a Force type, which is a strongly typed wrapper around Vec2. I need these to be strongly typed so Force cannot be accidentally converted to Position or Velocity, but I also wanted to be able to explicitly (or implicitly) convert a Vec2 to one of its wrappers. This took a while to get right and eventually lead to the line of code in the screenshot. One more thing: I noticed that currently this website has no way to actually find the GitHub page for other people’s projects, so here’s the link to mine: https://etaiami09-cmd/PSimUltimate Enjoy!"}, {"post_id": 6808, "ts": "2026-06-11T12:46:37Z", "hours": 4.9311, "text": "Devlog - 01 This project is a remake of my first C++ project, which was an electrostatic particle simulator. This time, I’m looking to do a bit more - the simulator will have multiple modes which can be switched on or off, and instead of trying to reinvent the wheel by making a GUI with raw SFML, I’m using ImGui and binding it to raylib for the particles. So far, I’ve spent multiple hours (I started before linking the project) setting up the project with CMake, an install wizard, and external libraries. Additionally, so far I have implemented the ability to toggle gravity and the simulation, and there is a button to toggle electrostatics, even though electrostatics are not implemented yet. I also have a menu for spawning new particles, an about page, and a menu for editing constants (like gravity)."}]...
|
Title: PSim - Particle Simulator by @etaiami09-cmd Title: PSim - Particle Simulator by @etaiami09-cmd | Stardance
Devlogs:
Devlog - 01 This project is a remake of my first C++ project, which was an electrostatic particle simulator. This time, I’m looking to do a bit more - the simulator will have multiple modes which can be switched on or off, and instead of trying to reinvent the wheel by making a GUI with raw SFML, I’m using ImGui and binding it to raylib for the particles. So far, I’ve spent multiple hours (I started before linking the project) setting up the project with CMake, an install wizard, and external libraries. Additionally, so far I have implemented the ability to toggle gravity and the simulation, and there is a button to toggle electrostatics, even though electrostatics are not implemented yet. I also have a menu for spawning new particles, an about page, and a menu for editing constants (like gravity).
Devlog - 02 - Before Shabbos Since the last blogpost I have been working on cleaning up the existing codebase, improving some APIs and laying down the groundwork for electrostatic movement. I spent over an hour splitting the GUI rendering process into multiple independent files that are each much smaller than the monolithic “graphical.cpp” from before, which allowed for a cleaner structure which enabled me to think about the code more cleanly and refactor it further. I created a generic Holder struct which runs some function when constructed (and can receive arguments for that function when constructed) and calls another function when it goes out of scope. This is useful in ImGui because very often you have stuff like ImGui::BeginGroup() which must be followed with ImGui::EndGroup() which can easily be forgotten and also leads to unclean and spaghetti code. Instead, All that needs to be done now is a declaration of a GroupHolder variable, and then ImGui::EndGroup() is automatically called when that variable goes out of scope. I moved a bunch of constants from graphical.cpp to a PSimImpl namespace which allows them to be accessed from anywhere without polluting the global namespace. Additionally, I spent some time laying down the groundwork for electrostatic movement, which includes a Force type, which is a strongly typed wrapper around Vec2. I need these to be strongly typed so Force cannot be accidentally converted to Position or Velocity, but I also wanted to be able to explicitly (or implicitly) convert a Vec2 to one of its wrappers. This took a while to get right and eventually lead to the line of code in the screenshot. One more thing: I noticed that currently this website has no way to actually find the GitHub page for other people’s projects, so here’s the link to mine: https://etaiami09-cmd/PSimUltimate Enjoy!
(Advice Welcome) Devlog - 03 - How to design extensible architechture for my particle simulator desktop application I tried making a simple refactor - when I was first experimenting with the code, Whenever electrostatics were disabled the vector of charges for each particle was reset. This is obviously not great behavior for when you want to be able to quickly toggle modes on and off, so I tried making it so toggling electrostatics simply switches whether the simulation notices them or not, and not whether the data exists. This took 4 different attempts at compilation and playing around before I arrived at the expected behavior - and all I was doing was just deleting some code! It became clear that even though my application is still tiny (under 1k lines of code) and even though I have only 2 modes (gravity and electrostatics), I already have spaghetti code. Now I need to do one thing: design a safe and extensible architechture for adding new types of forces. The first thing that needs to happen is deciding how each mode interacts with the particles. This is the easiest part: Each mode is told to calculate the force for which it is responsible for every particle, and those forces get added to an array of forces, and then the sum force for each particle is used to determine its new position. This alone means there will never be any meaningful spaghetti code. Now comes the hard part: deciding how modes should be declared and added to the application. There are two approaches: Create an interface for modes which is known at compile time. This will lead to better performance due to optimizations, faster startup times, and more control for me over how the application works. Create an interface for modes which is registered dynamically at startup, this approach allows for 3rd-party extensions in the form of dll files that are dropped into some folder in the install directory. This leads to slower startup times, less optimizations due to the need of a stable ABI, and an overall increase in architechture size. I don’t know what I should choose, but I would love to have someone’s input on which would be better for my project.
Devlog - 04 - Fast JSON Serialization And Deserialization I need a way to save the simulation’s state. My options were few: Create a custom binary format (pretty easy, but not readable) Create a custom text format (hard but readable) Use an existing JSON library and format state into a JSON (very easy, very readable) Option 3 is naturally the best one, so that’s the one I went with. I used nlohmann/json as my JSON library, and for now I have just gone with the native approach of manually looping through the particles to build an object tree and walking the object tree to deserialize files. Now, I know that technically this part of the application doesn’t really require any form of optimization, since even with 1,000 particles and O3 compiler optimizations this native approach takes a small enough time that there isn’t even one frame of overhead. But I still didn’t want to leave performance on the table for no reason. I started with a 10000 particle serialization benchmark. It originally took 100ms to serialize and write to disk with O3 optimizations. After a few changes, mainly first formatting the json object to a std::string and then piping it to a std::ofstream to reduce OS overhead, I quickly reached about 40ms for building an object tree and writing to disk. I got similar results without really adding any optimizations to the deserialization process. Now, this is definitely fast enough for the kind of application that PSimUltimate is, but it still seems slow. People manage to write gigabytes of JSON per second, why is my process so slow? Well, turns out the main reason is the fact that nlohmann/json is, well, pretty slow to build an object tree with. Every single item in the tree is a heap-allocated object, which means both malloc and free overhead and cache-unfriendliness. You can see in the benchmark that serializeState and deserializeState both take a couple milliseconds despite not doing anything but set up the work for the other functions, and this is because of the time it takes to malloc and free the object trees. Theoretically, there are ways to write faster nlohmann/json code that doesn’t rely on as many heap allocations, but it’s not really worth it for me to do spend time looking into it and designing it right now, so this is good enough for me for now.
Devlog #5 - I spent 8 hours overengineering my desktop application to avoid spaghetti code A few days ago I wrote about how my small desktop app was already suffering from spaghetti code due to interaction between its modules. I had originally set out to create an application with just 3 modes: Gravity, Electrostatic movement, and chemical bonds. But this has a big problem: The scope is small, making development uninteresting and the actual application pointless to users. The Change In order to solve my spaghetti code problem, I came up with a solution: Instead of implementing 3 different modes, implement an interface that allows you to add as many modes as you want. The Process My first step was to decide what the public API should be for creating a new module. I settled for this: What the module author needs The module author may want to intercept a few different things: Change Force, Velocity and Position values every frame when they are being evaluated Add an attribute for a particle (like how a particle needs a charge in electrostatics) Add a universal physical constant (like Coulomb’s constant or the gravitational constant) Render something on top of the application What I need to do I built a module system to register all of the above, plus a psim_module_api.hpp header for the module author. It defines a C-ABI entry point that calls a C++ init function the author provides. I was almost done with the entire process when I discovered that Windows apparently doesn’t properly support the ability of DLLs to access functions in the main program by linking against them at compile time, and had to rewrite a large chunk from scratch. All the user has to do is include the header and define a void initializePSimModule() which is forward-declared by the header and called by the entry point after populating the function pointer table. Then we just use user-friendly functions to register anything the module might need. An example module is shown in the screenshots, along with its source code. This module creates constants for boundaries that particles cannot cross, effectively boxing them in a rectangle. I rewrote the Gravity and Electric modules in the module system. They are part of the core application, so I’m not loading them dynamically every time, but they use the same API as dynamic extensions. This makes it essentially impossible to create spaghetti code around the different modes, and now all I have to do to load a new module into the program is call loadModule(const std::string& path) . The final flow is something like this: The module entry point is a function that receives a function pointer table to all the C-ABI functions that the module uses under the hood. It populates the module’s function pointer table (the one I added because of Windows) and then calls the main initialization function implemented by the module author. To put things in perspective, here is what happens when you register a constant: You call registerConstant(...) with a std::string and a std::function => they’re destructured into C-friendly structs => the module finds _regConstant(const char* module, size_t moduleLen, ..., PSIM_Constant_Change_Callback) in the pointer table and calls it => the main program restructures the C parameters back into C++ types => the main program calls the real registration function. And this is precisely the hard part: The module author can believe that he’s dealing with the same exact std::span<Particle> that is passed to him by the main program, but in reality that span was destructured into a Particle* and a size_t and was then restructured, all before his callback was even called. This took me 8 hours, and out of everything I’ve done with PSimUltimate for now, this has definitely been the most valuable learning experience. I learned how to expose C++ APIs while maintaining a stable C ABI backend. Very cool!
Mini Devlog - Just Spent An Hour Fighting With The C++ Standard Library + Live Showcase! I just finished spending 8 hours on a massive refactor and new features, so I thought it would be nice to sit for a little while and play around with the program and fix some errors, and generally try to make the code a little safer. I’ve spent the past hour looking at various crashes i’ve had and tryint to pinpoint and debug them, and pretty much every single one of them came down to the fact that I keep forgetting that std::vector<T>::resize(n) does not have the same functionality as std::vector<T>::clear(); std::vector<T>::reserve(n) . This should be a very simple concept, and yet it’s apperently riddled my program with bugs. That’s all solved now, and you can try release 0.1.4 here with an example boxing module! Happy programming! Also, here’s a live demo of the program in action. The recording doesn’t capture the file dialog opening up, but you can tell it’s there before the particles spawn and when I load in the module.
Devlog #6 - Adding Testing To My Particle Simulator I’ve been working on adding unit testing to my project. It was important for me to add unit tests for several reasons: I have never written unit tests in C++, so it’s a good learning experience I genuinely want this project to end up as a polished desktop application, and that’s not really possible without following best practices. Tests are important. Parts of my application are already extremely vulnerable to bugs It’s easier to catch bugs through unit tests than through actual use of the application Catch2 as the framework I chose Catch2 as my framework because it seemed easy to work with and not too verbose. Current sensitive parts of the application Position , Velocity , and Force are all independent wrappers around Vec2<float> . It is extremely important to me that these have proper arithmetic, but are not implicitly convertible, since that is almost definitely not intended behavior. This is why I wrote almost 200 lines of code’s worth of unit tests to make sure that the typing system is strong and acts the way I want it to. Catching bugs easily through unit testing While a user will most likely eventually stumble upon any bug worth fixing, I don’t really have any users yet! I would like to ship an app that isn’t obviously broken, and to do that, I need unit tests that stress the logic of my program to make sure it can survive users messing with it. Current progress on writing tests I’ve written fairly extensive tests to enforce the Vec2<float> variants type system, and to enforce particles working and ticking correctly and interacting with modules correctly. I still have many more tests to write, and I expect to spend the next couple of hours doing that. Thank you for reading!
Mini Devlog - How Writing Unit Tests Made Me Fight C++ For An Hour Whenever I spend some time fighting with C++ instead of actually being productive, I feel like I at least need to get a devlog out of it, so here goes. Background I’ve been writing unit tests for my particle simulator, and one thing I’ve noticed is that I have no code to protect global state when a single module is registered more than once, which leads to weird and unintended behavior. My solution is lazy: silent failure. If a module already exists when addModule(const std::string& name) is called through the module interface function registerModule(const std::string& name) (You can read about why these are separated in an earlier blog post, it’s very cool!), the function just doesn’t register it again. Simple enough, but I wanted to implement it in “correct” C++. The Implementation (Where Things Went Wrong) What I did was create a function in module.cpp with internal linkage called getModuleByName which returns a std::optional<Module&> . Well, apparently for the C++ standard that amounts to heresy, since up until C++26 the committee never managed to agree on how to handle std::optional s that contain references. Well, I thought, I am already compiling with -std=c++26 in my project, so this should work. But it didn’t. I needed an updated libc++ implementation, which I managed to get through MinGW. I spent 30 more minutes fighting with CMake as it insisted to link against MSVC’s headers, but eventually I did manage to get it to compile. A normal programmer would have just used std::optional<Module*> but I am definitely not normal. Was it worth it? probably not. Especially when it’s all for a function which only has internal linkage and is only used in one place. But I like to think that writing code I’m comfortable with will help maintain the codebase in the future.
Devlog #7 - Steady Progress Is Not Interesting Sorry for the low logged time, I’ve actually been working for several hours but I forgot to install wakatime after switching to CLion. What I’ve Been Working On One of the most important things when working with multiple modules that work on a callback-based system is the ability to reorder modules so some callbacks get called before others. Imagine this: You have a module foo which clamps all particles to the window border so they can never escape the boundaries of the window. You also have module bar which increments the X position of each particle by 3, each frame. Say foo gets registered after bar , particles will get clamped to the border AND THEN move 3 pixels, breaking the behavior both module authors likely intended. The Solution Create a GUI which allows the user to reorder modules by, so a module placed after another module gets called last. Implementation Challenges I had to learn how std::list works (a linked list was the obvious choice for this use case), and let me tell you, it is by far one of the worst STL containers I’ve had to work with, and anyone who writes C++ code knows that MEANS somethimg. Conclusion Again, not much to write about today, but steady progress just isn’t all that interesting. Thanks for reading!
Devlog #8 - I Need Your Help This devlog is not so focused on what I’ve been doing since the last one, but what I have been doing is pretty cool, so I’ll go over it: PSim uses Dear ImGui as the backend for its GUI. Up until now, the font size in the GUI has been way too small (13px) and the GUI sidebar could not be resized in any way. I had to make it so resizing is possible and the font is more readable, because I want the app to be properly useable. The first thing I did switch fonts from Dear ImGui’s default non-scalable font to Dear ImGui’s default scalable version, ProggyForever. This took a few minutes but the big challenge was getting resizing to do exactly what I wanted. Despite Dear ImGui usually having exactly the correct amount of features, there is no option to make resizing only possible from one side or disable the completely free bottom-right resize grip. I had to go directly into Dear ImGui’s source code and manually disable those things myself, which was a first for me. What I Need Help With Right now whenever I try to do anything I realize that I don’t actually have a good feel for what’s missing and what needs improvement. If anyone reading this could spare some time of their day to install my application and play around with it, maybe write a module. I have added proper documentation for modules to make the whole process much easier, so hopefully someone will be able to help me find issues and missing features. You can get the release on GitHub . Thank you for reading and thank you for helping out!
Devlog #9 - Expanding The Module Developer API Before I begin this devlog, I would like to apologize for being inactive over the past week. I have had quite a busy week, and I did not have much of an opportunity to work on PSimUltimate unfortunately. What I Have Been Working On I’ve been putting more attention to the module API, modules are the most important part of PSim, and their API should be more advanced than the very basic one that currently exists. I’ve split the API into 5 different sections: Physics Behavior - callbacks into force, velocity, and positions of particles User Input - adding new keyboard shortcuts, reading mouse positions, reading which keys are being pressed Graphical Behavior - being able to draw stuff on the screen GUI - adding buttons, settings pages, descriptions, and more for specific modules. Other Modules - modules should be able to register dependencies and force certain modules to be either lower or higher than them on the callback order. I have been hard at work (when I can) on designing and implementing these needs. So far I have made some progress, but there is still much to do and research, and I’m sorry it’s not so juicy for a week’s worth of progress. Either way, thank you for reading, attached is an example of custom buttons that can be registered by modules in the top bar, and please keep following the project for more updates.
Devlog #10 - Don’t Hate The User One of the most important unwritten (though I’m sure it is written somewhere) rules of writing good software is responsible error handling. I’m writing a desktop application, and personally, when I’m using a desktop application, I don’t like it when it suddenly crashes with no useful error message. This is especially possible in a desktop application written in C++, where irresponsible coding practices can lead to segfaults and other crashes without so much as a Java-style “NullPointerException”. It would be incredibly frustrating for the user to lose progress and not even know why. Another potentially frustrutaing situation is when the program fails silently. It doesn’t quite crash, but when you ask a program to do something and it just doesn’t do it, that can be frustrating. When a program can’t satisfy an action the user wants it to make, it should make it as clear as possible that it’s aware of its failure, and attempt to clarify what went wrong. What I’ve Been Doing Until Now Up until now I have handled runtime errors by… well… not handling them. I wrote my application under the assumption that everything works smoothly, every module loaded by the user exports the correct signature, every file opened by the user is well-formed, and every file the user wants to write to has the necessary permissions. If any of this went wrong, the program entered undefined behavior. Most likely, it will crash. My Solution Whenever the user requests an action by the program, for example, trying to open a saved simulation state JSON, the program goes through the following steps: Make sure the file is actually opened Make sure the file is correctly-formed JSON syntax Make sure the actual data in the file aligns with PSimUltimate’s requirements and constraints Actually deserialize the file If any of these goes wrong, the deserialization process immidiately ends and an error notification is pushed to the bottom-right corner of the screen. If multiple things are wrong about the data in the file, only the first thing in the deserialization order is written. There can be up to 3 error notifications displayed at once, with any more notifications being queued for when those are closed by the user . This solves the issue of responsible, user-friendly error handling, and is an important piece of infrastructure for a usable desktop application.
Devlog #11 - Adding A Settings Page, A Config System, And More Module API Yesterday I wrote about my commitment to making PSim an actual, usable desktop application that doesn’t feel limiting to the user. What I did yesterday was create an error notification system, so if something goes wrong the user can understand why and code has a standard philosophy to handle issues. Today, I put my focus on improving the user experience by adding a settings page to PSim. The Layout Personally, when I think of a settings page in a desktop application, I usually imagine a blocking pop-up (as in, a subwindow inside the application window that while opened, does not let you touch anything outside of it) with a few tabs for different categories of settings. ImGui actually has great support for this, with OpenPopup to create one. the smaller, left-side portion of the settings page is a tab-selection area, and the right-side portion is the tab which is selected. There are 4 tabs: General Simulation Modules - modules can register custom settings About - basically just the full text of the MIT License + a link to the project’s GitHub page The Config System Personally, when I change a setting on a desktop application, I generally expect that change to still be in effect when I close and reopen it. To do this, PSim needs to get to the target platform’s app data folder, create a folder for itself if one doesn’t already exist, and then save whatever information it needs there. Now, this is obviously annoying to have to re-write every time you want to save something as simple as what FPS the user wants, so I wrote a template system to save and access binary settings files on the fly. I now had a way to make it so arbitrary settings stay the same every time I open the app. Now, I need to make it so modules have the same privilege. I created 3 new functions in the module API, writeConfig , readConfig , and registerSwitch . Each of these does as the name implies, and it allows you to add on-off switches (support for more will come later) and read/write configs to disk. Conclusion It may have taken 6 hours of work, but I managed to create a fully-functional settings UI with module support to my first desktop application. This is an important piece of architechture and makes it much easier to add more features in the future and expand the app into something I can be very proud of. Thank you very much for reading! Please enjoy this proof-of-concept video of me changing settings and reopening the app.
Devlog #12 - Solid, Boring Progress I’ve spent the last few days making regular feature updates to PSim. Here are the highlights: 1. Unload Modules Until now, if a user loaded a module and didn’t want it anymore, he would have to reopen the app. Additionally, there was no way to unload the built-in modules. I added an options tooltip in the module order GUI that allows the user to unload a module and everything it has registered. 2. Confirm Action Menu If a user is about to do an action which might lead to loss of data (close the window, override a save file), we want to confirm they know about the potential consequences and accept it. For this, I created an interface for creating a blocking modal that forces the user to either confirm an action or cancel it. 3. Graphics Handlers Behavior Improved The default should obviously be for graphics callbacks to have what they draw to the screen be projected into the actual intended buffer - that is, not anywhere in the top menu bar or the left-hand control panel. This is also already where particles are drawn, so a particle at 0, 0 is drawn in the top-left corner where the top menu bar and control panel intersect. This math had to be applied to every single thing drawn by a graphics callback, and I decided to fix it by calling graphics callbacks while in a raylib 2D mode that offsets everything so that 0, 0 is where a particle at 0,0 is drawn. 4. DPI Scaling I switched to a new laptop this week, and went from a 14 Inch 1080p screen to a 14 Inch 1440p screen. Suddenly, the menu became much smaller, because the program was drawing by pixel instead of by the system’s default scaling (which, on my new laptop, is 200%). I fixed this by making Raylib scale everything by the user’s system DPI. 5. Module Internal Serialization If a module has any internal state that should be preserved when a save file is written, it can now register a callback that returns a std::string and a callback that accepts one, and those can be used to serialize and deserialize its internal state. 6. Extended Module API Documentation I’ve now written documentation for everything but the feature discussed in point 5. 7. New Particle Target I’ve added a cross target placed in the position where a new particle would be placed according to the Position buffer, to ease on visualizing the new particle. This cross is customizeable in the settings menu and you can change width, length and color.
Half Devlog - Short Update: Sorry for not posting for a while. My computer broke and I’m waiting for the repair. Hopefully I’ll be back next week! Thank you for your patience.
Devlog #13 - Time To Ship! PSimUltimate is finally ready to ship. I have put a lot of effort into this project, and I feel genuinely proud of my what I have achieved. While working on this project I have gotten a new computer, lost that computer due to a faulty motherboard, got an internship at a tech company, and started working there full time. Suffice to say, I haven’t had much time to work on PSim in the last month. But I did. I spent time polishing what I have already created and now I feel content with my product. What I’ve done since the last devlog PSimUltimate now has a logo, designed by me. I have also run PSim on WSL and fixed various issues that only appeared on Linux. There is now a way to use your mouse to set the next particle’s position There is now a menu for editing particle data - you can delete a particle and change its position, velocity, mass, etc. PSim is now ready for release. I’m happy and proud to present it and show what I’ve done, and I hope other people receive it well. Thank you all for your support!
Ships:
PSimUltimate Is Ready! I made a particle simulator desktop application in C++ with heavy extension support. Overview PSimUltimate models real physics, but also allows you to inject your own behavior. Using a simple development API that even someone with no C++ experience can understand, you can create, compile and load your own custom modules to the simulator and watch the behavior you’ve coded in action. PSim even ships with 2 of these modules built into the binary, and 3 more modules that you can load dynamically. PSimUltimate also comes with a very simple UI, one that anyone could be comfortable with within minutes. How it works PSimUltimate has documentation for creating your own modules, and compiling them is very simple with a few commands. You can then load the modules, and PSim knows how to run your module and follow its physics. PSimUltimate is written in modern C++, using Raylib and Dear ImGui to provide a clean UI and good support in multiple platforms. While it only ships a Windows binary, you can easily follow the instructions in README.md to compile in other platforms. How to try it You can download the PSimUltimate installation wizard in this page . For more instructions and information, including information on support for other platforms, check out README.md in the source code. Challenges I’ve faced This project took a lot of effort to complete. It is the largest single solo project I have worked on since I started programming, and it included a lot of technical software design and infrastructure that I had to familiarize myself with, like dynamic libraries and using and altering 3rd party libraries (I altered portable file dialogs and Dear ImGui to suit my needs). I also had to deal with moving to a new computer, and then when that computer broke down due to a faulty motherboard, I had to move back to my old computer. I also started a full-time internship at a tech company. All that, coupled with some massive life changes, made it much harder to work on this project. But I enjoyed making it nonetheless, and I’m proud to show off what I’ve created....
|
1793660047.4333982
|
1793746447.4333982
|
|
15819
|
Frictionless by @Viana | Stardance
|
Viana
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @Viana | Stardance
|
1793321565.5086083
|
1793926365.5086083
|
|
15820
|
Robot head by @ilan_kowal | Stardance
|
ilan_kowal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Robot head by @ilan_kowal | Stardance
|
1793184473.5536532
|
1793789273.5536532
|
|
15821
|
My awesome macropad! by @KrishI | Stardance
|
KrishI
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @KrishI | Stardance
|
1793418801.1812813
|
1794023601.1812813
|
|
15822
|
My awesome macropad! by @Inaya | Stardance
|
Inaya
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Inaya | Stardance
|
1793490586.0619516
|
1794095386.0619516
|
|
15823
|
Receipt saver by @raihabhuiyan9 | Stardance
|
raihabhuiyan9
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Receipt saver by @raihabhuiyan9 | Stardance
|
1793534170.1307292
|
1794138970.1307292
|
|
15824
|
My first slack bot! by @kindos | Stardance
|
kindos
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @kindos | Stardance
|
1793253042.6252198
|
1793857842.6252198
|
|
15825
|
My very own WebOS by @Justin76 | Stardance
|
Justin76
|
1
|
5.3
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T22:34:55Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created an OS with 3 windows and 2 apps. The 2 apps are a app with an embed link to a TikTok that I like, and the offline app goes to a photo of a car in real-life that I saw recently and thought was interesting. The main challenge of my OS was the guide not being exact or having multiple interpretations during some parts but at the same time I also think that helped me go off on my own and try hard to fix problems I encountered. The thing I am the proudest of overall was even creating this OS. When it comes to creativity, I find myself on the less creative side but as someone just starting Star dance, I am glad I took the push to try and create something and worked hard to make this work. The way the OS works is it opens with the introduction window which is movable through the steering wheel and can be closed with the red button and opened with the CarOS name. Second there’s the apps which can be opened my clicking on them and closed the same way as the introduction with the red button. Overall, I am very proud of my project and look forward to working on a different hardware project which will start posting Devlogs for soon😉", "repo": "https://github.com/JustinluvsRockets/Car-OS", "demo": "https://justinluvsrockets.github.io/Car-OS/"}]...
|
[{"post_id": 10845, "ts": "202 [{"post_id": 10845, "ts": "2026-06-17T19:50:51Z", "hours": 0.305, "text": "Fixed the issues in the code causing the demo link to not function. At first I wanted to organize my Github through folders but me placing the index.html in a folder caused Github to not be able to find the images and for the site to not work. In the end I was able to fix this by removing the index.html from the folder."}, {"post_id": 10281, "ts": "2026-06-16T22:26:27Z", "hours": 0.26, "text": "Final Devlog for this project. As I was tidying up the code I was dissatisfied with the current fonts of a couple of the windows, so I decided to change them for the better. I also finished up creating folders for my GitHub Repository and organized my GitHub, so it looks a lot cleaner and a lot smoother for anyone who wants to try my OS p.s if you try my OS Subaru>every car ever made"}, {"post_id": 10168, "ts": "2026-06-16T19:41:17Z", "hours": 4.2242, "text": "Ive Finished my first OS. CarOS a OS based on cars and the best mode of transportation. I decided to make two apps one with a TikTok edit I liked and another with a real life car I saw that looked cool. Overall, it took a long time of debugging and fixing issues I faced."}, {"post_id": 7053, "ts": "2026-06-11T20:22:30Z", "hours": 0.7992, "text": "The start of my first WebOS I added an embed link to a TikTok I thought was nice. So far, it’s pretty grim but I’m planning to add a lot more in part two."}]...
|
Title: My very own WebOS by @Justin76 | Stardance
Title: My very own WebOS by @Justin76 | Stardance
Devlogs:
The start of my first WebOS I added an embed link to a TikTok I thought was nice. So far, it’s pretty grim but I’m planning to add a lot more in part two.
Ive Finished my first OS. CarOS a OS based on cars and the best mode of transportation. I decided to make two apps one with a TikTok edit I liked and another with a real life car I saw that looked cool. Overall, it took a long time of debugging and fixing issues I faced.
Final Devlog for this project. As I was tidying up the code I was dissatisfied with the current fonts of a couple of the windows, so I decided to change them for the better. I also finished up creating folders for my GitHub Repository and organized my GitHub, so it looks a lot cleaner and a lot smoother for anyone who wants to try my OS p.s if you try my OS Subaru>every car ever made
Fixed the issues in the code causing the demo link to not function. At first I wanted to organize my Github through folders but me placing the index.html in a folder caused Github to not be able to find the images and for the site to not work. In the end I was able to fix this by removing the index.html from the folder.
Ships:
I created an OS with 3 windows and 2 apps. The 2 apps are a app with an embed link to a TikTok that I like, and the offline app goes to a photo of a car in real-life that I saw recently and thought was interesting. The main challenge of my OS was the guide not being exact or having multiple interpretations during some parts but at the same time I also think that helped me go off on my own and try hard to fix problems I encountered. The thing I am the proudest of overall was even creating this OS. When it comes to creativity, I find myself on the less creative side but as someone just starting Star dance, I am glad I took the push to try and create something and worked hard to make this work. The way the OS works is it opens with the introduction window which is movable through the steering wheel and can be closed with the red button and opened with the CarOS name. Second there’s the apps which can be opened my clicking on them and closed the same way as the introduction with the red button. Overall, I am very proud of my project and look forward to working on a different hardware project which will start posting Devlogs for soon😉...
|
1793663533.0934207
|
1793749933.0934207
|
|
15826
|
My very own WebOS by @YanxX_03 | Stardance
|
YanxX_03
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @YanxX_03 | Stardance
|
1793436974.6058936
|
1794041774.6058936
|
|
15827
|
Untitled project by @felixlengyel | Stardance
|
felixlengyel
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @felixlengyel | Stardan Title: Untitled project by @felixlengyel | Stardance...
|
1793476206.8835993
|
1794081006.8835993
|
|
15828
|
speech to text by @faz | Stardance
|
faz
|
0
|
1.02
|
0
|
[]
|
[{"post_id": 6756, "ts": "2026 [{"post_id": 6756, "ts": "2026-06-11T09:45:29Z", "hours": 1.0222, "text": "Devlog 01 started my speech-to-text project today got microphone input working with SoundDevice and set it up so it constantly listens in small chunks. RMS volume to figure out whether I’m speaking or not, and then storing only the audio that actually contains speech i also added silence detection so when I stop talking for about half a second, it assumes I’ve finished a sentence and sends the audio off to Faster-Whisper for transcription. transcription runs in a separate thread so the microphone can keep listening while Whisper does its thing had to mess around with locks and a few state variables to stop duplicate transcriptions from happening, but it’s working pretty well now. right now it can listen, detect when I’m speaking, wait for me to finish, and then print the transcribed text automatically. still needs some tweaking though. the silence detection isn’t perfect and I’m creating a lot of threads right now, which probably isn’t the best approach long term start of the code is in the photo, i’m at like 102 lines"}]...
|
Title: speech to text by @faz | Stardance
Devlogs Title: speech to text by @faz | Stardance
Devlogs:
Devlog 01 started my speech-to-text project today got microphone input working with SoundDevice and set it up so it constantly listens in small chunks. RMS volume to figure out whether I’m speaking or not, and then storing only the audio that actually contains speech i also added silence detection so when I stop talking for about half a second, it assumes I’ve finished a sentence and sends the audio off to Faster-Whisper for transcription. transcription runs in a separate thread so the microphone can keep listening while Whisper does its thing had to mess around with locks and a few state variables to stop duplicate transcriptions from happening, but it’s working pretty well now. right now it can listen, detect when I’m speaking, wait for me to finish, and then print the transcribed text automatically. still needs some tweaking though. the silence detection isn’t perfect and I’m creating a lot of threads right now, which probably isn’t the best approach long term start of the code is in the photo, i’m at like 102 lines...
|
1793408017.761826
|
1794012817.761826
|
|
15829
|
My very own WebOS by @TashfinShifan | Stardance
|
TashfinShifan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @TashfinShifan | Stard Title: My very own WebOS by @TashfinShifan | Stardance...
|
1793184689.7105315
|
1793789489.7105315
|
|
15830
|
My very own WebOS by @maxverpoopen | Stardance
|
maxverpoopen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @maxverpoopen | Starda Title: My very own WebOS by @maxverpoopen | Stardance...
|
1793540946.0857491
|
1794145746.0857491
|
|
15831
|
Frictionless by @akssh | Stardance
|
akssh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @akssh | Stardance
|
1793393325.4680622
|
1793998125.4680622
|
|
15832
|
Bottle recycler by @ernest_ellicott | Stardance
|
ernest_ellicott
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Bottle recycler by @ernest_ellicott | Stard Title: Bottle recycler by @ernest_ellicott | Stardance...
|
1793328837.0326214
|
1793933637.0326214
|
|
15833
|
My first slack bot! by @nlange312 | Stardance
|
nlange312
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @nlange312 | Stardan Title: My first slack bot! by @nlange312 | Stardance...
|
1793227720.6819646
|
1793832520.6819646
|
|
15834
|
Untitled project by @Amarion | Stardance
|
Amarion
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Amarion | Stardance
|
1793400954.1502066
|
1794005754.1502066
|
|
15835
|
My first slack bot! by @maira_K44 | Stardance
|
maira_K44
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @maira_K44 | Stardan Title: My first slack bot! by @maira_K44 | Stardance...
|
1793145247.6537206
|
1793750047.6537206
|
|
15836
|
Drone by @maxverpoopen | Stardance
|
maxverpoopen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Drone by @maxverpoopen | Stardance
|
1793134122.5469244
|
1793738922.5469244
|
|
15837
|
Lego robotic arm by @L56yu | Stardance
|
L56yu
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Lego robotic arm by @L56yu | Stardance
|
1793458352.825764
|
1794063152.825764
|
|
15838
|
WillOS by @Gooderswills | Stardance
|
Gooderswills
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-11T13:44:21Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I was able to make a working webos with draggable windows, my own app and the ability to write in the notes app", "repo": "https://github.com/Gooderswills/willOS", "demo": "https://willos.wgdev.uk/"}]...
|
[{"post_id": 45150, "ts": "202 [{"post_id": 45150, "ts": "2026-08-11T13:41:59Z", "hours": 0.8117, "text": "I completed the tutorial up to part 4 which means I was able to add my own notes app with a pre added note and where you can write a note yourself, I also deployed it under my own domain willos.wgdev.uk"}, {"post_id": 38850, "ts": "2026-08-01T12:35:29Z", "hours": 1.5931, "text": "I decided to start this project over again because I was not happy with what I done the first time I attempted it so I started the tutorial again, this time I finished part 3 and have the basis of my site, in the future I will be adding more apps, making it more personalised etc. I also completed the readme and ensured that all features work as intended so far. In the future I will be updating it more to make it better and more unique to me"}, {"post_id": 13136, "ts": "2026-06-21T14:15:16Z", "hours": 1.5686, "text": "I followed the tutorial to get a basic site with content on it, was able to add a couple links, images and used some css to make it look semi good :) Will move on to js next"}]...
|
Title: WillOS by @Gooderswills | Stardance
Devlog Title: WillOS by @Gooderswills | Stardance
Devlogs:
I followed the tutorial to get a basic site with content on it, was able to add a couple links, images and used some css to make it look semi good :) Will move on to js next
I decided to start this project over again because I was not happy with what I done the first time I attempted it so I started the tutorial again, this time I finished part 3 and have the basis of my site, in the future I will be adding more apps, making it more personalised etc. I also completed the readme and ensured that all features work as intended so far. In the future I will be updating it more to make it better and more unique to me
I completed the tutorial up to part 4 which means I was able to add my own notes app with a pre added note and where you can write a note yourself, I also deployed it under my own domain willos.wgdev.uk
Ships:
I was able to make a working webos with draggable windows, my own app and the ability to write in the notes app...
|
1793703359.521815
|
1793789759.521815
|
|
15839
|
Untitled project by @AadityaAlwala | Stardance
|
AadityaAlwala
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @AadityaAlwala | Starda Title: Untitled project by @AadityaAlwala | Stardance...
|
1793361029.4628224
|
1793965829.4628224
|
|
15840
|
My awesome macropad! by @JacksonBehlmann | Stardan My awesome macropad! by @JacksonBehlmann | Stardance...
|
JacksonBehlmann
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @JacksonBehlmann | Title: My awesome macropad! by @JacksonBehlmann | Stardance...
|
1793307351.7335985
|
1793912151.7335985
|
|
15841
|
A self-balancing robot by @duynguyen | Stardance
|
duynguyen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: A self-balancing robot by @duynguyen | Star Title: A self-balancing robot by @duynguyen | Stardance...
|
1793544761.3647296
|
1794149561.3647296
|
|
15842
|
My first slack bot! by @sriansh | Stardance
|
sriansh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @sriansh | Stardance
|
1793454725.131353
|
1794059525.131353
|
|
15843
|
Untitled project by @seanbrian | Stardance
|
seanbrian
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @seanbrian | Stardance
|
1793440258.0534823
|
1794045058.0534823
|
|
15844
|
Frictionless by @Saransh_S | Stardance
|
Saransh_S
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @Saransh_S | Stardance
|
1793487006.0015352
|
1794091806.0015352
|
|
15845
|
Keyboard by @Allan | Stardance
|
Allan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Keyboard by @Allan | Stardance
|
1793458511.220547
|
1794063311.220547
|
|
15846
|
Untitled by @seanbrian | Stardance
|
seanbrian
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @seanbrian | Stardance
|
1793357721.5793927
|
1793962521.5793927
|
|
15847
|
Untitled by @seanbrian | Stardance
|
seanbrian
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @seanbrian | Stardance
|
1793180900.232639
|
1793785700.232639
|
|
15848
|
Simple macropad by @bondo105 | Stardance
|
bondo105
|
0
|
2.09
|
0
|
[]
|
[{"post_id": 7712, "ts": "2026 [{"post_id": 7712, "ts": "2026-06-12T21:32:21Z", "hours": 1.6183, "text": "Devlog #2 Designed and routed the PCB I’m done with my PCB. It was honestly a bit easier than the schematic, but I still encountered some problems. The biggest one was obviously routing pins across the whole board. In the process, I changed the layout a lot of times, flipped the microcontroller a bunch of times, and most notably removed one of the switches. One of my main goals was to make this PCB(and the whole hackpad) pretty compact, and I think I achieved that. The next step is 3D-modelling the case, which I think I will do in Blender, as I have some experience with it. P.S. I noticed the 90 degree angle in my PCB and fixed it."}, {"post_id": 6998, "ts": "2026-06-11T19:04:19Z", "hours": 0.4747, "text": "Devlog #1 Created the schematic for my macropad. My macropad will feature a 3x2 grid of switches, and a knob alongside an OLED display. It’s my first stardance project and my first time designing a pcb, so I didn’t wanna do something too complex. The rotary encoder and switch matrix were pretty simple, especially after looking at some projects from other people. But the OLED display is what I had the most trouble with. After running ERC, the same two error kept popping up. I forgot exactly what they said but it was something along the lines of “VCC isn’t connected to a power source” and the same message for GND(for some obscure reason??). I tried renaming the labels(before I switched to the 3V3 thingy, I just had labels wired to VCC and pin 12 of XIAO), switching them to different pins, changing the labels to 3V3s, etc. Turns out, all I had to do was add a PWR_FLAG to let KiCad know that there is power running there. After that, ERC showed no errors and i was satisfied with my schematic. Next on the checklist is routing the PCB. P.S. I forgot to run kicad-hackatime from the start, so that’s why there is so little time logged."}]...
|
Title: Simple macropad by @bondo105 | Stardance
D Title: Simple macropad by @bondo105 | Stardance
Devlogs:
Devlog #1 Created the schematic for my macropad. My macropad will feature a 3x2 grid of switches, and a knob alongside an OLED display. It’s my first stardance project and my first time designing a pcb, so I didn’t wanna do something too complex. The rotary encoder and switch matrix were pretty simple, especially after looking at some projects from other people. But the OLED display is what I had the most trouble with. After running ERC, the same two error kept popping up. I forgot exactly what they said but it was something along the lines of “VCC isn’t connected to a power source” and the same message for GND(for some obscure reason??). I tried renaming the labels(before I switched to the 3V3 thingy, I just had labels wired to VCC and pin 12 of XIAO), switching them to different pins, changing the labels to 3V3s, etc. Turns out, all I had to do was add a PWR_FLAG to let KiCad know that there is power running there. After that, ERC showed no errors and i was satisfied with my schematic. Next on the checklist is routing the PCB. P.S. I forgot to run kicad-hackatime from the start, so that’s why there is so little time logged.
Devlog #2 Designed and routed the PCB I’m done with my PCB. It was honestly a bit easier than the schematic, but I still encountered some problems. The biggest one was obviously routing pins across the whole board. In the process, I changed the layout a lot of times, flipped the microcontroller a bunch of times, and most notably removed one of the switches. One of my main goals was to make this PCB(and the whole hackpad) pretty compact, and I think I achieved that. The next step is 3D-modelling the case, which I think I will do in Blender, as I have some experience with it. P.S. I noticed the 90 degree angle in my PCB and fixed it....
|
1793393482.4291193
|
1793998282.4291193
|
|
15849
|
Real Time Star and Moon Tracker With Visualizer by Real Time Star and Moon Tracker With Visualizer by @jw4444 | Stardance...
|
jw4444
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Real Time Star and Moon Tracker With Visual Title: Real Time Star and Moon Tracker With Visualizer by @jw4444 | Stardance...
|
1793231604.83296
|
1793836404.83296
|
|
15850
|
The void by @arielrdzemail | Stardance
|
arielrdzemail
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: The void by @arielrdzemail | Stardance
|
1793321638.3752375
|
1793926438.3752375
|