|
30941
|
Mati by @Joschi | Stardance
|
Joschi
|
1
|
228.73
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-18T12:33:31Z", "hours": 228.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Welcome to MATI Discover MATI, a simple and relaxing Sudoku-inspired puzzle game designed to challenge your number-solving skills without putting you under pressure. Your goal is simple: Find the right numbers and complete every row and column correctly. MATI is designed to be fun and stress-free: No Time Pressure: Disable the timer whenever you want and play at your own pace. No Mistakes to Fear: MATI doesn’t punish you for incorrect entries. Simply correct them whenever you notice a mistake. 4 Different Sizes: Choose from four puzzle sizes to match your preferred challenge. Built-in Terminal: Prefer an old-school experience? Play MATI directly in its integrated terminal. Full Keyboard Support: No mouse or trackpad? No problem! MATI can be controlled entirely with your keyboard. ! Development Notice! MATI is still under active development. More features, improvements, and refinements are planned for future updates. Thank you for checking out MATI!", "repo": "https://github.com/JKfromHMS/Mati", "demo": "https://github.com/JKfromHMS/Mati/releases/tag/Mati"}]...
|
[{"post_id": 71221, "ts": "202 [{"post_id": 71221, "ts": "2026-09-20T14:03:17Z", "hours": 0.7347, "text": "Fixed the Read-Me After I got noticed that my Read-Me is not quite what it has to be, I have done a new version that should fit better into the requirements."}, {"post_id": 70074, "ts": "2026-09-18T12:15:17Z", "hours": 5.6108, "text": "Probably the last devlog on this project After more than 220 hours of coding and more and another 200 hours of deciding what to do and talking to other developers about how I could make this program run and do it good, I finally think that it is on a point at which I can think about shipping it. It runs, has no crucial bugs I noticed and is efficient enough to not take several hours just for the export of an mp4 video. Maybe I will add more features later, so do not be shy to comment what you like and what I should change and of course, please tell me if you have found any bug or unnatural behavior. OS Declaration Even though my goal was to make MATI run on every of the big 3 (Mac-OS, Linux, Windows) the current version just runs as wanted on Windows, due to different handling with graphic, which just means, that not every text is placed wright and that the overall look is scratched on Linux and Mac-OS. PS: The picture is the app icon."}, {"post_id": 67290, "ts": "2026-09-13T11:20:20Z", "hours": 9.3047, "text": "Tutorial I added a tutorial that shows the player how the game mainly works and give him the information about the shortcuts. Also I added a function to make the clock a reopen point for a small explanation what the program can do."}, {"post_id": 65414, "ts": "2026-09-10T15:09:37Z", "hours": 7.2906, "text": "Finalizing basic functions My goal is the finish the app as soon as possible. So I am know fixing the last few bugs and add the last missing feature that the program should have. This devlog should just let you know, that the last days were full of deciding what could I do to improve the program and were the bugs are. (Poorly most of this sort of spend time is not count toward the project.) The provided screenshots shows a thing I am currently trying to do better, the extended settings, because like you see, the design is very bad."}, {"post_id": 61761, "ts": "2026-09-04T20:25:16Z", "hours": 9.6339, "text": "Better Structure, Same Simplicity The last (many) hours I spend with one thing. Making sure the codes run even with new and better structure internal. This was also really important, because it made it easier to integrate multiple new things. One thing is, that now into the nearly same and reliable stats design comes buttons. This buttons are basically the headers, means size, mode, games … . If you click on them they basically sort the stats after this header. Furthermore the terminal got a big upgrade, because now it has three new ways to get deeper into your game. At first you can now easily check if you have paused matches. Also you can check your export history, which new feature made it actually also possible to get warned if you export a single match multiple times. And last but not least analysis. Because the game now got a deeper understanding of how you are playing and what are your trends and you can view all of this by the terminals history. (And I was shocked how good it worked with my recent 150 matches.) I hope, I didn’t overwhelmed you with all these information and that you are as curious for the new version as I am."}, {"post_id": 60773, "ts": "2026-09-03T11:24:14Z", "hours": 2.2931, "text": "Chapters I added with the help of AI the possibility to have chapters into my game. So you now can go exactly to the start of every action like you do in the game itself. And even though I know that this do not make that much of the decision how good the program is, it is still another thing that I now know how to do and I think that this is also really important."}, {"post_id": 59881, "ts": "2026-09-01T21:22:44Z", "hours": 9.7594, "text": "System remake It took a while and I forgot a little the time it used, but I did it. Now the whole game runs more efficient threw the new system that handles buttons separate and keeps them cached, so they do not have to be completely calculated every frame new. Also some designs changed slightly."}, {"post_id": 58281, "ts": "2026-08-30T17:28:26Z", "hours": 7.7617, "text": "Bug fixing and redesign Over the last thew versions, even though I spend a lot of time in debugging, many little bugs appear. Sometimes they comes just from moving a function or mistyping and sometimes deeper. So with this version I fixed again many of them, like wrong time show in the achievements and many others. Furthermore I worked and correcting and redesigning the whole terminal help logic, giving the main achievements new names and, like you see in the picture, modified the general achievements screen so that it not just looks better, but also feels better in reason of an improved algorithm to hide the mouse and navigation buttons. PS: If you use it and find a bug, it would be really nice if you could comment it."}, {"post_id": 57627, "ts": "2026-08-29T20:40:59Z", "hours": 7.5722, "text": "Code split and missing feature give With the latest version the game has grown to 14 game and 3 language constructor files, because I a made clearer structure in the code itself, that means I grabbed my screens file and extracted everything that was in there but with questionable reason. So the new files helpers and alt_hover was created. The task of alt_hover is explicit to handle everything containing the keyboard navigation possibilities. Helpers on the other hand is made for everything that is like a config but little more. (I know, that my config still is more as it should, I’ll try to change this as soon as possible.) Also I added with this update missing features that already should be in there like that the keyboard navigation also works in the advanced settings or that like you see in the picture the buttons in settings have an own color palette to make sure that it is clear that they at first are toggle buttons and have an associated color for each of their states. Furthermore I fixed a few little bugs, like that the back jump to the achievement button is not working with the up going higher than to the full-screen button. I hope you enjoy version 0.6.1"}, {"post_id": 56788, "ts": "2026-08-28T18:19:14Z", "hours": 4.5989, "text": "New Design and better language including Now the Achievements have this existing new design that not just looks better but also provides you more easy the needed information. I also made the language better fitting to the shown elements and changed some slightly to make it also look better. Furthermore I fixed a few little bugs like that you could not select ctrl and key shortcuts by yourself or that the pause text has not reacted to that."}, {"post_id": 55614, "ts": "2026-08-27T16:05:18Z", "hours": 9.0169, "text": "Languages and Efficiency The last few hours I used to refresh my school knowledge in French and Spanish to create language packets for my game in this two languages. What I did a little bit earlier is to work again on video exporting efficiency and now it gone really fast. Exporting a video in normal scale takes less time then playing it, in twice the resolution it takes usually around the play time or a little longer and in the highest settings still long. But overall it is now much faster and with less possible problems. PS: The export time are different depending on the hardware of your computer."}, {"post_id": 54404, "ts": "2026-08-25T12:23:33Z", "hours": 8.4808, "text": "Language and Efficiency After many hours I finally made it to add a second language to my game, beside English you know can have German texts in the game. Furthermore I took a little time to made the game as video export more efficient so that it takes 6 seconds less to export my test game."}, {"post_id": 51927, "ts": "2026-08-21T21:03:36Z", "hours": 8.6083, "text": "Languages What I used the last few hours for is what I probably will have to do for some more. Go threw the code and replace everything that generates an output the user could see with the new method that translate this. For this I also need to add the translations. As I needed a break I made the new design for the advanced settings, and now its like I wanted it to be. Furthermore the history in terminal supports now more sort options and - in front to change the meaning for this it has a new system that transfers everything with the same meaning into the same internal command."}, {"post_id": 51317, "ts": "2026-08-20T22:01:43Z", "hours": 8.9794, "text": "Added Advanced Settings It took long and still look not that great and do not work all over, but the base is set. To explain it, the game now has variable sound volume. Also you can now change the language, even though I do not have already created a fully second language. Furthermore navigation keys and ultra input order are now choose able, so if you prefer it different you can now make it so. PS: This devlog is made just in reason off time, at the moment none of this get pushed to GitHub, because it is still in developing."}, {"post_id": 49668, "ts": "2026-08-18T15:35:52Z", "hours": 6.5797, "text": "Fixed Bugs Now the game have finally also in terminal’s ultra game the option to pause the game and take a break. I also added a mechanism for players who want to be really fast that allows the program to submit commands automatically to reduce the submit click every action. Furthermore the achievement screen now has a two way navigation what means that you could either press the left/right arrow keys of your keyboard or click with your mouse on the magic appearing buttons. PS: V0.5.1 is out, it is an update mostly about bug fixing and just this little new features from witch 2 already should work in version beyond this."}, {"post_id": 48338, "ts": "2026-08-16T17:28:07Z", "hours": 4.4836, "text": "Achievements and clear up I added a new achievements show way that is based on multiple pages and every has his specific achievements on. I also cleared up the code a little bit, means I put fast added constants into the config, do little efficiency things and stuff like that. Furthermore I made scrollbars not just be better shown threw all menus, but also work better (more accurate). Now V0.5.0 is on GitHub, if you find bugs, please comment them under this devlog."}, {"post_id": 47395, "ts": "2026-08-15T09:45:19Z", "hours": 7.1794, "text": "Sort and filter system I added an advanced sort and filter system to the history in the terminal. Furthermore the history detail video export is now way faster and the exported videos just need the up to the half of the capacity they have needed before in the same quality level."}, {"post_id": 46868, "ts": "2026-08-14T12:38:24Z", "hours": 8.1706, "text": "Achievements and Design Now the game has an achievement system that show you something like tasks you could do. I also fixed like always some bugs from which are way to much in there and also redesigned the history detail grid position for every size."}, {"post_id": 45396, "ts": "2026-08-11T20:31:36Z", "hours": 4.8586, "text": "New jump system I added a new jump system for the setting, history detail, the Hannah Easter eggs and history view. This enabled the possibility to jump right back and not every time to the start and so you can navigate way faster threw this systems. I also fixed some bugs for example the bug that make the upscale from the exports video not work right. And like always, please comment under this if you notice a bug so that I can fix it."}, {"post_id": 44875, "ts": "2026-08-10T22:18:07Z", "hours": 7.9992, "text": "Efficiency and little changes Threw match case the code got little faster. I also corrected some weird keyboard navigation hover bugs fixed. Furthermore the terminal now got a clock and settings have a complete new look. The last really nameable thing is about that now, if you undo an action, this action is actually marked as undone (if not undone with the button), so you better reflect in the history detail view how the game was."}, {"post_id": 43391, "ts": "2026-08-08T16:33:15Z", "hours": 8.9786, "text": "Scrollbars and bug fix Now, finally, the scrollbars are really working and can be dragged as wished. I also added a version of the stats to the normal view and a version of the history and the settings to the terminal. Furthermore I worked on a way to scale the game up for the mp4 export and to make it harder to cheat. And, like always: If you test it (the newest versions code will be on GitHub in a few days) and should find any bug, please comment them so I can fix it."}, {"post_id": 41376, "ts": "2026-08-05T15:30:23Z", "hours": 6.8236, "text": "Efficiency I worked on the efficiency of the mp4 export and made sure that every sound is played correctly and every state is shown as wished."}, {"post_id": 38859, "ts": "2026-08-01T12:52:03Z", "hours": 5.6961, "text": "MP4 export Now you have the possibility to export a played game as a mp4 video file. With this method you can share your games with others."}, {"post_id": 37646, "ts": "2026-07-30T15:14:02Z", "hours": 7.1558, "text": "Fixed non working features Until now the program got a few things half implemented or even fully in the game but not use able because of mistakes. So know you finally see the scrollbars and you can navigate threw the terminal. You input line finally got moveable from left to right and right to left and buttons got a little new positioning. Also I made the code a little more efficient again."}, {"post_id": 36394, "ts": "2026-07-28T13:58:30Z", "hours": 5.6106, "text": "Efficiency and bug fix Underneath a list of what that means: Now you can see your stats threw the terminal again. Now only games in which you have done something are saved as paused games you can continue. Now also the ultra games are saved correctly and with every action. Now you can write play out again in the terminal. Now the wrong unknown command c message after resuming a game in ultra mode is removed. Now it does not matter anymore if a command has spaces in between or not (at least for those this is wanted). Now the check for play starts threw terminal, normal and ultra, and also for leaving the terminal is way more efficient thank to hash. Now the time code is more simplified. Now you can find a second Easter egg. Now you can with ptl (play time long) see, even over a minute, your playtime on milliseconds in terminal. Now you have a new stats looks that changes itself automatically to the number of your number of games. Now you automatically are on continue when you pause the game. Now Strg/Cmd n activates new match, like you would pressed the button. Now every in game terminal is closed correctly when wanted. Now Strg/Cmd m brings you back to menu everywhere you are. Now you can use up and down arrow to navigate threw your command history in terminal. Now stats show your real data and do not calculate the minutes out. Now terminal input are way more efficient. Now ultra games are way more efficient. Now terminal commands are way more efficient"}, {"post_id": 35778, "ts": "2026-07-27T12:52:18Z", "hours": 1.2631, "text": "Easter Egg #2 The photo show all things I changed in the last version now that everything is working. The game has still a few bugs and even threw the new algorithm even more so it will be a 0.3.2 expected next to fix these bugs as well. If you find one, please write it to me."}, {"post_id": 35735, "ts": "2026-07-27T11:16:54Z", "hours": 8.0969, "text": "Easter Egg and New Code structure After I was ill for a few days I now finished to implement a first planned Easter egg. I also restructured the code, but more about what I done exactly I will publish, when this version got completely working and got published on Git-Hub."}, {"post_id": 31862, "ts": "2026-07-20T16:17:02Z", "hours": 7.1044, "text": "Keyboard Control and Data The first thing I added is that know levels also can be generated with a system and not just based on luck. Also I added with a .smati file type the possibility to save and load the settings what means that when you change a setting this change will continue being there even after you restarted the game. Also you now can see your stats out of the terminal. The coolest new feature I think is the keyboard control option. That means that you now are able to navigate with your keyboard threw the normal mode instead of using the mouse."}, {"post_id": 30924, "ts": "2026-07-18T22:19:27Z", "hours": 1.9275, "text": "Ultra Mode and safety Added a filter system for the ultra mode, which is only visible if a ultra game was played and saved. I also added a question view, that you do not delete files without noticing."}, {"post_id": 30854, "ts": "2026-07-18T20:00:21Z", "hours": 5.2992, "text": "Terminal and Ultra Mode I added a terminal and a ultra mode in the terminal. The ultra mode is basically the normal game but with the different, that you have to type in what you want to do instead of clicking on the cell. The ultra mode also has a play time, the availability to get you time of the match, the restart it, to use a hint and it is also saved like the normal played matches. In the terminal you also can get the time on the second accurate."}, {"post_id": 29740, "ts": "2026-07-16T20:41:01Z", "hours": 3.0444, "text": "Bug fix and design V0.1.2 was exclusively for bug fix and design. Between the old versions I noticed bugs which I fixed to an high amount. Also I redesigned some things like the main menu or the pause menu and the design for the 7x7 grid. Now the code runs smoother and if we ignore the resize option the code is free from unwanted possibilities. If you find one, please say it, that I can fix it as well."}, {"post_id": 29464, "ts": "2026-07-16T13:08:05Z", "hours": 1.1544, "text": "Bug Fix Now you can see every dimmed cell correctly"}, {"post_id": 29433, "ts": "2026-07-16T11:42:57Z", "hours": 7.7711, "text": "Fullscreen, Resize and look and more With the new version you can put the game into fullscreen or just resize it in any way you like as long as you do not make it to small. Also you now can make the sounds be not there anymore. Furthermore you have a new version of the history and history-detail view with enables it for you to filter your games or see your games action by action"}, {"post_id": 27200, "ts": "2026-07-12T15:23:32Z", "hours": 1.3675, "text": "Audio Added an audio files which generates tones so that the game has in game sounds without copyright problems"}, {"post_id": 26125, "ts": "2026-07-10T18:47:20Z", "hours": 0.3211, "text": "Bug Fixes The Bugs was found and corrected. (Thanks to AI, that found the bugs and suggested fixes.) The Bugs were mostly just miss tips like a . instead of a , of a big letter instead of a little."}, {"post_id": 26112, "ts": "2026-07-10T18:16:47Z", "hours": 9.7158, "text": "Splitting I have started to split the game into several files, so each has a task and is better readable. Within the same I added new features like hints or a undo button, a 7x7 grid and overall a little overwork, so the code is overall better. But now are still bugs in there. (The only reason I update the project now is, because of the time I already needed and will need more.)"}, {"post_id": 23520, "ts": "2026-07-06T15:22:33Z", "hours": 3.2831, "text": "Time and Save Know you can enable to see a timer in the game. I also added a option to save your games as a history, but this still needs a lot of work, because the one file type is a bit of trickier than the last times I remembered."}, {"post_id": 22951, "ts": "2026-07-05T16:45:47Z", "hours": 0.7586, "text": "Settings and corrections The Game has no settings with an about Also I fixed a bug, which made the auto dim stop working."}, {"post_id": 22930, "ts": "2026-07-05T15:56:24Z", "hours": 0.7944, "text": "Dimming With a right click you can now dim a cell and if a cell is filled it dim automatically. Also I fixed a bug, which appeared in 0.0.4 with the 6x6."}, {"post_id": 22873, "ts": "2026-07-05T14:31:10Z", "hours": 1.1981, "text": "Expanded game modes and better marking Know you can choose between 4x4 5x5 and 6x6 game grid. Also the grid got a border and you can see if a row or column is solved, because they get marked then."}, {"post_id": 22802, "ts": "2026-07-05T11:53:20Z", "hours": 1.0408, "text": "Added a Main Screen You have now a main screen, from which you can start the game."}, {"post_id": 22764, "ts": "2026-07-05T10:45:32Z", "hours": 1.875, "text": "Created first Version it has no menu and just starts the game for one run"}]...
|
Title: Mati by @Joschi | Stardance
Devlogs:
Creat Title: Mati by @Joschi | Stardance
Devlogs:
Created first Version it has no menu and just starts the game for one run
Added a Main Screen You have now a main screen, from which you can start the game.
Expanded game modes and better marking Know you can choose between 4x4 5x5 and 6x6 game grid. Also the grid got a border and you can see if a row or column is solved, because they get marked then.
Dimming With a right click you can now dim a cell and if a cell is filled it dim automatically. Also I fixed a bug, which appeared in 0.0.4 with the 6x6.
Settings and corrections The Game has no settings with an about Also I fixed a bug, which made the auto dim stop working.
Time and Save Know you can enable to see a timer in the game. I also added a option to save your games as a history, but this still needs a lot of work, because the one file type is a bit of trickier than the last times I remembered.
Splitting I have started to split the game into several files, so each has a task and is better readable. Within the same I added new features like hints or a undo button, a 7x7 grid and overall a little overwork, so the code is overall better. But now are still bugs in there. (The only reason I update the project now is, because of the time I already needed and will need more.)
Bug Fixes The Bugs was found and corrected. (Thanks to AI, that found the bugs and suggested fixes.) The Bugs were mostly just miss tips like a . instead of a , of a big letter instead of a little.
Audio Added an audio files which generates tones so that the game has in game sounds without copyright problems
Fullscreen, Resize and look and more With the new version you can put the game into fullscreen or just resize it in any way you like as long as you do not make it to small. Also you now can make the sounds be not there anymore. Furthermore you have a new version of the history and history-detail view with enables it for you to filter your games or see your games action by action
Bug Fix Now you can see every dimmed cell correctly
Bug fix and design V0.1.2 was exclusively for bug fix and design. Between the old versions I noticed bugs which I fixed to an high amount. Also I redesigned some things like the main menu or the pause menu and the design for the 7x7 grid. Now the code runs smoother and if we ignore the resize option the code is free from unwanted possibilities. If you find one, please say it, that I can fix it as well.
Terminal and Ultra Mode I added a terminal and a ultra mode in the terminal. The ultra mode is basically the normal game but with the different, that you have to type in what you want to do instead of clicking on the cell. The ultra mode also has a play time, the availability to get you time of the match, the restart it, to use a hint and it is also saved like the normal played matches. In the terminal you also can get the time on the second accurate.
Ultra Mode and safety Added a filter system for the ultra mode, which is only visible if a ultra game was played and saved. I also added a question view, that you do not delete files without noticing.
Keyboard Control and Data The first thing I added is that know levels also can be generated with a system and not just based on luck. Also I added with a .smati file type the possibility to save and load the settings what means that when you change a setting this change will continue being there even after you restarted the game. Also you now can see your stats out of the terminal. The coolest new feature I think is the keyboard control option. That means that you now are able to navigate with your keyboard threw the normal mode instead of using the mouse.
Easter Egg and New Code structure After I was ill for a few days I now finished to implement a first planned Easter egg. I also restructured the code, but more about what I done exactly I will publish, when this version got completely working and got published on Git-Hub.
Easter Egg #2 The photo show all things I changed in the last version now that everything is working. The game has still a few bugs and even threw the new algorithm even more so it will be a 0.3.2 expected next to fix these bugs as well. If you find one, please write it to me.
Efficiency and bug fix Underneath a list of what that means: Now you can see your stats threw the terminal again. Now only games in which you have done something are saved as paused games you can continue. Now also the ultra games are saved correctly and with every action. Now you can write play out again in the terminal. Now the wrong unknown command c message after resuming a game in ultra mode is removed. Now it does not matter anymore if a command has spaces in between or not (at least for those this is wanted). Now the check for play starts threw terminal, normal and ultra, and also for leaving the terminal is way more efficient thank to hash. Now the time code is more simplified. Now you can find a second Easter egg. Now you can with ptl (play time long) see, even over a minute, your playtime on milliseconds in terminal. Now you have a new stats looks that changes itself automatically to the number of your number of games. Now you automatically are on continue when you pause the game. Now Strg/Cmd n activates new match, like you would pressed the button. Now every in game terminal is closed correctly when wanted. Now Strg/Cmd m brings you back to menu everywhere you are. Now you can use up and down arrow to navigate threw your command history in terminal. Now stats show your real data and do not calculate the minutes out. Now terminal input are way more efficient. Now ultra games are way more efficient. Now terminal commands are way more efficient
Fixed non working features Until now the program got a few things half implemented or even fully in the game but not use able because of mistakes. So know you finally see the scrollbars and you can navigate threw the terminal. You input line finally got moveable from left to right and right to left and buttons got a little new positioning. Also I made the code a little more efficient again.
MP4 export Now you have the possibility to export a played game as a mp4 video file. With this method you can share your games with others.
Efficiency I worked on the efficiency of the mp4 export and made sure that every sound is played correctly and every state is shown as wished.
Scrollbars and bug fix Now, finally, the scrollbars are really working and can be dragged as wished. I also added a version of the stats to the normal view and a version of the history and the settings to the terminal. Furthermore I worked on a way to scale the game up for the mp4 export and to make it harder to cheat. And, like always: If you test it (the newest versions code will be on GitHub in a few days) and should find any bug, please comment them so I can fix it.
Efficiency and little changes Threw match case the code got little faster. I also corrected some weird keyboard navigation hover bugs fixed. Furthermore the terminal now got a clock and settings have a complete new look. The last really nameable thing is about that now, if you undo an action, this action is actually marked as undone (if not undone with the button), so you better reflect in the history detail view how the game was.
New jump system I added a new jump system for the setting, history detail, the Hannah Easter eggs and history view. This enabled the possibility to jump right back and not every time to the start and so you can navigate way faster threw this systems. I also fixed some bugs for example the bug that make the upscale from the exports video not work right. And like always, please comment under this if you notice a bug so that I can fix it.
Achievements and Design Now the game has an achievement system that show you something like tasks you could do. I also fixed like always some bugs from which are way to much in there and also redesigned the history detail grid position for every size.
Sort and filter system I added an advanced sort and filter system to the history in the terminal. Furthermore the history detail video export is now way faster and the exported videos just need the up to the half of the capacity they have needed before in the same quality level.
Achievements and clear up I added a new achievements show way that is based on multiple pages and every has his specific achievements on. I also cleared up the code a little bit, means I put fast added constants into the config, do little efficiency things and stuff like that. Furthermore I made scrollbars not just be better shown threw all menus, but also work better (more accurate). Now V0.5.0 is on GitHub, if you find bugs, please comment them under this devlog.
Fixed Bugs Now the game have finally also in terminal’s ultra game the option to pause the game and take a break. I also added a mechanism for players who want to be really fast that allows the program to submit commands automatically to reduce the submit click every action. Furthermore the achievement screen now has a two way navigation what means that you could either press the left/right arrow keys of your keyboard or click with your mouse on the magic appearing buttons. PS: V0.5.1 is out, it is an update mostly about bug fixing and just this little new features from witch 2 already should work in version beyond this.
Added Advanced Settings It took long and still look not that great and do not work all over, but the base is set. To explain it, the game now has variable sound volume. Also you can now change the language, even though I do not have already created a fully second language. Furthermore navigation keys and ultra input order are now choose able, so if you prefer it different you can now make it so. PS: This devlog is made just in reason off time, at the moment none of this get pushed to GitHub, because it is still in developing.
Languages What I used the last few hours for is what I probably will have to do for some more. Go threw the code and replace everything that generates an output the user could see with the new method that translate this. For this I also need to add the translations. As I needed a break I made the new design for the advanced settings, and now its like I wanted it to be. Furthermore the history in terminal supports now more sort options and - in front to change the meaning for this it has a new system that transfers everything with the same meaning into the same internal command.
Language and Efficiency After many hours I finally made it to add a second language to my game, beside English you know can have German texts in the game. Furthermore I took a little time to made the game as video export more efficient so that it takes 6 seconds less to export my test game.
Languages and Efficiency The last few hours I used to refresh my school knowledge in French and Spanish to create language packets for my game in this two languages. What I did a little bit earlier is to work again on video exporting efficiency and now it gone really fast. Exporting a video in normal scale takes less time then playing it, in twice the resolution it takes usually around the play time or a little longer and in the highest settings still long. But overall it is now much faster and with less possible problems. PS: The export time are different depending on the hardware of your computer.
New Design and better language including Now the Achievements have this existing new design that not just looks better but also provides you more easy the needed information. I also made the language better fitting to the shown elements and changed some slightly to make it also look better. Furthermore I fixed a few little bugs like that you could not select ctrl and key shortcuts by yourself or that the pause text has not reacted to that.
Code split and missing feature give With the latest version the game has grown to 14 game and 3 language constructor files, because I a made clearer structure in the code itself, that means I grabbed my screens file and extracted everything that was in there but with questionable reason. So the new files helpers and alt_hover was created. The task of alt_hover is explicit to handle everything containing the keyboard navigation possibilities. Helpers on the other hand is made for everything that is like a config but little more. (I know, that my config still is more as it should, I’ll try to change this as soon as possible.) Also I added with this update missing features that already should be in there like that the keyboard navigation also works in the advanced settings or that like you see in the picture the buttons in settings have an own color palette to make sure that it is clear that they at first are toggle buttons and have an associated color for each of their states. Furthermore I fixed a few little bugs, like that the back jump to the achievement button is not working with the up going higher than to the full-screen button. I hope you enjoy version 0.6.1
Bug fixing and redesign Over the last thew versions, even though I spend a lot of time in debugging, many little bugs appear. Sometimes they comes just from moving a function or mistyping and sometimes deeper. So with this version I fixed again many of them, like wrong time show in the achievements and many others. Furthermore I worked and correcting and redesigning the whole terminal help logic, giving the main achievements new names and, like you see in the picture, modified the general achievements screen so that it not just looks better, but also feels better in reason of an improved algorithm to hide the mouse and navigation buttons. PS: If you use it and find a bug, it would be really nice if you could comment it.
System remake It took a while and I forgot a little the time it used, but I did it. Now the whole game runs more efficient threw the new system that handles buttons separate and keeps them cached, so they do not have to be completely calculated every frame new. Also some designs changed slightly.
Chapters I added with the help of AI the possibility to have chapters into my game. So you now can go exactly to the start of every action like you do in the game itself. And even though I know that this do not make that much of the decision how good the program is, it is still another thing that I now know how to do and I think that this is also really important.
Better Structure, Same Simplicity The last (many) hours I spend with one thing. Making sure the codes run even with new and better structure internal. This was also really important, because it made it easier to integrate multiple new things. One thing is, that now into the nearly same and reliable stats design comes buttons. This buttons are basically the headers, means size, mode, games … . If you click on them they basically sort the stats after this header. Furthermore the terminal got a big upgrade, because now it has three new ways to get deeper into your game. At first you can now easily check if you have paused matches. Also you can check your export history, which new feature made it actually also possible to get warned if you export a single match multiple times. And last but not least analysis. Because the game now got a deeper understanding of how you are playing and what are your trends and you can view all of this by the terminals history. (And I was shocked how good it worked with my recent 150 matches.) I hope, I didn’t overwhelmed you with all these information and that you are as curious for the new version as I am.
Finalizing basic functions My goal is the finish the app as soon as possible. So I am know fixing the last few bugs and add the last missing feature that the program should have. This devlog should just let you know, that the last days were full of deciding what could I do to improve the program and were the bugs are. (Poorly most of this sort of spend time is not count toward the project.) The provided screenshots shows a thing I am currently trying to do better, the extended settings, because like you see, the design is very bad.
Tutorial I added a tutorial that shows the player how the game mainly works and give him the information about the shortcuts. Also I added a function to make the clock a reopen point for a small explanation what the program can do.
Probably the last devlog on this project After more than 220 hours of coding and more and another 200 hours of deciding what to do and talking to other developers about how I could make this program run and do it good, I finally think that it is on a point at which I can think about shipping it. It runs, has no crucial bugs I noticed and is efficient enough to not take several hours just for the export of an mp4 video. Maybe I will add more features later, so do not be shy to comment what you like and what I should change and of course, please tell me if you have found any bug or unnatural behavior. OS Declaration Even though my goal was to make MATI run on every of the big 3 (Mac-OS, Linux, Windows) the current version just runs as wanted on Windows, due to different handling with graphic, which just means, that not every text is placed wright and that the overall look is scratched on Linux and Mac-OS. PS: The picture is the app icon.
Fixed the Read-Me After I got noticed that my Read-Me is not quite what it has to be, I have done a new version that should fit better into the requirements.
Ships:
Welcome to MATI Discover MATI, a simple and relaxing Sudoku-inspired puzzle game designed to challenge your number-solving skills without putting you under pressure. Your goal is simple: Find the right numbers and complete every row and column correctly. MATI is designed to be fun and stress-free: No Time Pressure: Disable the timer whenever you want and play at your own pace. No Mistakes to Fear: MATI doesn’t punish you for incorrect entries. Simply correct them whenever you notice a mistake. 4 Different Sizes: Choose from four puzzle sizes to match your preferred challenge. Built-in Terminal: Prefer an old-school experience? Play MATI directly in its integrated terminal. Full Keyboard Support: No mouse or trackpad? No problem! MATI can be controlled entirely with your keyboard. ! Development Notice! MATI is still under active development. More features, improvements, and refinements are planned for future updates. Thank you for checking out MATI!...
|
1792853463.92683
|
1792939863.92683
|
|
4644
|
Zero-Assist by @Tan-May | Stardance
|
Tan-May
|
0
|
229.35
|
0
|
[]
|
[{"post_id": 40727, "ts": "202 [{"post_id": 40727, "ts": "2026-08-04T13:20:13Z", "hours": 13.7692, "text": "Check this out !! so yesterday i finished with the MCP implementation of the app , i implemented 4 transport method (STDIO,,HTTP,SSE and the LOCALHOST_STDIO) so when i was testing out i found out that only one of them is working properly , (the http one ) to which i connected multiple apps , mcp’s etc everything was working fine but when i tested the other transport method , not even a single one was working because it all needed the desktop to run with the specific packages so unfortunately i was not able to use it and i also find out about the nasa mcp where they daily upload the images mars rover images etc so i tried to test it but the problem was that the mcp was not http instead it was the STDIO so i was sad cause i had to fix first the mcp issue then test it but when i was in school in break i was getting board and opened the app and i had an idea like cant we just convert the normal stdio into the http mcp using the termux ? after asking to claude it said definitely we can do this so then i setuped the env(i will add a screenshot below ) and made a proxy server which converts the normal stdio mcp to the http steamtable and i was then able to access it locally using my app (i will add the image of it too) and i managed to connect to the mcp and fetch the images , now everything is working completely fine just the remaining part is the remaining transport which i will fix it some how !! also i will add some images i fetched below"}, {"post_id": 39007, "ts": "2026-08-01T17:30:37Z", "hours": 3.4689, "text": "Update !!! new devlog here … so now after doing some more research on the mcps and the implementation plans etc etc now im finally going all on it , ive added a ui component of the MCP in the Connection/Plugin/MCP , where i added few premade mcp options like (GitHub , brave search , external postgre sql etc ..) also there i added the option of the add custom server in which use can add custom server where currently the transport options are (STDIO,HTTP,SSE,LOCALHOST_STDIO (where you can add local mcp servers using the apps like termux etc ) so now that the ui is completed now i will move on to the connection part of the ui to the backend rust engine via uniffi )"}, {"post_id": 38224, "ts": "2026-07-31T14:56:23Z", "hours": 2.8122, "text": "Devlog time :> so now I’m continuing with the implementation of the MCP in the app like i previously talked now when i did some tinkering with the rust code using the ai , i managed to get all the connected MCP tools into the config file of the ai the config is getting updated now but the problem is that the config is constantly keeps changing don’t know what’s happening i guess the the problem is in the toml config generator which is glitching out , so now im trying fixing it from lots of time now , i guess i might have to use the antigravity to fix this but i exhausted my weekly limit cause I’m on a free tier 😭😭.. ill catch up with yall later till then bye bye 🙆.."}, {"post_id": 38050, "ts": "2026-07-31T07:21:16Z", "hours": 3.8936, "text": "Hello Hello Hello new devlog here , so now i started with the implementation of the MCP believe me guys once the app gets the MCP the app will go to another level , like it will then support literally any app (any app) it can perform actions like the mcp does but in simpler way also when i started with implementation i hit the problem again the code is there in the zeroclaw engine but again the problem is that its meant to run on the desktop so now we again have to do some changes in code and make the mcp run natively on the phone , i also found out some resources to do it like ( https://github.com/modelcontextprotocol/kotlin-sdk ) which is good so now the idea is something similar like shown in the screenshot below taken from the chat gpt …."}, {"post_id": 37593, "ts": "2026-07-30T13:01:48Z", "hours": 7.1106, "text": "Devlog here , so now i added the new cool animation (thinking orb ) this animation was totally inspired from the ( https://orbs.jakubantalik.com/ ) but the problem was that the orb was written in the typescript which wont work in our app cause our app is written in the kotlin so what i did was i downloaded the zip file from the repo pasted it to the claude and told him to convert it into kotlin for me and surprisingly the results was amazing , i will share the video recording too , and the other part i worked on was i added a few voices for my apps from the hugging face so now the user can use the custom voices too and also if he wants to use some of the default voices , the option is there do download in the app, some voices ( https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx , https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx , https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_GB/alan/medium/en_GB-alan-medium.onnx ) for someone whose interested …"}, {"post_id": 34542, "ts": "2026-07-25T10:46:59Z", "hours": 5.4758, "text": "Devlog: Google Workspace Integration This week I worked on integrating Google Workspace into Zero-Assist , allowing the AI to securely access services like Gmail, Google Drive, Google Docs, and Google Sheets after the user grants permission. The ZeroClaw engine already supports Google Workspace CLI (GWS) , but it was originally built for desktop Linux and expects a desktop environment with GWS already installed. Since Zero-Assist runs inside an Alpine Linux sandbox on Android using PRoot , that approach doesn’t work directly. Instead of rewriting the integration, I kept the existing architecture and adapted it for Android. What I Implemented I modified the sandbox installation process so that GWS is installed automatically whenever the user installs the standard sandbox packages. This means users don’t need to manually install or configure the CLI. Inside the app, I added a new Google Workspace plugin under: Connections → Plugins → Installed → Google Workspace When the user signs in, the Android app completes the OAuth flow and generates the required Google Workspace configuration files. To bridge Android and the Linux sandbox, I use the existing Android ↔ PRoot bridge . The plan is: User Login ↓ Android creates GWS credentials ↓ Credentials copied into PRoot sandbox ↓ Sandbox GWS CLI uses the same credentials ↓ AI can access approved Google services This keeps authentication native while allowing the Linux CLI to work without requiring the user to touch the terminal. Google Cloud Setup I also created a dedicated Google Cloud Console project for Zero-Assist. The project uses a Web Application OAuth client , which is required by the Google Workspace CLI authentication flow. I enabled the necessary APIs, including: Gmail API Google Drive API Google Docs API Google Sheets API More APIs can be enabled as additional integrations are added. Current Problem The authentication flow itself works correctly, and users can successfully sign in. The issue is that the generated credential/configuration files are not being copied correctly into the Linux sandbox . Because of this, the sandboxed GWS CLI cannot find the required authentication files, causing every Google Workspace command to fail. The current challenge isn’t OAuth—it’s reliably synchronizing credentials between Android and the PRoot environment. Once this bridge is working, users will simply sign in once, choose which Google services they want to grant access to, and Zero-Assist will be able to securely interact with those services without any manual setup. note:This devlog is written with hands and then passed to the chatgpt to format it with the .md because im very lazy to play with those colons and #’s"}, {"post_id": 33937, "ts": "2026-07-24T08:09:07Z", "hours": 6.6875, "text": "Device Control Development Update Yesterday I worked on expanding the Device Control system in my AI assistant. The idea behind this feature is to allow the AI to perform real actions on an Android device using the Accessibility Service . When the user gives a command such as “Subscribe to MrBeast on YouTube” , the main AI analyzes the request and delegates it to the Device Control tool. Current Workflow Launch the required application using: PackageManager.getLaunchIntentForPackage() startActivity() Capture a compressed screenshot of the current screen. Analyze the screenshot to identify UI elements and their screen coordinates. Navigate the interface and perform actions through the Android Accessibility APIs. Current Features Open applications Tap at (x, y) Swipe gestures Type text These core primitives allow the AI to interact with almost any Android application through UI automation. Future Improvements My main goals are to improve both speed and accuracy . Instead of navigating through multiple screens for simple system operations, I plan to add native high-level commands directly into the Device Control tool, such as: flashlight_toggle wifi_toggle bluetooth_toggle mobile_data_toggle volume_set brightness_set take_screenshot lock_screen open_notifications open_quick_settings go_home go_back open_recents These commands will allow the AI to execute common Android actions instantly without relying on visual navigation. For more complex tasks—such as interacting with third-party applications—the tool will continue using the screenshot + coordinate-based navigation pipeline. Long-Term Vision The goal is to build a hybrid Device Control system: Native commands for common Android operations (fast, reliable, and efficient). Vision-guided UI automation for complex interactions within any application. This architecture will significantly reduce execution time, improve reliability, and make the assistant capable of handling virtually any task on an Android device."}, {"post_id": 33134, "ts": "2026-07-22T19:18:54Z", "hours": 15.1933, "text": "So i basically went through the whole device control system and hardened it. the planner was splitting compound goals like “open instagram and message rohit” into separate calls which broke everything. also fixed it so the loop doesn’t just bail on the first response - it actually executes the action first. scroll was crashing if the planner didn’t send a direction so now it defaults down. and exceptions in the callback handler were just silently killing the process so now everything is caught and logged properly. added loop detection so it doesn’t get stuck repeating the same thing, post-action screen verification, and 44 tests to cover it all. very happy that it worked , it took lots of time but eventually i think the results are very very good though this thing not works great on the local ai’s but with the cheap api like openrouter/free , this thing can give pretty good results"}, {"post_id": 32219, "ts": "2026-07-21T07:52:35Z", "hours": 20.9892, "text": "okay so after spending lots of time on this issue , im finally able to make this work again , the problem was that (bin/sh, ust/bin/env) never extracted because of one code issue where i accidently mentioned them as the read only memory in the apps storage so the distro was installing also getting extracted but becacuse of the read only type of file , the app was not able to perform any actions on it , so now after taking the help from the open code now the sandbox is fully functional and working on every devices , also ive added some default packages which will get installed during the setup of the sandbox such as (wget, git , python3, jq, py3-pip, nodejs ,lftp and the openssh-client) just using the single command (apk add –no-cache bash curl wget git jq python3 py3-pip nodejs openssh-client lftp rsync)"}, {"post_id": 30521, "ts": "2026-07-18T05:11:12Z", "hours": 13.5486, "text": "Hello guys, devlog here!I finally got the Linux sandbox in Zero-Assist working end-to-end! The sandbox runs Alpine Linux through PRoot directly on Android without requiring root.Getting it working was harder than expected, though. I ran into several Android-specific issues.Fixing the SandboxThe first problem was Alpine’s heavy use of BusyBox hardlinks. My TAR extractor used File.copyTo(), which didn’t preserve executable permissions, causing errors like:proot error: execve(“/bin/sh”): Permission denied I fixed this by preserving executable bits:linkTarget.copyTo(outFile, overwrite = true) if (linkTarget.canExecute()) { outFile.setExecutable(true, false) } Some hardlinks were also extracted before BusyBox itself, so I added a second repair pass after extraction to restore critical commands like /bin/sh, /bin/ls, and /bin/cat.Symlinks were another problem because Android can block their creation. I added a fallback that copies the target when creating the actual symlink fails:try { Files.createSymbolicLink(outFile.toPath(), Paths.get(linkName)) } catch (e: Exception) { fallback.copyTo(outFile, overwrite = true) } I also had problems directly executing PRoot because some Android app directories can be noexec. The solution was to launch PRoot through Android’s system linker:val args = arrayOf( “/system/bin/linker64”, prootPath, “–rootfs=$rootfsPath”, “/bin/sh”, “-c”, command ) I also added corrupted download detection and automatic Alpine mirror fallback, making the rootfs installation much more reliable.Giving the AI Linux ToolsAfter getting the sandbox stable, I added two AI tools:sandbox_execute — Executes commands inside Alpine and supports persistent shell state, working directories, environment variables, timeouts, and background processes.sandbox_manage_process — Lets the AI list, monitor, read logs from, and kill background processes.For example, the AI can execute:{ “command”: “python3 –version && uname -a”, “working_dir”: “/root” } Or start a background server:{ “command”: “python3 -m http.server 8000”, “background”: true } The execution pipeline now looks like:AI Agent ↓ Rust Tool Layer ↓ Authenticated Local HTTP Bridge ↓ Kotlin Sandbox Manager ↓ PRoot ↓ Alpine Linux The Rust runtime communicates with the Kotlin sandbox through a localhost bridge on 127.0.0.1:49481, protected by a randomly generated per-process bearer token.And now the sandbox is fully functional end-to-end!The AI can execute real Linux commands, install packages, maintain persistent shell sessions, run scripts, start background processes, inspect their logs, and manage them — all inside Alpine Linux running directly on Android without root.This was one of the hardest parts of Zero-Assist so far, but now the AI finally has its own real Linux environment to work with."}, {"post_id": 29333, "ts": "2026-07-16T06:39:51Z", "hours": 11.0894, "text": "Giving Zero-Assist Its Own Linux Sandbox A lot of features I want in Zero-Assist need actual Linux tools: shell commands, Python, Git, Node.js, CLI tools, etc. I didn’t want this to require root, so I built a local Alpine Linux sandbox using PRoot that runs entirely on-device. The architecture is basically: AI daemon → sandbox tool → HTTP bridge → Kotlin sandbox manager → PRoot → Alpine Getting PRoot running One annoying problem was Android’s noexec restrictions. PRoot is stored inside the app’s data/native library directory and can’t always be executed normally. The solution was launching it through Android’s dynamic linker: private fun buildProcessArgs ( command : String , workingDir : String ): Array < String > { val args = arrayOf ( prootPath , \"--rootfs=$rootfsPath\" , \"--bind=/dev\" , \"--bind=/proc\" , \"--bind=/sys\" , \"--bind=$homePath:/root\" , \"--bind=$tmpPath:/tmp\" , \"-0\" , \"-w\" , workingDir , \"/bin/sh\" , \"-c\" , command ) return if ( ANDROID_LINKER != null ) arrayOf ( ANDROID_LINKER , * args ) else args } So commands effectively go through: /system/bin/linker64 → PRoot → Alpine → command This lets the bundled PRoot code run despite the noexec restriction. Connecting Rust and Kotlin My AI daemon is written in Rust, while the sandbox is managed by Kotlin. I connected them using a small NanoHTTPD server running only on localhost. return when ( session . uri ) { \"/health\" -> handleHealth () \"/execute\" -> handleExecute ( session ) \"/manage_process\" -> handleManageProcess ( session ) else -> errorJson ( Response . Status . NOT_FOUND , \"Unknown path: ${session.uri}\" ) } The Rust daemon sends authenticated requests to 127.0.0.1:49481 . The AI currently gets two tools: sandbox_execute - run Linux commands sandbox_manage_process - manage background processes Persistent shell sessions I wanted the sandbox to behave like an actual terminal instead of starting from scratch for every command. If the AI runs: cd /root/project export TEST = hello the next tool call stays in /root/project and keeps the environment variable. Each conversation gets a separate persistent shell: Conversation A → Shell A Conversation B → Shell B This keeps cwd/environment state while preventing different conversations from affecting each other. Background commands are isolated differently. Each one gets a separate PRoot executor and is tracked by a process manager. The AI can start a long-running command, continue doing other things, then check its logs or kill it later. Installing Alpine The sandbox manager handles the full setup: Download Alpine → Extract → Fix hardlinks/permissions → apk update → Install tools → Ready The hardlink fix was needed because some Alpine tar entries reference files that haven’t been extracted yet, which caused extraction failures on Android. Right now the sandbox comes with Bash, Python + pip, Node.js, Git, curl, wget, jq, SSH, lftp and rsync. The main parts are: ProotExecutor - executes commands LinuxSandboxManager - lifecycle/setup SandboxBridgeServer - Rust ↔ Kotlin bridge SandboxProcessManager - background processes PersistentSandboxShell - per-conversation shell state There is still more I want to improve, especially filesystem sharing, networking and reliability for longer agent tasks. But the main system is finally working: Zero-Assist can now give an AI agent a real Linux userspace running locally inside an Android app without requiring root. This started with the idea of somehow giving the AI a tiny Linux computer inside the app. Now it actually has one."}, {"post_id": 28451, "ts": "2026-07-14T18:16:53Z", "hours": 4.185, "text": "Giving My Android AI App Its Own Linux Sandbox One of the biggest problems with my app was that a lot of the features I wanted to build actually needed a real desktop environment. Things like: Running shell commands Browser automation Using desktop CLI tools Installing packages on demand Running scripts ZeroClaw already supports these kinds of capabilities, but on Android I couldn’t really use them to their full potential. The app simply didn’t have an environment that could support everything properly. So I decided… Why not give the app its own minimal Linux desktop? The Initial Research Luckily, I already had some experience with Linux. I had previously played around with: Linux distros PRoot chroot Minimal desktop environments So I started looking at every possible approach. Option 1 — Android’s default shell At first I thought about using the shell that every Android app already gets. It looked simple. But after experimenting with it, I realized it was missing a lot of the commands and tools I actually needed. That completely defeated the purpose of having a proper sandbox. So I dropped that idea. Option 2 — chroot Next I started researching chroot. Honestly, from a technical point of view, chroot is amazing. It gets extremely close to a real Linux environment. Performance is great and it behaves much more like an actual desktop installation. There was only one problem. It requires a rooted device. That was an immediate deal breaker. I don’t want someone to root their phone just to use my app. So chroot was out too. Option 3 — PRoot After a lot of brainstorming, reading documentation, and trying different ideas, I finally settled on PRoot. It isn’t perfect. There are still some limitations compared to a real Linux installation, but I’ll talk about those another time. The important part is this: No root required Works on normal Android devices Can run a real Linux userspace Supports the tools my AI actually needs For what I’m trying to build, it was the best balance. Choosing the distro I wanted something lightweight. Really lightweight. So I picked Alpine Linux . The base image is around 5 MB . Yes… Literally 5 MB. After installing the packages I consider “essential” for the AI (things like Python, pip, curl, git, etc.), the whole environment comes to roughly 700 MB . That gives the AI a solid starting point without making users download multiple gigabytes on day one. If more tools are needed later, the AI can simply install them inside the sandbox. Current Progress I’ve finally started implementing everything. So far I’ve added: sandbox_client.rs sandbox_main.kt Configuration files for the sandbox Default package lists that will be installed automatically There’s still a lot left to build, but the foundation is finally there. This is probably one of the biggest architectural changes I’ve made to the app so far. Instead of trying to force Android to behave like a desktop, I’m giving the AI its own Linux environment that it can actually work inside. Still a long way to go !!! MAKE SURE TO FOLLOW THE PROJECT YES THE IMAGE IS AI GENETRATED , BUT I DIDNT KNOW WHAT TO DO FOR BETTER EXPLAINATION SO I DID IT :D"}, {"post_id": 25882, "ts": "2026-07-10T11:26:04Z", "hours": 11.9064, "text": "After long time … hello guys making this devlog after very long time , i had an issue ,when i was cleaning up my project , removing the dead code and optimizing the app where i was taking the help of the antigravity for this , i accidently deleted the hardware side in the zero claw (engine of zero assist) which was in beta i was just remaining to test it because i didn’t have any proper hardware to do it so it was remaining to test and unfortunately i didn’t even had the code pushed on the GitHub which made the situation worst so now I’ve nearly fixed it , the app is successfully building properly and now I’ve decided to push the code every day if possible on the GitHub to avoid this type of things and I’m writing this devlog because of the new rule i came by where only 10 hrs. will be counted MY BAD LUCK now my 12 hrs. are going to waste 😭😭because i was not uploading the devlog and the time increased so uploading this asap so that my next time will be counted !!"}, {"post_id": 12384, "ts": "2026-06-20T06:53:41Z", "hours": 26.2319, "text": "Devlog #8 — Zero-Assist I added a Skills Section to Zero-Assist, and it’s probably one of the more useful things we’ve shipped so far. What It Is Skills are installable modules built by the Zeroclaw community that extend what the app can do. Things like Doc Writer, Auto-Coder, and more — each one teaches the app how to handle a specific type of task better. Install one, and Zero-Assist reads it and starts applying it automatically. No setup, no configuration, just tap and it works. These aren’t shortcuts or preset prompts. The app actually understands the skill and uses it to make smarter decisions when you’re working. Always Growing The library isn’t static. The community keeps adding new skills and updating existing ones, so the app naturally gets more capable over time without needing a big update from our end. Whatever gets added is available to you immediately. Big thanks to everyone in the Zeroclaw community who built and contributed skills — this whole section runs on your work. What’s Next We’re making it easier for more people to submit skills, and we’re looking at adding ratings and changelogs so you can track what’s new and what’s worth installing. More soon."}, {"post_id": 9693, "ts": "2026-06-16T03:16:35Z", "hours": 2.8722, "text": "Devlog #7 — Multi-Agent Architecture & Custom Agent Builder Zero-Assist just got a major upgrade. What if instead of one AI assistant, you had an entire team of AI specialists working together? That’s exactly what I’ve built. Multiple Agent System Zero-Assist now supports multiple specialized agents, each optimized for a specific role and workflow. Master Agent The brain of the operation. Orchestrates all agents Assigns tasks intelligently Monitors progress Routes requests to the best agent Researcher Agent Your personal information hunter. Searches the web Collects and analyzes data Returns structured insights Filters noise and focuses on relevant information Coder Agent Built for developers. Writes code Reviews code Fixes bugs Assists with architecture and implementation Planner Agent Turns chaos into clarity. Breaks down goals Creates actionable roadmaps Generates timelines Organizes complex projects Custom Agent Builder The most exciting feature in this update. You can now create your own specialized AI agents with just a few clicks. Customize: System Prompt Temperature Tags & Capabilities LLM Model Agent Role & Personality Want an AI Startup Advisor? Create one. Want a Bug-Hunting Expert? Create one. Want a Cybersecurity Specialist? Create one. The possibilities are endless. Why This Matters Most AI applications rely on a single model trying to do everything. Zero-Assist takes a different approach. Instead of one assistant, you get an entire ecosystem of AI specialists that can collaborate, delegate tasks, and work together to solve problems more efficiently. Each agent has: Its own configuration Its own expertise Its own behavior Its own model settings This creates a more scalable and intelligent workflow compared to traditional AI assistants. Vision The long-term goal isn’t just to build another chatbot. It’s to build an AI Operating System where users can create, orchestrate, and manage teams of intelligent agents that work together to accomplish complex tasks. And this is only the beginning. Screenshot attached below."}, {"post_id": 9256, "ts": "2026-06-15T15:22:43Z", "hours": 22.2608, "text": "#Devlog 6 -Zero-Assist Shipped a big update today. The app can now handle complex tasks much more reliably, and tools run in parallel instead of sequentially — so heavy workloads finish noticeably faster without the app choking midway. The smarter behavior actually came from Trimming down the soul.md, longterm-memory.md, agents.md, and user.md files reduced token usage significantly, and the model started reasoning better almost immediately. I tested it across several complex tasks and the output quality genuinely caught me off guard — results I didn’t expected!!! Voice has been a pain point for a while. Dug into the Piper latency issues, restructured the integration, and the pipeline is much smoother now. Still sounds robotic — that’s a problem I haven’t cracked yet — but the lag that made it frustrating to use is mostly gone. Overall the app feels like a different version of itself. More capable, leaner, and faster. Dropping Demo vid of the test runs below so you can see what it’s actually doing now. here is demo video too : https://youtube.com/shorts/F8sLD21dcWo"}, {"post_id": 6943, "ts": "2026-06-11T17:21:14Z", "hours": 15.2497, "text": "Devlog 5 – Channel Integration and Tool Access Today I spent most of my time working on one of the biggest features of the project so far: Channel Integration . The channels system already supports multiple platforms such as Telegram, WhatsApp, Slack, Discord, and several others. My goal was to connect these channels with the assistant so that it can interact with users across different platforms while still having access to the tools and capabilities available on the phone. To achieve this, I worked on properly connecting the Rust bridge with the Kotlin application. Once the communication layer was working correctly, I was able to expose several powerful capabilities to the assistant, including: Access to phone storage and files Accessibility-based device control Web tools and online actions Composio integrations File management and manipulation Cross-platform channel communication Various assistant tools that were previously isolated from each other This was a fairly complex task because multiple systems needed to communicate reliably. I also used AI assistance throughout the development process to help debug issues, validate approaches, and speed up implementation. In total, this work took roughly 12 hours . At the moment, I have not pushed the code to the repository because the feature still requires extensive testing. Since it touches storage access, tool execution, and communication across multiple services, I want to ensure everything is stable before making it public. Once I complete the testing phase, I will push the implementation to the repository. This feature significantly expands what the application can do. Instead of being just a chatbot, it is evolving into a full assistant platform capable of interacting with external services, managing files, controlling parts of the device, and communicating through multiple messaging platforms. The long-term vision is to create a system where users can build highly capable personal assistants that can perform real tasks rather than simply generate text. There is still a lot more work ahead, but today’s progress was a major step toward that goal. Stay tuned—some very exciting features are currently in development."}, {"post_id": 5481, "ts": "2026-06-09T09:01:08Z", "hours": 12.9753, "text": "Zero-Assist Devlog #4 — The Phone Is Now a Personal Chat Server so Devlog 4 is here. The main thing i fixed this time is the channels section of the app. channels are basically how Zero-Assist can gets input or give output to other app — like Telegram, WhatsApp, and other messaging apps. once you connect them, the app starts listening. but whats different now that channels are working, the phone isn’t just an AI assistant anymore. it’s your personal home server that you can message like a real in-person. what this actually means in practice: say you’re away and you message your own Telegram bot: “water the plants” — Zero-Assist picks that up, figures out what you mean, and either goes with an MQTT signal to your smart home setup or directly talks to your microcontroller over USB or BLE , whichever is available. no extra apps, no cloud, just your phone doing the work. same idea works for your homelab. you can message “ping my website” and the app will run the actual shell command on your phone and report back. this does need a one-time manual connection to set up, but after that it just works. basically the phone becomes a chat-controlled home automation that you own fully here is no cloud included except the llm , which you can also use the local llm . what i’m planning to add next: i’m planning a live dashboard screen for this — not raw logs, but a simplified readable feed. something like: “message received via Telegram → running plant watering command → sent MQTT signal ✓” the idea is it’s useful for people who like seeing what’s happening here, but written in plain language instead of technical stuff for the normal users . the hard part this time was : most of the time on this devlog went into connecting the Rust backend (which handles all the channel logic) to the Kotlin front-end of the app , so getting them to work together cleanly took a lot of debugging and was honestly the most frustrating part of this whole update. got it working though. more soon."}, {"post_id": 4198, "ts": "2026-06-07T12:47:20Z", "hours": 7.8933, "text": "devlog -3 added a new shared folder option int the app so that the app can share the storage from phone , it can open files edit files , manipulate the files and do lots of stuff with it , added the screenshot below"}, {"post_id": 3507, "ts": "2026-06-06T14:09:20Z", "hours": 18.2539, "text": "Devlog #2 is here!! so after the piper TTS update in devlog #1, I’ve been working on something way bigger — I added Composio integration to Zero-Assist for those who don’t know what composio is — it’s basically a platform that connects AI agents to over 1,000 apps like Gmail, Slack, GitHub, Notion, Salesforce, Google Drive and a lot more. think of it as the bridge between your AI and the rest of the internet. so now Zero-Assist can actually do things for you like — → send and read messages (if you give it the right permissions) → make notes in Notion automatically → send mails on your behalf → store your files to Google Drive → and a lot more depending on which apps you connect the best part is this feature was already there inside ZeroClaw (which is what Zero-Assist is built on), so it wasn’t built from scratch — it was more about bringing it properly into the Android app and making it actually usable. check out the video ( https://drive.google.com/file/d/1ZO56Ekrq7fu205Epqx8fH-Vkt_E5xc16/view?usp=sharing ) for a small demo of how it works"}, {"post_id": 1568, "ts": "2026-06-03T17:45:24Z", "hours": 3.4811, "text": "ZERO-ASSIST devlog 1 IM working on Zero-Assist voice assistant app on which im already working from March , the app has lots of features , i completely vibe coded the app but now im working on the finishing part of the app so today i improve the voice assist mode , the voice was really slow on cheaper Android phones. When you spoke to it, you’d wait 10+ seconds before hearing the voice response. What I fixed today 1️⃣ Made It Stop Waiting So Long Before: App waited up to 2.5-5 seconds to make sure the TTS Engine was ready Now: Only waits 0.9-1.8 seconds Result: Faster feedback !! You can also check the app here ( https://github.com/Tanmay-1122/Zero-Assist )"}]...
|
Title: Zero-Assist by @Tan-May | Stardance
Devlog Title: Zero-Assist by @Tan-May | Stardance
Devlogs:
ZERO-ASSIST devlog 1 IM working on Zero-Assist voice assistant app on which im already working from March , the app has lots of features , i completely vibe coded the app but now im working on the finishing part of the app so today i improve the voice assist mode , the voice was really slow on cheaper Android phones. When you spoke to it, you’d wait 10+ seconds before hearing the voice response. What I fixed today 1️⃣ Made It Stop Waiting So Long Before: App waited up to 2.5-5 seconds to make sure the TTS Engine was ready Now: Only waits 0.9-1.8 seconds Result: Faster feedback !! You can also check the app here ( https://github.com/Tanmay-1122/Zero-Assist )
Devlog #2 is here!! so after the piper TTS update in devlog #1, I’ve been working on something way bigger — I added Composio integration to Zero-Assist for those who don’t know what composio is — it’s basically a platform that connects AI agents to over 1,000 apps like Gmail, Slack, GitHub, Notion, Salesforce, Google Drive and a lot more. think of it as the bridge between your AI and the rest of the internet. so now Zero-Assist can actually do things for you like — → send and read messages (if you give it the right permissions) → make notes in Notion automatically → send mails on your behalf → store your files to Google Drive → and a lot more depending on which apps you connect the best part is this feature was already there inside ZeroClaw (which is what Zero-Assist is built on), so it wasn’t built from scratch — it was more about bringing it properly into the Android app and making it actually usable. check out the video ( https://drive.google.com/file/d/1ZO56Ekrq7fu205Epqx8fH-Vkt_E5xc16/view?usp=sharing ) for a small demo of how it works
devlog -3 added a new shared folder option int the app so that the app can share the storage from phone , it can open files edit files , manipulate the files and do lots of stuff with it , added the screenshot below
Zero-Assist Devlog #4 — The Phone Is Now a Personal Chat Server so Devlog 4 is here. The main thing i fixed this time is the channels section of the app. channels are basically how Zero-Assist can gets input or give output to other app — like Telegram, WhatsApp, and other messaging apps. once you connect them, the app starts listening. but whats different now that channels are working, the phone isn’t just an AI assistant anymore. it’s your personal home server that you can message like a real in-person. what this actually means in practice: say you’re away and you message your own Telegram bot: “water the plants” — Zero-Assist picks that up, figures out what you mean, and either goes with an MQTT signal to your smart home setup or directly talks to your microcontroller over USB or BLE , whichever is available. no extra apps, no cloud, just your phone doing the work. same idea works for your homelab. you can message “ping my website” and the app will run the actual shell command on your phone and report back. this does need a one-time manual connection to set up, but after that it just works. basically the phone becomes a chat-controlled home automation that you own fully here is no cloud included except the llm , which you can also use the local llm . what i’m planning to add next: i’m planning a live dashboard screen for this — not raw logs, but a simplified readable feed. something like: “message received via Telegram → running plant watering command → sent MQTT signal ✓” the idea is it’s useful for people who like seeing what’s happening here, but written in plain language instead of technical stuff for the normal users . the hard part this time was : most of the time on this devlog went into connecting the Rust backend (which handles all the channel logic) to the Kotlin front-end of the app , so getting them to work together cleanly took a lot of debugging and was honestly the most frustrating part of this whole update. got it working though. more soon.
Devlog 5 – Channel Integration and Tool Access Today I spent most of my time working on one of the biggest features of the project so far: Channel Integration . The channels system already supports multiple platforms such as Telegram, WhatsApp, Slack, Discord, and several others. My goal was to connect these channels with the assistant so that it can interact with users across different platforms while still having access to the tools and capabilities available on the phone. To achieve this, I worked on properly connecting the Rust bridge with the Kotlin application. Once the communication layer was working correctly, I was able to expose several powerful capabilities to the assistant, including: Access to phone storage and files Accessibility-based device control Web tools and online actions Composio integrations File management and manipulation Cross-platform channel communication Various assistant tools that were previously isolated from each other This was a fairly complex task because multiple systems needed to communicate reliably. I also used AI assistance throughout the development process to help debug issues, validate approaches, and speed up implementation. In total, this work took roughly 12 hours . At the moment, I have not pushed the code to the repository because the feature still requires extensive testing. Since it touches storage access, tool execution, and communication across multiple services, I want to ensure everything is stable before making it public. Once I complete the testing phase, I will push the implementation to the repository. This feature significantly expands what the application can do. Instead of being just a chatbot, it is evolving into a full assistant platform capable of interacting with external services, managing files, controlling parts of the device, and communicating through multiple messaging platforms. The long-term vision is to create a system where users can build highly capable personal assistants that can perform real tasks rather than simply generate text. There is still a lot more work ahead, but today’s progress was a major step toward that goal. Stay tuned—some very exciting features are currently in development.
#Devlog 6 -Zero-Assist Shipped a big update today. The app can now handle complex tasks much more reliably, and tools run in parallel instead of sequentially — so heavy workloads finish noticeably faster without the app choking midway. The smarter behavior actually came from Trimming down the soul.md, longterm-memory.md, agents.md, and user.md files reduced token usage significantly, and the model started reasoning better almost immediately. I tested it across several complex tasks and the output quality genuinely caught me off guard — results I didn’t expected!!! Voice has been a pain point for a while. Dug into the Piper latency issues, restructured the integration, and the pipeline is much smoother now. Still sounds robotic — that’s a problem I haven’t cracked yet — but the lag that made it frustrating to use is mostly gone. Overall the app feels like a different version of itself. More capable, leaner, and faster. Dropping Demo vid of the test runs below so you can see what it’s actually doing now. here is demo video too : https://youtube.com/shorts/F8sLD21dcWo
Devlog #7 — Multi-Agent Architecture & Custom Agent Builder Zero-Assist just got a major upgrade. What if instead of one AI assistant, you had an entire team of AI specialists working together? That’s exactly what I’ve built. Multiple Agent System Zero-Assist now supports multiple specialized agents, each optimized for a specific role and workflow. Master Agent The brain of the operation. Orchestrates all agents Assigns tasks intelligently Monitors progress Routes requests to the best agent Researcher Agent Your personal information hunter. Searches the web Collects and analyzes data Returns structured insights Filters noise and focuses on relevant information Coder Agent Built for developers. Writes code Reviews code Fixes bugs Assists with architecture and implementation Planner Agent Turns chaos into clarity. Breaks down goals Creates actionable roadmaps Generates timelines Organizes complex projects Custom Agent Builder The most exciting feature in this update. You can now create your own specialized AI agents with just a few clicks. Customize: System Prompt Temperature Tags & Capabilities LLM Model Agent Role & Personality Want an AI Startup Advisor? Create one. Want a Bug-Hunting Expert? Create one. Want a Cybersecurity Specialist? Create one. The possibilities are endless. Why This Matters Most AI applications rely on a single model trying to do everything. Zero-Assist takes a different approach. Instead of one assistant, you get an entire ecosystem of AI specialists that can collaborate, delegate tasks, and work together to solve problems more efficiently. Each agent has: Its own configuration Its own expertise Its own behavior Its own model settings This creates a more scalable and intelligent workflow compared to traditional AI assistants. Vision The long-term goal isn’t just to build another chatbot. It’s to build an AI Operating System where users can create, orchestrate, and manage teams of intelligent agents that work together to accomplish complex tasks. And this is only the beginning. Screenshot attached below.
Devlog #8 — Zero-Assist I added a Skills Section to Zero-Assist, and it’s probably one of the more useful things we’ve shipped so far. What It Is Skills are installable modules built by the Zeroclaw community that extend what the app can do. Things like Doc Writer, Auto-Coder, and more — each one teaches the app how to handle a specific type of task better. Install one, and Zero-Assist reads it and starts applying it automatically. No setup, no configuration, just tap and it works. These aren’t shortcuts or preset prompts. The app actually understands the skill and uses it to make smarter decisions when you’re working. Always Growing The library isn’t static. The community keeps adding new skills and updating existing ones, so the app naturally gets more capable over time without needing a big update from our end. Whatever gets added is available to you immediately. Big thanks to everyone in the Zeroclaw community who built and contributed skills — this whole section runs on your work. What’s Next We’re making it easier for more people to submit skills, and we’re looking at adding ratings and changelogs so you can track what’s new and what’s worth installing. More soon.
After long time … hello guys making this devlog after very long time , i had an issue ,when i was cleaning up my project , removing the dead code and optimizing the app where i was taking the help of the antigravity for this , i accidently deleted the hardware side in the zero claw (engine of zero assist) which was in beta i was just remaining to test it because i didn’t have any proper hardware to do it so it was remaining to test and unfortunately i didn’t even had the code pushed on the GitHub which made the situation worst so now I’ve nearly fixed it , the app is successfully building properly and now I’ve decided to push the code every day if possible on the GitHub to avoid this type of things and I’m writing this devlog because of the new rule i came by where only 10 hrs. will be counted MY BAD LUCK now my 12 hrs. are going to waste 😭😭because i was not uploading the devlog and the time increased so uploading this asap so that my next time will be counted !!
Giving My Android AI App Its Own Linux Sandbox One of the biggest problems with my app was that a lot of the features I wanted to build actually needed a real desktop environment. Things like: Running shell commands Browser automation Using desktop CLI tools Installing packages on demand Running scripts ZeroClaw already supports these kinds of capabilities, but on Android I couldn’t really use them to their full potential. The app simply didn’t have an environment that could support everything properly. So I decided… Why not give the app its own minimal Linux desktop? The Initial Research Luckily, I already had some experience with Linux. I had previously played around with: Linux distros PRoot chroot Minimal desktop environments So I started looking at every possible approach. Option 1 — Android’s default shell At first I thought about using the shell that every Android app already gets. It looked simple. But after experimenting with it, I realized it was missing a lot of the commands and tools I actually needed. That completely defeated the purpose of having a proper sandbox. So I dropped that idea. Option 2 — chroot Next I started researching chroot. Honestly, from a technical point of view, chroot is amazing. It gets extremely close to a real Linux environment. Performance is great and it behaves much more like an actual desktop installation. There was only one problem. It requires a rooted device. That was an immediate deal breaker. I don’t want someone to root their phone just to use my app. So chroot was out too. Option 3 — PRoot After a lot of brainstorming, reading documentation, and trying different ideas, I finally settled on PRoot. It isn’t perfect. There are still some limitations compared to a real Linux installation, but I’ll talk about those another time. The important part is this: No root required Works on normal Android devices Can run a real Linux userspace Supports the tools my AI actually needs For what I’m trying to build, it was the best balance. Choosing the distro I wanted something lightweight. Really lightweight. So I picked Alpine Linux . The base image is around 5 MB . Yes… Literally 5 MB. After installing the packages I consider “essential” for the AI (things like Python, pip, curl, git, etc.), the whole environment comes to roughly 700 MB . That gives the AI a solid starting point without making users download multiple gigabytes on day one. If more tools are needed later, the AI can simply install them inside the sandbox. Current Progress I’ve finally started implementing everything. So far I’ve added: sandbox_client.rs sandbox_main.kt Configuration files for the sandbox Default package lists that will be installed automatically There’s still a lot left to build, but the foundation is finally there. This is probably one of the biggest architectural changes I’ve made to the app so far. Instead of trying to force Android to behave like a desktop, I’m giving the AI its own Linux environment that it can actually work inside. Still a long way to go !!! MAKE SURE TO FOLLOW THE PROJECT YES THE IMAGE IS AI GENETRATED , BUT I DIDNT KNOW WHAT TO DO FOR BETTER EXPLAINATION SO I DID IT :D
Giving Zero-Assist Its Own Linux Sandbox A lot of features I want in Zero-Assist need actual Linux tools: shell commands, Python, Git, Node.js, CLI tools, etc. I didn’t want this to require root, so I built a local Alpine Linux sandbox using PRoot that runs entirely on-device. The architecture is basically: AI daemon → sandbox tool → HTTP bridge → Kotlin sandbox manager → PRoot → Alpine Getting PRoot running One annoying problem was Android’s noexec restrictions. PRoot is stored inside the app’s data/native library directory and can’t always be executed normally. The solution was launching it through Android’s dynamic linker: private fun buildProcessArgs ( command : String , workingDir : String ): Array < String > { val args = arrayOf ( prootPath , "--rootfs=$rootfsPath" , "--bind=/dev" , "--bind=/proc" , "--bind=/sys" , "--bind=$homePath:/root" , "--bind=$tmpPath:/tmp" , "-0" , "-w" , workingDir , "/bin/sh" , "-c" , command ) return if ( ANDROID_LINKER != null ) arrayOf ( ANDROID_LINKER , * args ) else args } So commands effectively go through: /system/bin/linker64 → PRoot → Alpine → command This lets the bundled PRoot code run despite the noexec restriction. Connecting Rust and Kotlin My AI daemon is written in Rust, while the sandbox is managed by Kotlin. I connected them using a small NanoHTTPD server running only on localhost. return when ( session . uri ) { "/health" -> handleHealth () "/execute" -> handleExecute ( session ) "/manage_process" -> handleManageProcess ( session ) else -> errorJson ( Response . Status . NOT_FOUND , "Unknown path: ${session.uri}" ) } The Rust daemon sends authenticated requests to 127.0.0.1:49481 . The AI currently gets two tools: sandbox_execute - run Linux commands sandbox_manage_process - manage background processes Persistent shell sessions I wanted the sandbox to behave like an actual terminal instead of starting from scratch for every command. If the AI runs: cd /root/project export TEST = hello the next tool call stays in /root/project and keeps the environment variable. Each conversation gets a separate persistent shell: Conversation A → Shell A Conversation B → Shell B This keeps cwd/environment state while preventing different conversations from affecting each other. Background commands are isolated differently. Each one gets a separate PRoot executor and is tracked by a process manager. The AI can start a long-running command, continue doing other things, then check its logs or kill it later. Installing Alpine The sandbox manager handles the full setup: Download Alpine → Extract → Fix hardlinks/permissions → apk update → Install tools → Ready The hardlink fix was needed because some Alpine tar entries reference files that haven’t been extracted yet, which caused extraction failures on Android. Right now the sandbox comes with Bash, Python + pip, Node.js, Git, curl, wget, jq, SSH, lftp and rsync. The main parts are: ProotExecutor - executes commands LinuxSandboxManager - lifecycle/setup SandboxBridgeServer - Rust ↔ Kotlin bridge SandboxProcessManager - background processes PersistentSandboxShell - per-conversation shell state There is still more I want to improve, especially filesystem sharing, networking and reliability for longer agent tasks. But the main system is finally working: Zero-Assist can now give an AI agent a real Linux userspace running locally inside an Android app without requiring root. This started with the idea of somehow giving the AI a tiny Linux computer inside the app. Now it actually has one.
Hello guys, devlog here!I finally got the Linux sandbox in Zero-Assist working end-to-end! The sandbox runs Alpine Linux through PRoot directly on Android without requiring root.Getting it working was harder than expected, though. I ran into several Android-specific issues.Fixing the SandboxThe first problem was Alpine’s heavy use of BusyBox hardlinks. My TAR extractor used File.copyTo(), which didn’t preserve executable permissions, causing errors like:proot error: execve(“/bin/sh”): Permission denied I fixed this by preserving executable bits:linkTarget.copyTo(outFile, overwrite = true) if (linkTarget.canExecute()) { outFile.setExecutable(true, false) } Some hardlinks were also extracted before BusyBox itself, so I added a second repair pass after extraction to restore critical commands like /bin/sh, /bin/ls, and /bin/cat.Symlinks were another problem because Android can block their creation. I added a fallback that copies the target when creating the actual symlink fails:try { Files.createSymbolicLink(outFile.toPath(), Paths.get(linkName)) } catch (e: Exception) { fallback.copyTo(outFile, overwrite = true) } I also had problems directly executing PRoot because some Android app directories can be noexec. The solution was to launch PRoot through Android’s system linker:val args = arrayOf( “/system/bin/linker64”, prootPath, “–rootfs=$rootfsPath”, “/bin/sh”, “-c”, command ) I also added corrupted download detection and automatic Alpine mirror fallback, making the rootfs installation much more reliable.Giving the AI Linux ToolsAfter getting the sandbox stable, I added two AI tools:sandbox_execute — Executes commands inside Alpine and supports persistent shell state, working directories, environment variables, timeouts, and background processes.sandbox_manage_process — Lets the AI list, monitor, read logs from, and kill background processes.For example, the AI can execute:{ “command”: “python3 –version && uname -a”, “working_dir”: “/root” } Or start a background server:{ “command”: “python3 -m http.server 8000”, “background”: true } The execution pipeline now looks like:AI Agent ↓ Rust Tool Layer ↓ Authenticated Local HTTP Bridge ↓ Kotlin Sandbox Manager ↓ PRoot ↓ Alpine Linux The Rust runtime communicates with the Kotlin sandbox through a localhost bridge on 127.0.0.1:49481, protected by a randomly generated per-process bearer token.And now the sandbox is fully functional end-to-end!The AI can execute real Linux commands, install packages, maintain persistent shell sessions, run scripts, start background processes, inspect their logs, and manage them — all inside Alpine Linux running directly on Android without root.This was one of the hardest parts of Zero-Assist so far, but now the AI finally has its own real Linux environment to work with.
okay so after spending lots of time on this issue , im finally able to make this work again , the problem was that (bin/sh, ust/bin/env) never extracted because of one code issue where i accidently mentioned them as the read only memory in the apps storage so the distro was installing also getting extracted but becacuse of the read only type of file , the app was not able to perform any actions on it , so now after taking the help from the open code now the sandbox is fully functional and working on every devices , also ive added some default packages which will get installed during the setup of the sandbox such as (wget, git , python3, jq, py3-pip, nodejs ,lftp and the openssh-client) just using the single command (apk add –no-cache bash curl wget git jq python3 py3-pip nodejs openssh-client lftp rsync)
So i basically went through the whole device control system and hardened it. the planner was splitting compound goals like “open instagram and message rohit” into separate calls which broke everything. also fixed it so the loop doesn’t just bail on the first response - it actually executes the action first. scroll was crashing if the planner didn’t send a direction so now it defaults down. and exceptions in the callback handler were just silently killing the process so now everything is caught and logged properly. added loop detection so it doesn’t get stuck repeating the same thing, post-action screen verification, and 44 tests to cover it all. very happy that it worked , it took lots of time but eventually i think the results are very very good though this thing not works great on the local ai’s but with the cheap api like openrouter/free , this thing can give pretty good results
Device Control Development Update Yesterday I worked on expanding the Device Control system in my AI assistant. The idea behind this feature is to allow the AI to perform real actions on an Android device using the Accessibility Service . When the user gives a command such as “Subscribe to MrBeast on YouTube” , the main AI analyzes the request and delegates it to the Device Control tool. Current Workflow Launch the required application using: PackageManager.getLaunchIntentForPackage() startActivity() Capture a compressed screenshot of the current screen. Analyze the screenshot to identify UI elements and their screen coordinates. Navigate the interface and perform actions through the Android Accessibility APIs. Current Features Open applications Tap at (x, y) Swipe gestures Type text These core primitives allow the AI to interact with almost any Android application through UI automation. Future Improvements My main goals are to improve both speed and accuracy . Instead of navigating through multiple screens for simple system operations, I plan to add native high-level commands directly into the Device Control tool, such as: flashlight_toggle wifi_toggle bluetooth_toggle mobile_data_toggle volume_set brightness_set take_screenshot lock_screen open_notifications open_quick_settings go_home go_back open_recents These commands will allow the AI to execute common Android actions instantly without relying on visual navigation. For more complex tasks—such as interacting with third-party applications—the tool will continue using the screenshot + coordinate-based navigation pipeline. Long-Term Vision The goal is to build a hybrid Device Control system: Native commands for common Android operations (fast, reliable, and efficient). Vision-guided UI automation for complex interactions within any application. This architecture will significantly reduce execution time, improve reliability, and make the assistant capable of handling virtually any task on an Android device.
Devlog: Google Workspace Integration This week I worked on integrating Google Workspace into Zero-Assist , allowing the AI to securely access services like Gmail, Google Drive, Google Docs, and Google Sheets after the user grants permission. The ZeroClaw engine already supports Google Workspace CLI (GWS) , but it was originally built for desktop Linux and expects a desktop environment with GWS already installed. Since Zero-Assist runs inside an Alpine Linux sandbox on Android using PRoot , that approach doesn’t work directly. Instead of rewriting the integration, I kept the existing architecture and adapted it for Android. What I Implemented I modified the sandbox installation process so that GWS is installed automatically whenever the user installs the standard sandbox packages. This means users don’t need to manually install or configure the CLI. Inside the app, I added a new Google Workspace plugin under: Connections → Plugins → Installed → Google Workspace When the user signs in, the Android app completes the OAuth flow and generates the required Google Workspace configuration files. To bridge Android and the Linux sandbox, I use the existing Android ↔ PRoot bridge . The plan is: User Login ↓ Android creates GWS credentials ↓ Credentials copied into PRoot sandbox ↓ Sandbox GWS CLI uses the same credentials ↓ AI can access approved Google services This keeps authentication native while allowing the Linux CLI to work without requiring the user to touch the terminal. Google Cloud Setup I also created a dedicated Google Cloud Console project for Zero-Assist. The project uses a Web Application OAuth client , which is required by the Google Workspace CLI authentication flow. I enabled the necessary APIs, including: Gmail API Google Drive API Google Docs API Google Sheets API More APIs can be enabled as additional integrations are added. Current Problem The authentication flow itself works correctly, and users can successfully sign in. The issue is that the generated credential/configuration files are not being copied correctly into the Linux sandbox . Because of this, the sandboxed GWS CLI cannot find the required authentication files, causing every Google Workspace command to fail. The current challenge isn’t OAuth—it’s reliably synchronizing credentials between Android and the PRoot environment. Once this bridge is working, users will simply sign in once, choose which Google services they want to grant access to, and Zero-Assist will be able to securely interact with those services without any manual setup. note:This devlog is written with hands and then passed to the chatgpt to format it with the .md because im very lazy to play with those colons and #’s
Devlog here , so now i added the new cool animation (thinking orb ) this animation was totally inspired from the ( https://orbs.jakubantalik.com/ ) but the problem was that the orb was written in the typescript which wont work in our app cause our app is written in the kotlin so what i did was i downloaded the zip file from the repo pasted it to the claude and told him to convert it into kotlin for me and surprisingly the results was amazing , i will share the video recording too , and the other part i worked on was i added a few voices for my apps from the hugging face so now the user can use the custom voices too and also if he wants to use some of the default voices , the option is there do download in the app, some voices ( https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx , https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx , https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_GB/alan/medium/en_GB-alan-medium.onnx ) for someone whose interested …
Hello Hello Hello new devlog here , so now i started with the implementation of the MCP believe me guys once the app gets the MCP the app will go to another level , like it will then support literally any app (any app) it can perform actions like the mcp does but in simpler way also when i started with implementation i hit the problem again the code is there in the zeroclaw engine but again the problem is that its meant to run on the desktop so now we again have to do some changes in code and make the mcp run natively on the phone , i also found out some resources to do it like ( https://github.com/modelcontextprotocol/kotlin-sdk ) which is good so now the idea is something similar like shown in the screenshot below taken from the chat gpt ….
Devlog time :> so now I’m continuing with the implementation of the MCP in the app like i previously talked now when i did some tinkering with the rust code using the ai , i managed to get all the connected MCP tools into the config file of the ai the config is getting updated now but the problem is that the config is constantly keeps changing don’t know what’s happening i guess the the problem is in the toml config generator which is glitching out , so now im trying fixing it from lots of time now , i guess i might have to use the antigravity to fix this but i exhausted my weekly limit cause I’m on a free tier 😭😭.. ill catch up with yall later till then bye bye 🙆..
Update !!! new devlog here … so now after doing some more research on the mcps and the implementation plans etc etc now im finally going all on it , ive added a ui component of the MCP in the Connection/Plugin/MCP , where i added few premade mcp options like (GitHub , brave search , external postgre sql etc ..) also there i added the option of the add custom server in which use can add custom server where currently the transport options are (STDIO,HTTP,SSE,LOCALHOST_STDIO (where you can add local mcp servers using the apps like termux etc ) so now that the ui is completed now i will move on to the connection part of the ui to the backend rust engine via uniffi )
Check this out !! so yesterday i finished with the MCP implementation of the app , i implemented 4 transport method (STDIO,,HTTP,SSE and the LOCALHOST_STDIO) so when i was testing out i found out that only one of them is working properly , (the http one ) to which i connected multiple apps , mcp’s etc everything was working fine but when i tested the other transport method , not even a single one was working because it all needed the desktop to run with the specific packages so unfortunately i was not able to use it and i also find out about the nasa mcp where they daily upload the images mars rover images etc so i tried to test it but the problem was that the mcp was not http instead it was the STDIO so i was sad cause i had to fix first the mcp issue then test it but when i was in school in break i was getting board and opened the app and i had an idea like cant we just convert the normal stdio into the http mcp using the termux ? after asking to claude it said definitely we can do this so then i setuped the env(i will add a screenshot below ) and made a proxy server which converts the normal stdio mcp to the http steamtable and i was then able to access it locally using my app (i will add the image of it too) and i managed to connect to the mcp and fetch the images , now everything is working completely fine just the remaining part is the remaining transport which i will fix it some how !! also i will add some images i fetched below...
|
1791825634.2514575
|
1792689634.2514575
|
|
277
|
Kadent by @hacha-mouse | Stardance
|
hacha-mouse
|
1
|
231.72
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-01T15:24:36Z", "hours": 229.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Kadent Kadent is a cross-platform DAW featuring KASL, a domain-specific audio language, and node-graph processing system. Features Create music with familiar track-based UI Two track types: Note Track & Audio Track Node graph for every track KASL language with syntax similar to Swift The node graph allows you to combine multiple KASL programs to perform much more complex processing. What Is a Node Graph? Kadent uses node graph for track processing. A Node is a processing unit that calculates the output. In node graph, an output of one node can be connected to an input of another node. This allows you to connect multiple inputs and outputs freely to other nodes to create sound. Then, why did I adopt node graph? KASL programs can have multiple inputs and outputs, and their types may also vary. So placing them in order does not work because the DAW cannot know which output is connected to the specific input. That’s why Kadent uses node graph. Characteristics of KASL Utilizes Cranelift as a backend for quicker JIT compilation Specialized type of variables such as input , output and state Supports fixed-length arrays and structs Fixed-count loop syntax for predictable execution time Module system influenced by Python Custom infix/prefix/postfix operators (even normal arithmetic operators are defined and provided by std ) KASL Sample Program audio module is built-in module provided by Kadent. Note that these programs below won’t work outside the DAW. Gain Node import audio import std input in = audio.zero_sample() input gain = 0.0 output out = audio.zero_sample() func main() { out = in * [gain; audio.max_channels] } Mix Node import std import std/math/float as f import audio input input_1 = audio.zero_sample() input input_2 = audio.zero_sample() input factor = 0.0 output out = audio.zero_sample() func main() { let clamped_factor = f.clamp(factor, 0.0, 1.0) let multiplied_input_1: audio.Sample = input_1 * [clamped_factor; audio.max_channels] let multiplied_input_2: audio.Sample = input_2 * [1.0 - clamped_factor; audio.max_channels] out = multiplied_input_1 + multiplied_input_2 } Sawtooth Wave Synthesizer import audio as a import std import std/math/float as f input notes = a.EventSlot() input pitch = 1.0 output out = a.zero_sample() state allocator = a.Allocator() let base_freq = 440.0 let volume = 0.1 func main() { allocator.update(notes) var i = 0 loop a.max_voices { let voice = allocator.voices[i] let freq = pitch * base_freq * f.pow(2.0, (voice.pitch - 69.0) / 12.0) if voice.is_active { let t = voice.age let sample = saw(freq: freq, time: t) out = out + [sample * volume; a.max_channels] } i = i + 1 } } func saw(freq f = 440.0, time t: Float) -> Float { return 2.0 * (t * f) % 1.0 - 1.0 } Installation Go to the Releases page of my GitHub repository to download the latest precompiled binary, or compile the binary yourself. Detailed installation steps are described in README .", "repo": "https://github.com/hatya-mouse/kadent", "demo": "https://github.com/hatya-mouse/kadent/releases/tag/v0.1.1"}]...
|
[{"post_id": 81784, "ts": "202 [{"post_id": 81784, "ts": "2026-10-22T14:10:13Z", "hours": 0.8664, "text": "How to add Note Region You can add note region by double-clicking in the timeline. To add notes to it, you need to select the region by clicking it first. Code Editor Error .kdp files are serialized project files, not a source code. You can create a new source file by clicking the src/ directory in the Code Editor. To add a source code to the note track, first open a node graph and add a KASL node to it. In the Inspector, you can specify the path to the source code (e.g. src/example.kasl). Added Some More Documentation I’ve added documentation with screenshots of each panels: Timeline Inspector Automation Node Graph Piano Roll Code Editor"}, {"post_id": 81773, "ts": "2026-10-22T13:18:48Z", "hours": 1.8489, "text": "Added Documentation I saw that the reviewer tried to open the binary project file in the code editor and failed so I’ve decided to add a some sort of tutorial or a documentation. I really wanted to add an interactive tutorial so that the reviewers and the users can know how Kadent works, but I didn’t have time to do so so I’ve just added a few documentation."}, {"post_id": 59408, "ts": "2026-09-01T06:49:17Z", "hours": 17.1803, "text": "Added License Browser It’s been a while since my last devlog! During this time I’ve added an Acknowledgements view where you can look at license text and other informations of the Fonts and Crates that I’ve used. It was a bit difficult to implement because there are so many crates, but I’m satisfied with the result."}, {"post_id": 56435, "ts": "2026-08-28T06:22:03Z", "hours": 41.4536, "text": "Improved code editor I’ve implemented error highlighting in the code editor. I also added a list of errors at the bottom of the code editor, and I can jump to the position of the error by clicking the error. TextEdit in egui does not support highlighting character by character and instead it only highlighting by each sections, so red underlined part may be bigger than the actual error range, but I guess it still looks nice."}, {"post_id": 52794, "ts": "2026-08-23T04:24:09Z", "hours": 10.9353, "text": "sode I’ve created a simple binary serialization crate called “sode” for Kadent. This guarantees that the output binary won’t change even if the struct is modified so I thought it would be better than serde or that sort of serialization library. impl Encode for Note { fn encode ( & self , e : & mut Encoder ) -> Result < (), EncodeError > { e .field ( 0 , & self .start ) ? ; e .field ( 1 , & self .duration ) ? ; e .field ( 2 , & self .pitch ) ? ; e .field ( 3 , & self .velocity ) ? ; Ok (()) } } impl Decode for Note { fn decode ( d : & mut ValueDecoder ) -> Result < Self , DecodeError > { let d = d .to_field_decoder () ? ; Ok ( Note :: new ( d .field ( 0 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 1 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 2 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 3 ) ? .ok_or ( DecodeError :: InvalidData ) ? , )) } }"}, {"post_id": 51188, "ts": "2026-08-20T18:06:44Z", "hours": 4.3567, "text": "Curve type selection I’ve implemented a selection dropdown for three curve types: linear, step, and smooth. Next thing to do is to add a text field to adjust the curve tension"}, {"post_id": 50847, "ts": "2026-08-20T09:11:52Z", "hours": 8.7028, "text": "Automation Automation is here. I’ve implemented an automation node, which is associated with an automation track that you can add keyframes to value that changes over time. You can even connect automation nodes to KASL Node to use the value for calculation!"}, {"post_id": 49569, "ts": "2026-08-18T13:30:07Z", "hours": 4.8889, "text": "Refactored codebase It looks exactly the same as the previous devlog, but I refactored the codebase, primarily the EditorUiState. I separated many members of EditorUiState to multiple small structs for better readability"}, {"post_id": 48851, "ts": "2026-08-17T12:25:43Z", "hours": 7.1642, "text": "Added ruler to piano roll I’ve added the ruler to the piano roll. This will make note placement easier and more intuitive than before. Also I refactored the codebase a little bit, but honestly I thought the previous implementation would be better so I may be putting it back soon."}, {"post_id": 47876, "ts": "2026-08-16T04:17:12Z", "hours": 11.8714, "text": "Add seconds support for region placement I’ve added TimePosition and TimeBounds to store the position of the region. They have two modes: one stores the position in Ticks, and another one stores it in seconds. Ticks and seconds can be calculated from each other using TempoMap."}, {"post_id": 46767, "ts": "2026-08-14T08:06:59Z", "hours": 11.5078, "text": "On-demamd resampling for audio tracks Audio regions require resampling because the sample rate of the source data may differ from the required sample rate. So far, the audio engine for Kadent has been resampling the entire audio data before playback or exporting. However, resampling audio data in advance takes a lot of CPU and increases the time it takes to prepare for playback. This time I made it resample the audio data on demand during playback. This makes audio thread not to store the massive resampled audio data. *sample rate: a value that indicates how many samples are in a single second *sample: a value that represents the sound wave’s loudness at a specific moment in time"}, {"post_id": 45991, "ts": "2026-08-12T20:39:49Z", "hours": 49.1206, "text": "Waveform Rendering & Scroll Bar This time, I’ve mainly implemented two features: waveform rendering and timeline scroll bar. Waveform I’ve added a waveform rendering logic to the timeline. I handled it by generating peak value data to render it quicker than calculating the peak value while rendering. After all, it looks pretty nice and scales perfectly when zooming with my trackpad. Timeline Scroll Bar Another feature I’ve added is a timeline scroll bar. It may not look appealing, but its calculation was quite hard actually. I had to calculate the ratio of the visible area and the entire timeline to get the width of the scroll bar. I think it is lot better than egui’s builtin scroll bar, so I’m quite satisfied with the outcome!"}, {"post_id": 20035, "ts": "2026-07-01T15:15:14Z", "hours": 1.9881, "text": "Ability to adjust project range I’ve implemented a feature that the user can adjust the project’s export range just by dragging the handle in the ruler. Also the actual number is shown in the status bar while the handle is being dragged so the user can know the exact beat where is going to be exported."}, {"post_id": 19709, "ts": "2026-07-01T03:15:36Z", "hours": 23.7522, "text": "Refactored the audio engine I’ve streamlined the note processing logic in the audio engine. So far, the audio engine handled sequenced notes (notes that you can see in the editor) and the realtime MIDI notes that you can play using some MIDI controllers differently. It also lacked maintainability. That’s why I’ve completely rebuilt the logic to unify the process. It also contributed to reduce the amount of code, and I’m happy with that."}, {"post_id": 16801, "ts": "2026-06-27T08:53:19Z", "hours": 3.0306, "text": "Added Status Bar I’ve added a new status bar, which shows some informations such as sample rate, buffer size and the selected content, at the bottom of the window. Fixed Node Graph Rendering Bug The node graph used to be rendered on the front of the header, but I finally fixed this by using Panel to limit the area where painter can draw the graph."}, {"post_id": 15135, "ts": "2026-06-24T16:22:43Z", "hours": 7.1325, "text": "Improved menu design I’ve improved the design of the menu by adjusting the button style. It took quite a long time because of egui’s a little bit confusing styling API. Refactor and optimize the audio engine I’ve refactored the audio engine by using integer ticks to manage time instead of f32 beats. By using integer ticks, it can be calculated even faster and more accurately."}, {"post_id": 12564, "ts": "2026-06-20T14:55:28Z", "hours": 1.1906, "text": "Nested dropdown menu for device selection I’ve improved a device selection feature by nesting the menu. Thanks to this, users can click a single headphones button to change the MIDI ports and output devices. Also I added some icons for these."}, {"post_id": 12510, "ts": "2026-06-20T13:06:52Z", "hours": 1.2117, "text": "Selectable audio output I’ve added a feature to select audio output! It may seem simple but it actually needed refactoring the audio engine and it took a lot of time."}, {"post_id": 12455, "ts": "2026-06-20T10:23:24Z", "hours": 2.4333, "text": "Replacing audio stream when switching devices I’ve implemented a logic in the audio engine, that allows the Kadent DAW to switch the output device. It was challenging because Mixer and MPSC consumers cannot be cloned. Finally I used Arc and Mutex in order to share the context with multiple threads. let callback_ctx = Arc::new(Mutex::new(OutputCallbackContext { mixer, command_cons, midi_cons, vu_prod, pending_project: pending_arc, })); I used try_lock instead of normal lock , which may block the thread, as you can see in the screenshot."}, {"post_id": 9312, "ts": "2026-06-15T16:59:09Z", "hours": 5.6553, "text": "KASL module system improvement So far, KASL compiler didn’t allow us to import external programs with the same name, because the name of the namespace conflicts. Today I have added new alias feature, which can be used like this: import foo as bar With this syntax, you can import a program named foo.kasl and refer to it with bar . This can also improve readability when importing a file with a long name! Streamline compilation I wanted to try compiling Kadent to application that can be installed using an installer, instead of a simple executable binary. I found Taskfile, which is a build tool similar to make but uses a yaml file to define workflows. I found it very useful so I adopted it and it worked very well! Currently I only have workflow for macOS compilation but I want to add Windows and Linux support soon!"}, {"post_id": 8724, "ts": "2026-06-14T14:21:32Z", "hours": 2.6775, "text": "Project creation dialog I’ve implemented new project creation dialog. You can specify the name of the project and select the folder using a picker from the system."}, {"post_id": 8532, "ts": "2026-06-14T06:06:41Z", "hours": 2.6142, "text": "Implemented splash screen I’ve finally finished implementing the splash screen for Kadent. On the left side, there are two buttons for creating or opening a project. The right panel shows the recent projects. Challenge The biggest challenge in implementing the splash screen was to layout UI components. It was quite hard to center the logo and the buttons. I spent around 1hrs dealing with that problem. Here’s how I solved it: const BUTTON_WIDTH : f32 = 300.0 ; const BUTTON_HEIGHT : f32 = 42.0 ; const CONTENT_HEIGHT : f32 = 60.0 + 12.0 + 16.0 + 24.0 + 12.0 + BUTTON_HEIGHT * 2.0 ; impl SplashUi { pub ( super ) fn splash_controls ( & mut self , ui : & mut egui :: Ui ) -> Option < EditorTransition > { ui .vertical_centered (| ui | { // Add space to vertically center the UI parts ui .add_space ( full_height / 2.0 - CONTENT_HEIGHT / 2.0 ); // UI Components }) .inner } } Since centering both horizontally and vertically while calculating the height of the inner content is painful, I eventually hardcoded the height of the UI components in order to center the UI vertically. Logo I’ve also designed a logo for Kadent in the meantime. I tweaked the font called “Inter”, which is available on Google Fonts, for the logo."}, {"post_id": 8172, "ts": "2026-06-13T16:50:03Z", "hours": 7.3775, "text": "Kadent — A DAW with custom language to create synths and effects Refactored project strucure As my codebase became bigger, it started to be a bit complicated, so I’ve refactored the codebase. New folder structure is consist of four directories in src/ directory: commands , core , storage , and ui . commands directory contains the audio engine communication logic. It has some functions like add_note that adds a new note to the specified track and sends the updated project to the audio thread. core directory contains KASLNode implementation and some metadata. KASLNode is a specific node that can literally execute KASL programs. Metadata is a data that are not necessarily tied to audio engine. It includes track colors, track names, region names, etc. storage directory contains some implementation for storing and loading files. It has a logic to save and load the Kadent project file. ui directory contains the UI implementation. Inside the ui directory, there are components , theme , and workspaces directories. components directory has some common UI parts used in various parts of the DAW. theme defines colors and size used in the UI. workspaces contains the UI implementation for the editor and the splash screen. Splash screen I’m currently implementing a splash screen for Kadent. It used to have just two buttons to create or open a project. I’ve just finished implementing “Recent Projects” list. (shown on the right side)"}, {"post_id": 4027, "ts": "2026-06-07T06:23:01Z", "hours": 1.4083, "text": "Implemented multithread track processing for the audio engine using Rayon ! I used to think implementing multithreading would be a nightmare, but I utilized Rayon which was actually very intuitive and easy to use. The screenshot shows the exact code where the tracks are being processed in parallel."}, {"post_id": 30, "ts": "2026-05-31T09:44:30Z", "hours": 1.7811, "text": "I am working on a WASM backend for my KASL language!"}]...
|
Title: Kadent by @hacha-mouse | Stardance
Devlogs Title: Kadent by @hacha-mouse | Stardance
Devlogs:
I am working on a WASM backend for my KASL language!
Implemented multithread track processing for the audio engine using Rayon ! I used to think implementing multithreading would be a nightmare, but I utilized Rayon which was actually very intuitive and easy to use. The screenshot shows the exact code where the tracks are being processed in parallel.
Kadent — A DAW with custom language to create synths and effects Refactored project strucure As my codebase became bigger, it started to be a bit complicated, so I’ve refactored the codebase. New folder structure is consist of four directories in src/ directory: commands , core , storage , and ui . commands directory contains the audio engine communication logic. It has some functions like add_note that adds a new note to the specified track and sends the updated project to the audio thread. core directory contains KASLNode implementation and some metadata. KASLNode is a specific node that can literally execute KASL programs. Metadata is a data that are not necessarily tied to audio engine. It includes track colors, track names, region names, etc. storage directory contains some implementation for storing and loading files. It has a logic to save and load the Kadent project file. ui directory contains the UI implementation. Inside the ui directory, there are components , theme , and workspaces directories. components directory has some common UI parts used in various parts of the DAW. theme defines colors and size used in the UI. workspaces contains the UI implementation for the editor and the splash screen. Splash screen I’m currently implementing a splash screen for Kadent. It used to have just two buttons to create or open a project. I’ve just finished implementing “Recent Projects” list. (shown on the right side)
Implemented splash screen I’ve finally finished implementing the splash screen for Kadent. On the left side, there are two buttons for creating or opening a project. The right panel shows the recent projects. Challenge The biggest challenge in implementing the splash screen was to layout UI components. It was quite hard to center the logo and the buttons. I spent around 1hrs dealing with that problem. Here’s how I solved it: const BUTTON_WIDTH : f32 = 300.0 ; const BUTTON_HEIGHT : f32 = 42.0 ; const CONTENT_HEIGHT : f32 = 60.0 + 12.0 + 16.0 + 24.0 + 12.0 + BUTTON_HEIGHT * 2.0 ; impl SplashUi { pub ( super ) fn splash_controls ( & mut self , ui : & mut egui :: Ui ) -> Option < EditorTransition > { ui .vertical_centered (| ui | { // Add space to vertically center the UI parts ui .add_space ( full_height / 2.0 - CONTENT_HEIGHT / 2.0 ); // UI Components }) .inner } } Since centering both horizontally and vertically while calculating the height of the inner content is painful, I eventually hardcoded the height of the UI components in order to center the UI vertically. Logo I’ve also designed a logo for Kadent in the meantime. I tweaked the font called “Inter”, which is available on Google Fonts, for the logo.
Project creation dialog I’ve implemented new project creation dialog. You can specify the name of the project and select the folder using a picker from the system.
KASL module system improvement So far, KASL compiler didn’t allow us to import external programs with the same name, because the name of the namespace conflicts. Today I have added new alias feature, which can be used like this: import foo as bar With this syntax, you can import a program named foo.kasl and refer to it with bar . This can also improve readability when importing a file with a long name! Streamline compilation I wanted to try compiling Kadent to application that can be installed using an installer, instead of a simple executable binary. I found Taskfile, which is a build tool similar to make but uses a yaml file to define workflows. I found it very useful so I adopted it and it worked very well! Currently I only have workflow for macOS compilation but I want to add Windows and Linux support soon!
Replacing audio stream when switching devices I’ve implemented a logic in the audio engine, that allows the Kadent DAW to switch the output device. It was challenging because Mixer and MPSC consumers cannot be cloned. Finally I used Arc and Mutex in order to share the context with multiple threads. let callback_ctx = Arc::new(Mutex::new(OutputCallbackContext { mixer, command_cons, midi_cons, vu_prod, pending_project: pending_arc, })); I used try_lock instead of normal lock , which may block the thread, as you can see in the screenshot.
Selectable audio output I’ve added a feature to select audio output! It may seem simple but it actually needed refactoring the audio engine and it took a lot of time.
Nested dropdown menu for device selection I’ve improved a device selection feature by nesting the menu. Thanks to this, users can click a single headphones button to change the MIDI ports and output devices. Also I added some icons for these.
Improved menu design I’ve improved the design of the menu by adjusting the button style. It took quite a long time because of egui’s a little bit confusing styling API. Refactor and optimize the audio engine I’ve refactored the audio engine by using integer ticks to manage time instead of f32 beats. By using integer ticks, it can be calculated even faster and more accurately.
Added Status Bar I’ve added a new status bar, which shows some informations such as sample rate, buffer size and the selected content, at the bottom of the window. Fixed Node Graph Rendering Bug The node graph used to be rendered on the front of the header, but I finally fixed this by using Panel to limit the area where painter can draw the graph.
Refactored the audio engine I’ve streamlined the note processing logic in the audio engine. So far, the audio engine handled sequenced notes (notes that you can see in the editor) and the realtime MIDI notes that you can play using some MIDI controllers differently. It also lacked maintainability. That’s why I’ve completely rebuilt the logic to unify the process. It also contributed to reduce the amount of code, and I’m happy with that.
Ability to adjust project range I’ve implemented a feature that the user can adjust the project’s export range just by dragging the handle in the ruler. Also the actual number is shown in the status bar while the handle is being dragged so the user can know the exact beat where is going to be exported.
Waveform Rendering & Scroll Bar This time, I’ve mainly implemented two features: waveform rendering and timeline scroll bar. Waveform I’ve added a waveform rendering logic to the timeline. I handled it by generating peak value data to render it quicker than calculating the peak value while rendering. After all, it looks pretty nice and scales perfectly when zooming with my trackpad. Timeline Scroll Bar Another feature I’ve added is a timeline scroll bar. It may not look appealing, but its calculation was quite hard actually. I had to calculate the ratio of the visible area and the entire timeline to get the width of the scroll bar. I think it is lot better than egui’s builtin scroll bar, so I’m quite satisfied with the outcome!
On-demamd resampling for audio tracks Audio regions require resampling because the sample rate of the source data may differ from the required sample rate. So far, the audio engine for Kadent has been resampling the entire audio data before playback or exporting. However, resampling audio data in advance takes a lot of CPU and increases the time it takes to prepare for playback. This time I made it resample the audio data on demand during playback. This makes audio thread not to store the massive resampled audio data. *sample rate: a value that indicates how many samples are in a single second *sample: a value that represents the sound wave’s loudness at a specific moment in time
Add seconds support for region placement I’ve added TimePosition and TimeBounds to store the position of the region. They have two modes: one stores the position in Ticks, and another one stores it in seconds. Ticks and seconds can be calculated from each other using TempoMap.
Added ruler to piano roll I’ve added the ruler to the piano roll. This will make note placement easier and more intuitive than before. Also I refactored the codebase a little bit, but honestly I thought the previous implementation would be better so I may be putting it back soon.
Refactored codebase It looks exactly the same as the previous devlog, but I refactored the codebase, primarily the EditorUiState. I separated many members of EditorUiState to multiple small structs for better readability
Automation Automation is here. I’ve implemented an automation node, which is associated with an automation track that you can add keyframes to value that changes over time. You can even connect automation nodes to KASL Node to use the value for calculation!
Curve type selection I’ve implemented a selection dropdown for three curve types: linear, step, and smooth. Next thing to do is to add a text field to adjust the curve tension
sode I’ve created a simple binary serialization crate called “sode” for Kadent. This guarantees that the output binary won’t change even if the struct is modified so I thought it would be better than serde or that sort of serialization library. impl Encode for Note { fn encode ( & self , e : & mut Encoder ) -> Result < (), EncodeError > { e .field ( 0 , & self .start ) ? ; e .field ( 1 , & self .duration ) ? ; e .field ( 2 , & self .pitch ) ? ; e .field ( 3 , & self .velocity ) ? ; Ok (()) } } impl Decode for Note { fn decode ( d : & mut ValueDecoder ) -> Result < Self , DecodeError > { let d = d .to_field_decoder () ? ; Ok ( Note :: new ( d .field ( 0 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 1 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 2 ) ? .ok_or ( DecodeError :: InvalidData ) ? , d .field ( 3 ) ? .ok_or ( DecodeError :: InvalidData ) ? , )) } }
Improved code editor I’ve implemented error highlighting in the code editor. I also added a list of errors at the bottom of the code editor, and I can jump to the position of the error by clicking the error. TextEdit in egui does not support highlighting character by character and instead it only highlighting by each sections, so red underlined part may be bigger than the actual error range, but I guess it still looks nice.
Added License Browser It’s been a while since my last devlog! During this time I’ve added an Acknowledgements view where you can look at license text and other informations of the Fonts and Crates that I’ve used. It was a bit difficult to implement because there are so many crates, but I’m satisfied with the result.
Added Documentation I saw that the reviewer tried to open the binary project file in the code editor and failed so I’ve decided to add a some sort of tutorial or a documentation. I really wanted to add an interactive tutorial so that the reviewers and the users can know how Kadent works, but I didn’t have time to do so so I’ve just added a few documentation.
How to add Note Region You can add note region by double-clicking in the timeline. To add notes to it, you need to select the region by clicking it first. Code Editor Error .kdp files are serialized project files, not a source code. You can create a new source file by clicking the src/ directory in the Code Editor. To add a source code to the note track, first open a node graph and add a KASL node to it. In the Inspector, you can specify the path to the source code (e.g. src/example.kasl). Added Some More Documentation I’ve added documentation with screenshots of each panels: Timeline Inspector Automation Node Graph Piano Roll Code Editor
Ships:
Kadent Kadent is a cross-platform DAW featuring KASL, a domain-specific audio language, and node-graph processing system. Features Create music with familiar track-based UI Two track types: Note Track & Audio Track Node graph for every track KASL language with syntax similar to Swift The node graph allows you to combine multiple KASL programs to perform much more complex processing. What Is a Node Graph? Kadent uses node graph for track processing. A Node is a processing unit that calculates the output. In node graph, an output of one node can be connected to an input of another node. This allows you to connect multiple inputs and outputs freely to other nodes to create sound. Then, why did I adopt node graph? KASL programs can have multiple inputs and outputs, and their types may also vary. So placing them in order does not work because the DAW cannot know which output is connected to the specific input. That’s why Kadent uses node graph. Characteristics of KASL Utilizes Cranelift as a backend for quicker JIT compilation Specialized type of variables such as input , output and state Supports fixed-length arrays and structs Fixed-count loop syntax for predictable execution time Module system influenced by Python Custom infix/prefix/postfix operators (even normal arithmetic operators are defined and provided by std ) KASL Sample Program audio module is built-in module provided by Kadent. Note that these programs below won’t work outside the DAW. Gain Node import audio import std input in = audio.zero_sample() input gain = 0.0 output out = audio.zero_sample() func main() { out = in * [gain; audio.max_channels] } Mix Node import std import std/math/float as f import audio input input_1 = audio.zero_sample() input input_2 = audio.zero_sample() input factor = 0.0 output out = audio.zero_sample() func main() { let clamped_factor = f.clamp(factor, 0.0, 1.0) let multiplied_input_1: audio.Sample = input_1 * [clamped_factor; audio.max_channels] let multiplied_input_2: audio.Sample = input_2 * [1.0 - clamped_factor; audio.max_channels] out = multiplied_input_1 + multiplied_input_2 } Sawtooth Wave Synthesizer import audio as a import std import std/math/float as f input notes = a.EventSlot() input pitch = 1.0 output out = a.zero_sample() state allocator = a.Allocator() let base_freq = 440.0 let volume = 0.1 func main() { allocator.update(notes) var i = 0 loop a.max_voices { let voice = allocator.voices[i] let freq = pitch * base_freq * f.pow(2.0, (voice.pitch - 69.0) / 12.0) if voice.is_active { let t = voice.age let sample = saw(freq: freq, time: t) out = out + [sample * volume; a.max_channels] } i = i + 1 } } func saw(freq f = 440.0, time t: Float) -> Float { return 2.0 * (t * f) % 1.0 - 1.0 } Installation Go to the Releases page of my GitHub repository to download the latest precompiled binary, or compile the binary yourself. Detailed installation steps are described in README ....
|
1792821302.779773
|
1792907702.779773
|
|
1507
|
Sub 100 Wh portable power station by @win7 | Stard Sub 100 Wh portable power station by @win7 | Stardance...
|
win7
|
0
|
232.03
|
0
|
[]
|
[{"post_id": 81818, "ts": "202 [{"post_id": 81818, "ts": "2026-10-22T16:59:23Z", "hours": 0.6336, "text": "Finally replaced the MDP1933 MOSFETs with beefier IRFB4110 MOSFETs, but boy was it expensive! Whenever we replace blown MOSFETs, its a good practice to replace the entire array even if one MOSFET is blown and the others work perfectly fine since you never know if the voltage spike or whatever calamity had partially destroyed it (it would fail to close properly, dropping a lot of voltage) Atleast the inverter’s been fixed now (or is it..?) and outputs a clean 230 V RMS. Tested with a 20 W lamp and it works well. Need to replace the 35 A automotive fuse on it as well since it was also blown due to the direct short that occurred, I’m using a piece of solder wire as a temporary substitute (not recommended btw) Need to test with bigger loads to ensure that its back at business and nothing else was damaged due to the overload. Also worked on the Instructable for the past two days while waiting to get the MOSFETs."}, {"post_id": 81032, "ts": "2026-10-19T16:53:58Z", "hours": 0.4167, "text": "Switching to daily devlogs from now on.. Worked on the broken inverter. Tried replacing the MOSFETS with a different ones. The original ones were MDP1933, with a drain to source resistance of less than 5 milliohms, while the ones I replaced with were IRFZ44N and featured a drain to source resistance of 15 milliohms. I need to find a stronger MOSFET than the original MDP1933 used in the build and also upgrade my table’s sticker to gray :D"}, {"post_id": 80699, "ts": "2026-10-18T15:31:28Z", "hours": 9.7653, "text": "After a full 2-week fever, I’m back into business :D. Things aren’t great to start off. To sum it up, the inverter died after I connected a chineese steamer apparently rated for “120 W”, when in reality, it drew around 500 W from my wall. My inverter tried to maintain its voltage and ended up killing its MOSFETS. I really hope the MOSFETS are the only ones damaged."}, {"post_id": 73669, "ts": "2026-09-25T17:07:41Z", "hours": 7.9381, "text": "Had to tear the unit down, do plastic welding since the screw mounting slots broke. Probably I would rate this as a 0/10 in the reparability scale by myself -_-. Also, bypassed the 10 V regulator on the charger boost converter module and now it can work from 9V. Planned to add another separate boost converter for the inverter to prevent inverter’s low voltage protection from kicking in. Bypassed the regulator here as well. I feel kinda lazy and tired, probably will log more time from tomorrow,,"}, {"post_id": 71826, "ts": "2026-09-21T16:47:09Z", "hours": 9.3172, "text": "Had to harvest a boost converter from my old bench power supply, fix it (it was dead shorted due to an internally shorted capacitor) Planning on adding a pre-boost converter for the inverter and the charger functions. They refuse to work below 10.2 V, disregarding 20~30% of battery capacity. Recorded the voltage, current, milliamp hours, power drawn along with time stamps. Gosh, my hands are numb now -_-."}, {"post_id": 71159, "ts": "2026-09-20T11:30:16Z", "hours": 9.6525, "text": "Welp, killed another boost converter. This one failed by having its output voltage always equal to the input voltage no matter what, unlike previously where the boost converter failed as a direct short. Other than this, I spent a lot of time troubleshooting the charging MPPT function, which seemed to not have proper limit and tripped whatever charger I had connected it to. Had to change the values quite a bit but nothing helped. In the end I noticed that the initial_in_voltage variable was set to the absolute minimum trigger point whenever the charger was connected, therefore the condition where the (initial_in_voltage - in_voltage variable <= 0.2) inequation is always held true and therefore the Arduino ramped up the PWM no matter what, it took a ton of time to figure out -_- In addition to this, I had also spent a around 2h in testing the power station regarding its thermals and max. power capability.."}, {"post_id": 70210, "ts": "2026-09-18T18:28:05Z", "hours": 3.8333, "text": "Successfully completed the soft started board in order to prevent the inrush current drawn by the XL4016 module from tripping certain chargers. It felt endless, I had to use 2 NPN transistors in an inverter configuration in order to not use a PNP transistor since I did not have one lol. Also 3D printed and replaced the old battery case for a newer one which has ventilation holes, helping in keeping the battery temperatures low.."}, {"post_id": 70113, "ts": "2026-09-18T14:21:50Z", "hours": 7.6569, "text": "In the process of making the soft starter circuit for the XL4016 module, since the inrush current trips some chargers, I’m set on using a 555 timer chip in order to turn on a relay 2s after powering on the relay. Anyways, tested the bare-bones version of the power station at around 100 W and/or 10A of current and it worked beautifully, though I was scared to my core when doing so, not wanting this setup to blow up like last time which killed the boost converter and both the charger modules."}, {"post_id": 69616, "ts": "2026-09-17T12:56:32Z", "hours": 9.4322, "text": "Printed the left side panel, tried to print the bottom panel but failed, also the BOM list final is ready!! Well, seems like the assembly process is going to be hard due to a ton of wires and obstacles :( Had to trim the direct source connector panel twice for it to fit in the right side panel Boost converter module is held under really high amount of tension probably due to 10mm bolt and nuts. Made orientation and placement mistakes while installing the chargers panel -_-"}, {"post_id": 69073, "ts": "2026-09-16T10:15:00Z", "hours": 9.6933, "text": "Looked through the designs and measurements, edited them when necessary, tested the charging circuit, not sure why but it trips my MacBook’s PD 30 W charger but not my Samsung PD power bank, probably due to inrush currents. After a long conflict, finally printed the right side panel, need to proceed with the left, top, bottom and back panel as well. I don’t know, I’m scared to waste ~100g of filament and ~10h of time over a failed print just because of a dimensional mistake or inaccuracy, I’m just looking through the final model in Fusion 360 countless times,!"}, {"post_id": 68037, "ts": "2026-09-14T12:41:01Z", "hours": 9.7931, "text": "Birthday devlog today🎉! Did a ton more of CAD work, including modification of slots and sketches, and boy was it painful!. I had to re-draw each sketch on top and repeat this once again since I need one for negative extrusion and one for filling the already existing slots. All caused by my poor judgement of the dimensions of the other parts But here I am! Also, had tweaked the code a little, did some power wire replacements and stuff"}, {"post_id": 66828, "ts": "2026-09-12T18:50:31Z", "hours": 7.2039, "text": "Working on the mainboard mount. The mainboard is planned to be mounted on top of the battery pack. Not sure how I’m gonna figure out how to make mounting holes on the bottom panel. Its 12:20 AM rn, need to go to bed,,,"}, {"post_id": 66084, "ts": "2026-09-11T17:35:16Z", "hours": 8.3944, "text": "Probably a really messy workbench right now. Anyways, once again, did quite a bit of working, especially in CAD and 3D printing. Finally, I’ve hit 100% of the program storage space in my Arduino Nano when uploading my code. Need to optimize the code. Had to snap off the screw mounts and the bottom section of the button mount cover for it to fit, fixed it in the later version though. Also, spent 5 full minutes troubleshooting, opening the mainboard out of its case only to find out that nothing was connected (power button, navigation buttons, etc.). Probably, late night fatigue kicking in,,"}, {"post_id": 65290, "ts": "2026-09-10T10:13:56Z", "hours": 9.3603, "text": "Printed out the front panel, got a ton of work to do on the other panels. Thinking of whether or not to add a fuse in series to the direct source connector.. I feel like fitting all of these components into their designated space might be a very tedious task. Its just a pain to measure and ensure everything is in its own designated region and every part seats in properly, and also, found a mini bug, which is to be fixed in the code,,"}, {"post_id": 64192, "ts": "2026-09-08T12:47:58Z", "hours": 7.145, "text": "Printed and assembled the chargers part And also, I’m in the middle of designing the right side panel, gonna take up a ton of time as I’m using hit and trial method"}, {"post_id": 63471, "ts": "2026-09-07T10:49:09Z", "hours": 8.2628, "text": "Completed the modelling part of the inverter case, charger panel and probably also the front panel. Did some minor bug tweaks in the code Also finished cutting the copper sheet for the inverter module"}, {"post_id": 62681, "ts": "2026-09-06T05:13:52Z", "hours": 9.9372, "text": "TERRIBLE NEWS: I lost 3D models of the main front panel, the inverter case AND the chargers panel to a power outage. I know I should’ve saved it but I either complete it and save it or just have them lying in my RAM overnight till it finishes and that power outages are rare for me, but here I am! Completed the bench power supply part, printed the front side in orange and screwed it on the gray bench power supply mount since I’m planning to use orange on gray as opposed to gray on orange. Also added an extra master XT60 connector for direct battery access connections."}, {"post_id": 62043, "ts": "2026-09-05T08:16:17Z", "hours": 5.7331, "text": "Officially over the 100h mark! 🎉 Designed the front plate of the chargers, designed a stencil to drill through the copper sheet that acts as a small ‘heatsoak’, soldered some cables and much more"}, {"post_id": 61095, "ts": "2026-09-03T20:18:00Z", "hours": 9.33, "text": "Did quite a bit of various work today, but the one that made me glad is the successfull printing of the bench power supply part after 5 devastating failed attempts. Designed the case in Fusion 360 Worked on the header connections Worked on the bench power supply part"}, {"post_id": 60231, "ts": "2026-09-02T13:52:59Z", "hours": 8.4903, "text": "Completed the case for the inverter part, switched to digital operation of the fan instead of analog due to never ending problems."}, {"post_id": 58861, "ts": "2026-08-31T13:16:28Z", "hours": 7.7978, "text": "Completed the addition fan and LED interface to the mainboard. I had to add a separate boost converter to the setup. Still the addition of fan causes fluctuation in time to empty readings, need to fix them in code,,"}, {"post_id": 57981, "ts": "2026-08-30T09:57:15Z", "hours": 9.0681, "text": "Finally completed the haptics part, there are still some areas that do not work like intended, but I cannot really do much about it. Designed as well as printed cases for the main board and batteries for enhanced safety. My streak has not extended for today despite 3h of work today.,"}, {"post_id": 56720, "ts": "2026-08-28T16:15:26Z", "hours": 8.8742, "text": "Worked on the haptics for quite a while, still need to add haptic feedback/notification for other messages displayed on the screen, though it is SOO BUGGY! I had to work on it for 3 full days, yet I still feel like the haptic patterns were inconsistent, gotta do more fixing tomorrow, or probably I might focus into something else for a while."}, {"post_id": 54409, "ts": "2026-08-25T12:36:45Z", "hours": 5.1358, "text": "Messed up and messed around using millis(), need more time to debug and fix it (I’m not an expert when it comes to dealing with millis(), open to suggestions), I don’t want to use delay() since it interferes with my mAh measurement in the code. Did a weird contraption of a capacitor, polarity protector diode on a perf board in order to act as a power distribution board since the boost converter had only 1 screw terminal.."}, {"post_id": 53145, "ts": "2026-08-23T16:06:15Z", "hours": 4.215, "text": "I have planned to integrate haptics to the power station too, though traditional ERMs felt too cheap and unreliable, therefore I made something called the “Haptic block”, an LRA (Linear Resonance Actuator)-based haptic actuator, similar to the ones found in flagship smartphones (I’m looking at you, iPhone 6S!). Used a 12V, 6N solenoid along with a MOSFET, resistor and a flyback diode for switching the solenoid with the Arduino board. It works great, started with the coding process, the timings have to be perfect, else, it feels like metal and plastic colliding (though that’s exactly what’s happening XD). With perfect timing though, it enhances the user experience by a lot!"}, {"post_id": 52310, "ts": "2026-08-22T12:55:48Z", "hours": 5.5439, "text": "Took quite a while to try various methods, debug, fix, etc. the MPPT charging. Finally, a transistor pulling the floating 100mV to ground along with an RC filter seems to work, works for now, though not the best way of doing this. (Literally screamed in joy when it finally worked lol :D)"}, {"post_id": 51662, "ts": "2026-08-21T13:48:01Z", "hours": 9.6022, "text": "A week’s worth of devlog, probably I’m gonna switch over to weekly devlogs cuz I’m a bit lazy. Anyways, once again, a ton of changes: First and foremost, replaced the charger modules and the boost converter (Boy was it expensive for me). Added ADS1115 ADC as I needed an extra analog pin for measuring input charging voltage, switched voltage, current and temperature measurement to there as well. Planning on adding 2 more temperature sensors, 1 for the battery and 1 for the charger modules. Working on charging part for now, gonna use MPPT. A mystery addition that I bet nobody can guess (its in the image btw), open to your guesses btw."}, {"post_id": 49024, "ts": "2026-08-17T16:46:02Z", "hours": 4.0364, "text": "A lot of changes and events. Spent almost an hour modifying/testing the charging lightning icon on top of the battery. Fixed the mAh counter Fixed the time to empty counter Edited the power value such that only positive values are shown Killed the boost converter and charger modules, still unsure what caused it but I suspect the boost converter overheating and then finally, a voltage spike killed the charger modules too. Any ideas/opinions are very helpful.."}, {"post_id": 46946, "ts": "2026-08-14T14:53:17Z", "hours": 2.3461, "text": "After 800 lines of code, I finally hit the 2kB RAM ceiling. Did some optimization work on the code. Had to take a backup of the flawless code, try new stuff, in split screen mode between 2 IDE screens"}, {"post_id": 46396, "ts": "2026-08-13T16:02:49Z", "hours": 2.4861, "text": "Completed the chargers part (mainly fixed the power measurement bugs). In addition to that, did the temperature controlled fan part for today, so far works perfectly."}, {"post_id": 45868, "ts": "2026-08-12T16:29:10Z", "hours": 4.4317, "text": "Finally completed the soft-latching power control part in the circuit. 2 Arduino nano(s) were k1lled during the process :*(. Used an N channel MOSFET at first in order to control power going to the Arduino, failed at it, switched to a relay (big mistake), driven by a transistor, finally got out, bought a P channel MOSFET, still driven by an NPN transistor, and in the end, it works flawlessly, gave me immense happiness watching it work flawlessly :D"}, {"post_id": 44056, "ts": "2026-08-09T16:02:34Z", "hours": 3.285, "text": "Did more soldering work, not the prettiest, has a ton of improvements to be made both on the hardware as well as the software side. So far, the charger and the inverter switching part works, need to add a transistor in between the system and the battery in order to turn it off completely when not in use.. Open to suggestions and improvements.."}, {"post_id": 42800, "ts": "2026-08-07T18:17:35Z", "hours": 3.3397, "text": "Burnt some midnight oil to disassemble the breadboard prototype and start with the actual circuitry, soldered a few components so far, yet there’s a lot more to do so, probably gonna take a month to complete -_-."}, {"post_id": 41956, "ts": "2026-08-06T14:15:24Z", "hours": 1.9422, "text": "Worked on the settings screen for a while. Added maximum power limit as well as basic RGB LED colour setting along with EEPROM memory to store the parameters"}, {"post_id": 40710, "ts": "2026-08-04T12:30:27Z", "hours": 1.1986, "text": "Completed drawing the sketch of the portable power station (sorry for the messy work, its the first sketch). Please let me know of any suggestions/improvements.."}, {"post_id": 38209, "ts": "2026-07-31T14:39:56Z", "hours": 1.9614, "text": "Did a lot of tidying and reposition work as well as addition of various controls toggles on and offs."}, {"post_id": 36412, "ts": "2026-07-28T14:57:38Z", "hours": 0.5439, "text": "Added 2 pages: Controls and Info, settings page is still pending.."}, {"post_id": 35897, "ts": "2026-07-27T16:59:50Z", "hours": 0.5722, "text": "Replaced the 20 A BMS with a 40 A one, in order to achieve the full 27 A capability"}, {"post_id": 21533, "ts": "2026-07-03T15:39:47Z", "hours": 0.7169, "text": "Started with the framework of the icons for turning the outputs on or off."}, {"post_id": 20828, "ts": "2026-07-02T15:07:41Z", "hours": 0.3336, "text": "Re-positioned the screen page indicator, fixed a bug that that was present since the start (fun fact: I thought that it was not possible to fix that till yesterday till I remembered “break” statement exists thanks to a dream I had last night using break statement to fix the same)"}, {"post_id": 20105, "ts": "2026-07-01T16:59:16Z", "hours": 0.3414, "text": "Added some adjustments, possibly also a framework of multiple screens."}, {"post_id": 19142, "ts": "2026-06-30T11:57:17Z", "hours": 1.2953, "text": "Completed the temperature reading, temperature warning, as well as temperature controlled fan pwm signal. Bugs: Temperature and PWM value fluctuate greatly when connecting an LED as a test for PWM regulation"}, {"post_id": 18287, "ts": "2026-06-29T12:00:09Z", "hours": 0.9761, "text": "Bare-bone version of the code is ready, works without any major bugs.. Next step: Continue coding of the remaining features and functions (Tested and verified on my trusty breadboard setup)"}]...
|
Title: Sub 100 Wh portable power station by @win7 Title: Sub 100 Wh portable power station by @win7 | Stardance
Devlogs:
Bare-bone version of the code is ready, works without any major bugs.. Next step: Continue coding of the remaining features and functions (Tested and verified on my trusty breadboard setup)
Completed the temperature reading, temperature warning, as well as temperature controlled fan pwm signal. Bugs: Temperature and PWM value fluctuate greatly when connecting an LED as a test for PWM regulation
Added some adjustments, possibly also a framework of multiple screens.
Re-positioned the screen page indicator, fixed a bug that that was present since the start (fun fact: I thought that it was not possible to fix that till yesterday till I remembered “break” statement exists thanks to a dream I had last night using break statement to fix the same)
Started with the framework of the icons for turning the outputs on or off.
Replaced the 20 A BMS with a 40 A one, in order to achieve the full 27 A capability
Added 2 pages: Controls and Info, settings page is still pending..
Did a lot of tidying and reposition work as well as addition of various controls toggles on and offs.
Completed drawing the sketch of the portable power station (sorry for the messy work, its the first sketch). Please let me know of any suggestions/improvements..
Worked on the settings screen for a while. Added maximum power limit as well as basic RGB LED colour setting along with EEPROM memory to store the parameters
Burnt some midnight oil to disassemble the breadboard prototype and start with the actual circuitry, soldered a few components so far, yet there’s a lot more to do so, probably gonna take a month to complete -_-.
Did more soldering work, not the prettiest, has a ton of improvements to be made both on the hardware as well as the software side. So far, the charger and the inverter switching part works, need to add a transistor in between the system and the battery in order to turn it off completely when not in use.. Open to suggestions and improvements..
Finally completed the soft-latching power control part in the circuit. 2 Arduino nano(s) were k1lled during the process :*(. Used an N channel MOSFET at first in order to control power going to the Arduino, failed at it, switched to a relay (big mistake), driven by a transistor, finally got out, bought a P channel MOSFET, still driven by an NPN transistor, and in the end, it works flawlessly, gave me immense happiness watching it work flawlessly :D
Completed the chargers part (mainly fixed the power measurement bugs). In addition to that, did the temperature controlled fan part for today, so far works perfectly.
After 800 lines of code, I finally hit the 2kB RAM ceiling. Did some optimization work on the code. Had to take a backup of the flawless code, try new stuff, in split screen mode between 2 IDE screens
A lot of changes and events. Spent almost an hour modifying/testing the charging lightning icon on top of the battery. Fixed the mAh counter Fixed the time to empty counter Edited the power value such that only positive values are shown Killed the boost converter and charger modules, still unsure what caused it but I suspect the boost converter overheating and then finally, a voltage spike killed the charger modules too. Any ideas/opinions are very helpful..
A week’s worth of devlog, probably I’m gonna switch over to weekly devlogs cuz I’m a bit lazy. Anyways, once again, a ton of changes: First and foremost, replaced the charger modules and the boost converter (Boy was it expensive for me). Added ADS1115 ADC as I needed an extra analog pin for measuring input charging voltage, switched voltage, current and temperature measurement to there as well. Planning on adding 2 more temperature sensors, 1 for the battery and 1 for the charger modules. Working on charging part for now, gonna use MPPT. A mystery addition that I bet nobody can guess (its in the image btw), open to your guesses btw.
Took quite a while to try various methods, debug, fix, etc. the MPPT charging. Finally, a transistor pulling the floating 100mV to ground along with an RC filter seems to work, works for now, though not the best way of doing this. (Literally screamed in joy when it finally worked lol :D)
I have planned to integrate haptics to the power station too, though traditional ERMs felt too cheap and unreliable, therefore I made something called the “Haptic block”, an LRA (Linear Resonance Actuator)-based haptic actuator, similar to the ones found in flagship smartphones (I’m looking at you, iPhone 6S!). Used a 12V, 6N solenoid along with a MOSFET, resistor and a flyback diode for switching the solenoid with the Arduino board. It works great, started with the coding process, the timings have to be perfect, else, it feels like metal and plastic colliding (though that’s exactly what’s happening XD). With perfect timing though, it enhances the user experience by a lot!
Messed up and messed around using millis(), need more time to debug and fix it (I’m not an expert when it comes to dealing with millis(), open to suggestions), I don’t want to use delay() since it interferes with my mAh measurement in the code. Did a weird contraption of a capacitor, polarity protector diode on a perf board in order to act as a power distribution board since the boost converter had only 1 screw terminal..
Worked on the haptics for quite a while, still need to add haptic feedback/notification for other messages displayed on the screen, though it is SOO BUGGY! I had to work on it for 3 full days, yet I still feel like the haptic patterns were inconsistent, gotta do more fixing tomorrow, or probably I might focus into something else for a while.
Finally completed the haptics part, there are still some areas that do not work like intended, but I cannot really do much about it. Designed as well as printed cases for the main board and batteries for enhanced safety. My streak has not extended for today despite 3h of work today.,
Completed the addition fan and LED interface to the mainboard. I had to add a separate boost converter to the setup. Still the addition of fan causes fluctuation in time to empty readings, need to fix them in code,,
Completed the case for the inverter part, switched to digital operation of the fan instead of analog due to never ending problems.
Did quite a bit of various work today, but the one that made me glad is the successfull printing of the bench power supply part after 5 devastating failed attempts. Designed the case in Fusion 360 Worked on the header connections Worked on the bench power supply part
Officially over the 100h mark! 🎉 Designed the front plate of the chargers, designed a stencil to drill through the copper sheet that acts as a small ‘heatsoak’, soldered some cables and much more
TERRIBLE NEWS: I lost 3D models of the main front panel, the inverter case AND the chargers panel to a power outage. I know I should’ve saved it but I either complete it and save it or just have them lying in my RAM overnight till it finishes and that power outages are rare for me, but here I am! Completed the bench power supply part, printed the front side in orange and screwed it on the gray bench power supply mount since I’m planning to use orange on gray as opposed to gray on orange. Also added an extra master XT60 connector for direct battery access connections.
Completed the modelling part of the inverter case, charger panel and probably also the front panel. Did some minor bug tweaks in the code Also finished cutting the copper sheet for the inverter module
Printed and assembled the chargers part And also, I’m in the middle of designing the right side panel, gonna take up a ton of time as I’m using hit and trial method
Printed out the front panel, got a ton of work to do on the other panels. Thinking of whether or not to add a fuse in series to the direct source connector.. I feel like fitting all of these components into their designated space might be a very tedious task. Its just a pain to measure and ensure everything is in its own designated region and every part seats in properly, and also, found a mini bug, which is to be fixed in the code,,
Probably a really messy workbench right now. Anyways, once again, did quite a bit of working, especially in CAD and 3D printing. Finally, I’ve hit 100% of the program storage space in my Arduino Nano when uploading my code. Need to optimize the code. Had to snap off the screw mounts and the bottom section of the button mount cover for it to fit, fixed it in the later version though. Also, spent 5 full minutes troubleshooting, opening the mainboard out of its case only to find out that nothing was connected (power button, navigation buttons, etc.). Probably, late night fatigue kicking in,,
Working on the mainboard mount. The mainboard is planned to be mounted on top of the battery pack. Not sure how I’m gonna figure out how to make mounting holes on the bottom panel. Its 12:20 AM rn, need to go to bed,,,
Birthday devlog today🎉! Did a ton more of CAD work, including modification of slots and sketches, and boy was it painful!. I had to re-draw each sketch on top and repeat this once again since I need one for negative extrusion and one for filling the already existing slots. All caused by my poor judgement of the dimensions of the other parts But here I am! Also, had tweaked the code a little, did some power wire replacements and stuff
Looked through the designs and measurements, edited them when necessary, tested the charging circuit, not sure why but it trips my MacBook’s PD 30 W charger but not my Samsung PD power bank, probably due to inrush currents. After a long conflict, finally printed the right side panel, need to proceed with the left, top, bottom and back panel as well. I don’t know, I’m scared to waste ~100g of filament and ~10h of time over a failed print just because of a dimensional mistake or inaccuracy, I’m just looking through the final model in Fusion 360 countless times,!
Printed the left side panel, tried to print the bottom panel but failed, also the BOM list final is ready!! Well, seems like the assembly process is going to be hard due to a ton of wires and obstacles :( Had to trim the direct source connector panel twice for it to fit in the right side panel Boost converter module is held under really high amount of tension probably due to 10mm bolt and nuts. Made orientation and placement mistakes while installing the chargers panel -_-
In the process of making the soft starter circuit for the XL4016 module, since the inrush current trips some chargers, I’m set on using a 555 timer chip in order to turn on a relay 2s after powering on the relay. Anyways, tested the bare-bones version of the power station at around 100 W and/or 10A of current and it worked beautifully, though I was scared to my core when doing so, not wanting this setup to blow up like last time which killed the boost converter and both the charger modules.
Successfully completed the soft started board in order to prevent the inrush current drawn by the XL4016 module from tripping certain chargers. It felt endless, I had to use 2 NPN transistors in an inverter configuration in order to not use a PNP transistor since I did not have one lol. Also 3D printed and replaced the old battery case for a newer one which has ventilation holes, helping in keeping the battery temperatures low..
Welp, killed another boost converter. This one failed by having its output voltage always equal to the input voltage no matter what, unlike previously where the boost converter failed as a direct short. Other than this, I spent a lot of time troubleshooting the charging MPPT function, which seemed to not have proper limit and tripped whatever charger I had connected it to. Had to change the values quite a bit but nothing helped. In the end I noticed that the initial_in_voltage variable was set to the absolute minimum trigger point whenever the charger was connected, therefore the condition where the (initial_in_voltage - in_voltage variable <= 0.2) inequation is always held true and therefore the Arduino ramped up the PWM no matter what, it took a ton of time to figure out -_- In addition to this, I had also spent a around 2h in testing the power station regarding its thermals and max. power capability..
Had to harvest a boost converter from my old bench power supply, fix it (it was dead shorted due to an internally shorted capacitor) Planning on adding a pre-boost converter for the inverter and the charger functions. They refuse to work below 10.2 V, disregarding 20~30% of battery capacity. Recorded the voltage, current, milliamp hours, power drawn along with time stamps. Gosh, my hands are numb now -_-.
Had to tear the unit down, do plastic welding since the screw mounting slots broke. Probably I would rate this as a 0/10 in the reparability scale by myself -_-. Also, bypassed the 10 V regulator on the charger boost converter module and now it can work from 9V. Planned to add another separate boost converter for the inverter to prevent inverter’s low voltage protection from kicking in. Bypassed the regulator here as well. I feel kinda lazy and tired, probably will log more time from tomorrow,,
After a full 2-week fever, I’m back into business :D. Things aren’t great to start off. To sum it up, the inverter died after I connected a chineese steamer apparently rated for “120 W”, when in reality, it drew around 500 W from my wall. My inverter tried to maintain its voltage and ended up killing its MOSFETS. I really hope the MOSFETS are the only ones damaged.
Switching to daily devlogs from now on.. Worked on the broken inverter. Tried replacing the MOSFETS with a different ones. The original ones were MDP1933, with a drain to source resistance of less than 5 milliohms, while the ones I replaced with were IRFZ44N and featured a drain to source resistance of 15 milliohms. I need to find a stronger MOSFET than the original MDP1933 used in the build and also upgrade my table’s sticker to gray :D
Finally replaced the MDP1933 MOSFETs with beefier IRFB4110 MOSFETs, but boy was it expensive! Whenever we replace blown MOSFETs, its a good practice to replace the entire array even if one MOSFET is blown and the others work perfectly fine since you never know if the voltage spike or whatever calamity had partially destroyed it (it would fail to close properly, dropping a lot of voltage) Atleast the inverter’s been fixed now (or is it..?) and outputs a clean 230 V RMS. Tested with a 20 W lamp and it works well. Need to replace the 35 A automotive fuse on it as well since it was also blown due to the direct short that occurred, I’m using a piece of solder wire as a temporary substitute (not recommended btw) Need to test with bigger loads to ensure that its back at business and nothing else was damaged due to the overload. Also worked on the Instructable for the past two days while waiting to get the MOSFETs....
|
1792702058.5845563
|
1793306858.5845563
|
|
27897
|
Astilbe by @yf | Stardance
|
yf
|
0
|
238.2
|
0
|
[]
|
[{"post_id": 76951, "ts": "202 [{"post_id": 76951, "ts": "2026-10-05T05:22:41Z", "hours": 8.2967, "text": "Docs r out. Just b4 release, I will compile a windows compatible exe too, since I am unsigned on mac!"}, {"post_id": 71715, "ts": "2026-09-21T11:24:18Z", "hours": 3.6139, "text": "The dmg is ready! now, website for product before final shipping…"}, {"post_id": 70967, "ts": "2026-09-20T04:05:02Z", "hours": 6.1125, "text": "Prepping for final checks before shipping! Made some assets as well."}, {"post_id": 70076, "ts": "2026-09-18T12:26:23Z", "hours": 4.3944, "text": "26/26 pass! Mutex connections and database sanitisation is certified and up and running. SO far on the release checklist, half of everything is done!"}, {"post_id": 70002, "ts": "2026-09-18T08:00:35Z", "hours": 8.1869, "text": "Did comprehensive backend stress testing especially on the health+integrity of backend database structures by forcefully inserting malformed data. Identified around 2-3 vulnerabilities and 2 blunt failures and I will resolve that in the backend by force-sanitising all data that is to be entered"}, {"post_id": 69833, "ts": "2026-09-17T21:26:08Z", "hours": 8.4408, "text": "Made the search bar in toolkits functional and debugged the css-bug in which the model-detail was not aligned with the styles of model-card classes among other bug hunting work"}, {"post_id": 69590, "ts": "2026-09-17T11:27:50Z", "hours": 8.6647, "text": "Major housekeeping, css bug fixing too"}, {"post_id": 69453, "ts": "2026-09-17T02:40:52Z", "hours": 9.1756, "text": "Added comprehensive error coding (documentation website tba)"}, {"post_id": 68530, "ts": "2026-09-15T08:32:20Z", "hours": 9.7789, "text": "Stopping logic refined, huge unification of toolcall/send direct logic and further housekeeping incl/ with deletion of target/ recompilation, and headless testing (heterogeneous AI testing) and major user testing"}, {"post_id": 67674, "ts": "2026-09-13T20:42:48Z", "hours": 8.8681, "text": "Now toolkits are enable-able (they are too premature for production, they are a beta-feature for the alpha release, I couldn’t really be bothered with more hours of edge case testing and fixing of this specific singular function) and I also added a search bar."}, {"post_id": 67261, "ts": "2026-09-13T10:15:00Z", "hours": 10.5817, "text": "Housekeeping is taking way too long… did some style unifying, etc. Did minor structural edits for edge casing, next devlog I will delete my cache and re-do it to test the full experience! Also, collapsable sidebar!"}, {"post_id": 66942, "ts": "2026-09-12T22:21:49Z", "hours": 15.5981, "text": "Did a lot of housekeeping and stylistic edits! Preparing for alpha release! (Accidentally coded for too long before a devlog, oopsies.)"}, {"post_id": 66366, "ts": "2026-09-12T05:05:04Z", "hours": 5.4525, "text": "yay first in australia (55h this week). Anyway did a bunch of stuff including housekeeping and error catching, introducing error codes E04 and E05; more info will come as we get closer to github release and alpha release."}, {"post_id": 65666, "ts": "2026-09-10T23:30:12Z", "hours": 8.535, "text": "Did bug hunting, Error handling and housekeeping. Be tuned for the alpha release, the second next devlog!"}, {"post_id": 65389, "ts": "2026-09-10T14:28:24Z", "hours": 4.4897, "text": "Implemented a search (wikipedia) tool! Second last stage before alpha release!"}, {"post_id": 65275, "ts": "2026-09-10T08:50:27Z", "hours": 9.8061, "text": "Added tool calls! Now assistants can read your system specs and remember what you said (if you ask it to)"}, {"post_id": 64755, "ts": "2026-09-09T12:07:17Z", "hours": 7.2394, "text": "Added toolkit skeleton, and added chat branching + regeneration!"}, {"post_id": 64546, "ts": "2026-09-09T01:32:09Z", "hours": 7.5061, "text": "Theme chooser and auto-titler implemented! Auto-titler automatically uses the loaded model to generate a title for your conversation (I did implement using smallest model, but the current model is shown to be much faster due to cache anyway) in the backend. I also implemented a little orientation tour. This time it’s all light mode, to make up for my silly mistake last devlog of posting a darkmode with my light mode update."}, {"post_id": 64170, "ts": "2026-09-08T12:02:50Z", "hours": 2.3167, "text": "Added a light theme and some icons (svg)!"}, {"post_id": 63935, "ts": "2026-09-08T00:38:20Z", "hours": 9.3778, "text": "Streamlined the onboarding experience, now onboarding preferences do save properly! Model recommendations also dynamically updated. I started a git to prepare for major feature additions but it is not yet uploaded to GitHub. Stay tuned!"}, {"post_id": 63510, "ts": "2026-09-07T12:39:34Z", "hours": 2.4556, "text": "Devlog X? Hi all, Astilbe is approaching YAGNI full basic functionality. I’m really excited! Anyhow I apologise for taking this long to write a proper devlog. However, I will accordingly update all my previous devlogs with the detail we all deserve very soon as I finish the polish. This devlog will be a summary of the previous devlogs combined: CSS is standardised. I have to concur that it is substantially, the new styling, is AI-generated; however, a lot of details were manually tweaked. I also ensured standardisation of styling and tested edge cases personally. (Animations were also comprehensively standardised and implemented) Settings is now separated into basic and advanced settings. Advanced settings is enable-able with a toggle. If you ask why, it’s because Astilbe is designed to be grandma-friendly and useful for people who are not necessarily computer savvy. Model Library is now fully functional. Basically, you can now download any model from the library, and you can adjust your tiers to the models that you like. (Tiers is just the models set for the “fast”, “balanced” and “advanced” modes.) Error handling is unified now. Catch-alls are implemented more comprehensively and I have been doing manual edge-case testing to ensure polish for every single function added. In this devlog, I added smart conversation ranking and infinite scroll, in order to save compute from being wasted by displaying EVERY SINGLE old conversation in the scrollbar, similar to how Claude does it. Conversations are now also ranked by the last_used time. Anyhow, that’s all for now. Thank you for reading!"}, {"post_id": 63441, "ts": "2026-09-07T09:12:28Z", "hours": 10.9264, "text": "Implemented model library, did a LOT of debugging, separated settings, resolved the Qwen-model printing."}, {"post_id": 62900, "ts": "2026-09-06T13:06:59Z", "hours": 4.0383, "text": "#Major stylistic update!"}, {"post_id": 34590, "ts": "2026-07-25T13:24:16Z", "hours": 8.7214, "text": "We implemented popups and did bug hunting"}, {"post_id": 30062, "ts": "2026-07-17T10:45:46Z", "hours": 8.5508, "text": "Model Library is fully implemented now!"}, {"post_id": 29890, "ts": "2026-07-17T01:40:15Z", "hours": 2.4431, "text": "Now model choosing is available"}, {"post_id": 28822, "ts": "2026-07-15T10:07:36Z", "hours": 1.2228, "text": "Multi-model downloading now enabled!"}, {"post_id": 28208, "ts": "2026-07-14T11:02:23Z", "hours": 1.0669, "text": "Did some algorithm efficienticising for a more balanced algorithm! More details to come…"}, {"post_id": 28131, "ts": "2026-07-14T07:07:27Z", "hours": 7.5458, "text": "Model suggestions are ready!"}, {"post_id": 26267, "ts": "2026-07-10T23:24:52Z", "hours": 11.1003, "text": "Tried to use WebLLM; reverted. Coding binge"}, {"post_id": 25905, "ts": "2026-07-10T12:16:06Z", "hours": 1.8692, "text": "Error handling and basic chat finalised"}, {"post_id": 25848, "ts": "2026-07-10T10:23:07Z", "hours": 4.5439, "text": "Major updates to Astilbe! More info to come when core functionality is implemented and I have time to start recordign detailed devlogs."}, {"post_id": 25234, "ts": "2026-07-09T11:13:31Z", "hours": 2.0533, "text": "Updates to come when my devlogs are formatted properly in ~3 days"}, {"post_id": 25071, "ts": "2026-07-09T01:01:36Z", "hours": 9.5983, "text": "More updates to come soon (I definitely did not rewrite the entire architecture)"}, {"post_id": 18281, "ts": "2026-06-29T11:40:03Z", "hours": 0.9589, "text": "Devlog 4"}, {"post_id": 18132, "ts": "2026-06-29T04:30:15Z", "hours": 1.2342, "text": "Devlog 3: Settings and Customisation Hello everybody! @yf here with the third devlog. Thankfully, there was not much change to the project purpose (phew) so I can jump straight into what I did. A quick snapshot: I implemented a working settings panel that allows users to customise their experience and saves it to a temp file in the app via tauri-plugin-store . What did I do? I: Created a settings panel that allows customisation of the following values: (For Dev mode:) temperature (float, 0.0-1.0) top_p (float, 0.0-1.0) top_k (int, 1-100) (For the everyday user, dev mode values are hidden, and the following values are the changeable ones:) streaming (bool, true/false) thinking (bool, true/false) theme (string, not implemented yet) I then stored the values as a single json structure options structured in the following way: { \"temperature\" : 0.7 , \"top_p\" : 0.9 , \"top_k\" : 40 , \"streaming\" : true , \"thinking\" : true , \"theme\" : \"default\" , \"model\" : \"Qwen3.5:0.8/2/4B\" } (i.e.) Then, I ditched yet again the rust backend message structure to make way for this new chat structure. I basically added a new key-value pair to the ChatMessage struct, which is options: ChatOptions , and fed it into ollama by flattening it using serde’s flatten attribute, structured the same way as the json above. Models cannot be changed as of the moment. Made the settings panel collapsible via the simple classList toggling. Implemented a simple tauri-plugin-store to save the settings to a temp file in the app, and then read it back on app start. This allows users to have their settings persist across sessions. What’s next? Of course, to truly streamline the user experience, I will have to install Ollama with the application. My next priorities are: To bundle Ollama bin with the application and install it on the user’s machine WITH the model. (This will use quite a lot of space, but I guess the installer file will be small enough to accomodate this.) To spawn the ollama process automatically rather than user required, and to kill it when the app is closed. I will do this all in the backend for security purposes. I could realistically just use ollama.cpp, but this means users have to download models themselves, so I think, at least for now, I will stick with the ollama binary. I will consider this in the future."}, {"post_id": 18046, "ts": "2026-06-29T00:42:02Z", "hours": 0.8717, "text": "Devlog 2: Streaming Responses Hello everybody! I’m back very quickly with the second devlog. As promised, Oh! Chat is: IN THE MODERN DIGITAL AGE, it has become increasingly difficult to control one’s exposure to the internet, regardless of how reserved one may be or what precautions one may take. With the advent of the large language model era, where people could discuss confidential information with chatbots, this problem - our inability to control the flow of our own data, relying on vague promises of ‘privacy’ that cloud-based services claim but never prove - has become more relevant than ever. Oh! Chat aims to combat this by giving users the premium UX that one experiences on existing AI chatbot applications and interfaces, retaining as much AI functionality as possible, while facilitating user operation, installation, and guaranteeing data privacy. (from a readme draft) Anyhow, let’s get to the point. Since we want everyday users to feel comfortable, we want to replicate the experience of existing AI chatbots. An important part of this is the text streaming feature, which allows users to see the response as it is being generated: a typing-like effect, and it is also a good method to verify that the model is working. This is what I did in this devlog. What did I do? I: Implemented a streaming response feature in the backend. Firstly, we ditch the original old logic with match request.await . This is because the await means we have to WAIT for the entire response to output before continued function execution (which is unideal). Instead, we use reqwest::Client to send a POST request to the Ollama instance, and then we use response.bytes_stream() to get a stream of bytes from the response. We then iterate over the stream using while let Some(chunk) = stream.next().await , and each chunk we convert it to a string and send it back to the frontend using emit_all(\"chunk\", chunk_str) . And the client gets it in real time via the listen(\"chunk\", (event) => { ... }) function as an initialised await in main.js . Finally, at the end of the response, a rust event response_end is emitted, and the frontend can accordingly adjust. A very simple implementation, but it works effectively. Drafted a basic readme . … That’s it. (It was quite hard to implement, but it is necessary for user experience.) What’s next? I plan on: Allowing chat customisation (to some degree) via settings. More details to come later. UI overhaul no. 1 and replacing the boilerplate html structure with a more well-defined one. Anyhow, thanks for reading! Watch for the next devlog."}, {"post_id": 17972, "ts": "2026-06-28T22:40:29Z", "hours": 2.5644, "text": "Devlog 1: The Start Hello everybody! This is the very first devlog for Oh! Chat. Well, we have to begin somewhere, right? And for us, we begin in this devlog. For the first entry, I can’t really expect not to do all the dirty work of setting up, dependency checking, and all the other mess that comes with starting. A quick overview: I built the initial bridge between front/backend, and established communication with the local Ollama instance. Also, a personal goal for me: maintain a level of professionalism when logging devlogs (so no more heavy slang, etc.). What is this? (Due to word limits please refer to the next devlog) What did I do? Let’s first talk about what we needed to finish before we could even start. Ollama & a local LLM As the top-tier consumer-grade inference engine for LLMs, Ollama is a good choice for the project. I also used the Qwen3.5:0.8/2/4B models for testing, as excellent edge models for testing. Tauri v2 Tauri is a great framework for building cross-platform desktop applications with html, css and js which I am familiar with. It also uses rust for backend, and though I am not proficient in rust (I have written some basic things in rust before, but not a full backend yet), I aim to use this project to further develop my skills. We now pivot to what I did in the first devlog: Environment & Project Initialization Created the core project structure utilizing the Tauri v2 CLI framework. (Following this tutorial ) Frontend Layout & Boilerplate Architecture Initialised a boilerplate frontend chat template with minimal css and html, and I wired main.js to the backend via invoke and listen commands. Local IPC & The Ollama Localhost Bridge Edited the Rust backend inside src-tauri/src/lib.rs. Creating async commands (#[tauri::command]) to handle inter-process communication (IPC): A hello world tester command; Mapping out the communication layer targeting localhost:11434 (the Ollama api server address for the local instance) to talk directly to the local Ollama instance running on the host machine with reqwest and tokio async libraries.: check_status : checks status (obviously) send_msg(message: ChatMessage) : sends a message to the Ollama instance and sends the response back directly using match request.await to handle the response as a single coherent string. (This is temporary for the moment as I will be implementing streaming soon). The message struct is also super simple: a simple json-like key-value pair: role: String, message: String . We use serde to serialize and deserialize the JSON data sent to and from the Ollama instance. What’s next? Well, there’s a lot to do. I have not yet done a lot of stuff, and I have many priorities with respect to this application, so I won’t be able to describe to you what I will do next; I guess you can just wait for the next devlog. But I can say that the following will definitely be likely to be done in the next update: Allowing slight chat customisation (Building on 1) giving users a settings panel to allow them to customise their experience. Drafting a basic readme . (non priority) Improve UI? Anyhow, thanks for reading and I hope you are eager for the next devlog (Cause I am!)"}]...
|
Title: Astilbe by @yf | Stardance
Devlogs:
Devlog Title: Astilbe by @yf | Stardance
Devlogs:
Devlog 1: The Start Hello everybody! This is the very first devlog for Oh! Chat. Well, we have to begin somewhere, right? And for us, we begin in this devlog. For the first entry, I can’t really expect not to do all the dirty work of setting up, dependency checking, and all the other mess that comes with starting. A quick overview: I built the initial bridge between front/backend, and established communication with the local Ollama instance. Also, a personal goal for me: maintain a level of professionalism when logging devlogs (so no more heavy slang, etc.). What is this? (Due to word limits please refer to the next devlog) What did I do? Let’s first talk about what we needed to finish before we could even start. Ollama & a local LLM As the top-tier consumer-grade inference engine for LLMs, Ollama is a good choice for the project. I also used the Qwen3.5:0.8/2/4B models for testing, as excellent edge models for testing. Tauri v2 Tauri is a great framework for building cross-platform desktop applications with html, css and js which I am familiar with. It also uses rust for backend, and though I am not proficient in rust (I have written some basic things in rust before, but not a full backend yet), I aim to use this project to further develop my skills. We now pivot to what I did in the first devlog: Environment & Project Initialization Created the core project structure utilizing the Tauri v2 CLI framework. (Following this tutorial ) Frontend Layout & Boilerplate Architecture Initialised a boilerplate frontend chat template with minimal css and html, and I wired main.js to the backend via invoke and listen commands. Local IPC & The Ollama Localhost Bridge Edited the Rust backend inside src-tauri/src/lib.rs. Creating async commands (#[tauri::command]) to handle inter-process communication (IPC): A hello world tester command; Mapping out the communication layer targeting localhost:11434 (the Ollama api server address for the local instance) to talk directly to the local Ollama instance running on the host machine with reqwest and tokio async libraries.: check_status : checks status (obviously) send_msg(message: ChatMessage) : sends a message to the Ollama instance and sends the response back directly using match request.await to handle the response as a single coherent string. (This is temporary for the moment as I will be implementing streaming soon). The message struct is also super simple: a simple json-like key-value pair: role: String, message: String . We use serde to serialize and deserialize the JSON data sent to and from the Ollama instance. What’s next? Well, there’s a lot to do. I have not yet done a lot of stuff, and I have many priorities with respect to this application, so I won’t be able to describe to you what I will do next; I guess you can just wait for the next devlog. But I can say that the following will definitely be likely to be done in the next update: Allowing slight chat customisation (Building on 1) giving users a settings panel to allow them to customise their experience. Drafting a basic readme . (non priority) Improve UI? Anyhow, thanks for reading and I hope you are eager for the next devlog (Cause I am!)
Devlog 2: Streaming Responses Hello everybody! I’m back very quickly with the second devlog. As promised, Oh! Chat is: IN THE MODERN DIGITAL AGE, it has become increasingly difficult to control one’s exposure to the internet, regardless of how reserved one may be or what precautions one may take. With the advent of the large language model era, where people could discuss confidential information with chatbots, this problem - our inability to control the flow of our own data, relying on vague promises of ‘privacy’ that cloud-based services claim but never prove - has become more relevant than ever. Oh! Chat aims to combat this by giving users the premium UX that one experiences on existing AI chatbot applications and interfaces, retaining as much AI functionality as possible, while facilitating user operation, installation, and guaranteeing data privacy. (from a readme draft) Anyhow, let’s get to the point. Since we want everyday users to feel comfortable, we want to replicate the experience of existing AI chatbots. An important part of this is the text streaming feature, which allows users to see the response as it is being generated: a typing-like effect, and it is also a good method to verify that the model is working. This is what I did in this devlog. What did I do? I: Implemented a streaming response feature in the backend. Firstly, we ditch the original old logic with match request.await . This is because the await means we have to WAIT for the entire response to output before continued function execution (which is unideal). Instead, we use reqwest::Client to send a POST request to the Ollama instance, and then we use response.bytes_stream() to get a stream of bytes from the response. We then iterate over the stream using while let Some(chunk) = stream.next().await , and each chunk we convert it to a string and send it back to the frontend using emit_all("chunk", chunk_str) . And the client gets it in real time via the listen("chunk", (event) => { ... }) function as an initialised await in main.js . Finally, at the end of the response, a rust event response_end is emitted, and the frontend can accordingly adjust. A very simple implementation, but it works effectively. Drafted a basic readme . … That’s it. (It was quite hard to implement, but it is necessary for user experience.) What’s next? I plan on: Allowing chat customisation (to some degree) via settings. More details to come later. UI overhaul no. 1 and replacing the boilerplate html structure with a more well-defined one. Anyhow, thanks for reading! Watch for the next devlog.
Devlog 3: Settings and Customisation Hello everybody! @yf here with the third devlog. Thankfully, there was not much change to the project purpose (phew) so I can jump straight into what I did. A quick snapshot: I implemented a working settings panel that allows users to customise their experience and saves it to a temp file in the app via tauri-plugin-store . What did I do? I: Created a settings panel that allows customisation of the following values: (For Dev mode:) temperature (float, 0.0-1.0) top_p (float, 0.0-1.0) top_k (int, 1-100) (For the everyday user, dev mode values are hidden, and the following values are the changeable ones:) streaming (bool, true/false) thinking (bool, true/false) theme (string, not implemented yet) I then stored the values as a single json structure options structured in the following way: { "temperature" : 0.7 , "top_p" : 0.9 , "top_k" : 40 , "streaming" : true , "thinking" : true , "theme" : "default" , "model" : "Qwen3.5:0.8/2/4B" } (i.e.) Then, I ditched yet again the rust backend message structure to make way for this new chat structure. I basically added a new key-value pair to the ChatMessage struct, which is options: ChatOptions , and fed it into ollama by flattening it using serde’s flatten attribute, structured the same way as the json above. Models cannot be changed as of the moment. Made the settings panel collapsible via the simple classList toggling. Implemented a simple tauri-plugin-store to save the settings to a temp file in the app, and then read it back on app start. This allows users to have their settings persist across sessions. What’s next? Of course, to truly streamline the user experience, I will have to install Ollama with the application. My next priorities are: To bundle Ollama bin with the application and install it on the user’s machine WITH the model. (This will use quite a lot of space, but I guess the installer file will be small enough to accomodate this.) To spawn the ollama process automatically rather than user required, and to kill it when the app is closed. I will do this all in the backend for security purposes. I could realistically just use ollama.cpp, but this means users have to download models themselves, so I think, at least for now, I will stick with the ollama binary. I will consider this in the future.
Devlog 4
More updates to come soon (I definitely did not rewrite the entire architecture)
Updates to come when my devlogs are formatted properly in ~3 days
Major updates to Astilbe! More info to come when core functionality is implemented and I have time to start recordign detailed devlogs.
Error handling and basic chat finalised
Tried to use WebLLM; reverted. Coding binge
Model suggestions are ready!
Did some algorithm efficienticising for a more balanced algorithm! More details to come…
Multi-model downloading now enabled!
Now model choosing is available
Model Library is fully implemented now!
We implemented popups and did bug hunting
#Major stylistic update!
Implemented model library, did a LOT of debugging, separated settings, resolved the Qwen-model printing.
Devlog X? Hi all, Astilbe is approaching YAGNI full basic functionality. I’m really excited! Anyhow I apologise for taking this long to write a proper devlog. However, I will accordingly update all my previous devlogs with the detail we all deserve very soon as I finish the polish. This devlog will be a summary of the previous devlogs combined: CSS is standardised. I have to concur that it is substantially, the new styling, is AI-generated; however, a lot of details were manually tweaked. I also ensured standardisation of styling and tested edge cases personally. (Animations were also comprehensively standardised and implemented) Settings is now separated into basic and advanced settings. Advanced settings is enable-able with a toggle. If you ask why, it’s because Astilbe is designed to be grandma-friendly and useful for people who are not necessarily computer savvy. Model Library is now fully functional. Basically, you can now download any model from the library, and you can adjust your tiers to the models that you like. (Tiers is just the models set for the “fast”, “balanced” and “advanced” modes.) Error handling is unified now. Catch-alls are implemented more comprehensively and I have been doing manual edge-case testing to ensure polish for every single function added. In this devlog, I added smart conversation ranking and infinite scroll, in order to save compute from being wasted by displaying EVERY SINGLE old conversation in the scrollbar, similar to how Claude does it. Conversations are now also ranked by the last_used time. Anyhow, that’s all for now. Thank you for reading!
Streamlined the onboarding experience, now onboarding preferences do save properly! Model recommendations also dynamically updated. I started a git to prepare for major feature additions but it is not yet uploaded to GitHub. Stay tuned!
Added a light theme and some icons (svg)!
Theme chooser and auto-titler implemented! Auto-titler automatically uses the loaded model to generate a title for your conversation (I did implement using smallest model, but the current model is shown to be much faster due to cache anyway) in the backend. I also implemented a little orientation tour. This time it’s all light mode, to make up for my silly mistake last devlog of posting a darkmode with my light mode update.
Added toolkit skeleton, and added chat branching + regeneration!
Added tool calls! Now assistants can read your system specs and remember what you said (if you ask it to)
Implemented a search (wikipedia) tool! Second last stage before alpha release!
Did bug hunting, Error handling and housekeeping. Be tuned for the alpha release, the second next devlog!
yay first in australia (55h this week). Anyway did a bunch of stuff including housekeeping and error catching, introducing error codes E04 and E05; more info will come as we get closer to github release and alpha release.
Did a lot of housekeeping and stylistic edits! Preparing for alpha release! (Accidentally coded for too long before a devlog, oopsies.)
Housekeeping is taking way too long… did some style unifying, etc. Did minor structural edits for edge casing, next devlog I will delete my cache and re-do it to test the full experience! Also, collapsable sidebar!
Now toolkits are enable-able (they are too premature for production, they are a beta-feature for the alpha release, I couldn’t really be bothered with more hours of edge case testing and fixing of this specific singular function) and I also added a search bar.
Stopping logic refined, huge unification of toolcall/send direct logic and further housekeeping incl/ with deletion of target/ recompilation, and headless testing (heterogeneous AI testing) and major user testing
Added comprehensive error coding (documentation website tba)
Major housekeeping, css bug fixing too
Made the search bar in toolkits functional and debugged the css-bug in which the model-detail was not aligned with the styles of model-card classes among other bug hunting work
Did comprehensive backend stress testing especially on the health+integrity of backend database structures by forcefully inserting malformed data. Identified around 2-3 vulnerabilities and 2 blunt failures and I will resolve that in the backend by force-sanitising all data that is to be entered
26/26 pass! Mutex connections and database sanitisation is certified and up and running. SO far on the release checklist, half of everything is done!
Prepping for final checks before shipping! Made some assets as well.
The dmg is ready! now, website for product before final shipping…
Docs r out. Just b4 release, I will compile a windows compatible exe too, since I am unsigned on mac!...
|
1792630367.8264303
|
1793235167.8264303
|
|
7614
|
UniScan by @dexrn | Stardance
|
dexrn
|
0
|
239.34
|
0
|
[]
|
[{"post_id": 81208, "ts": "202 [{"post_id": 81208, "ts": "2026-10-20T09:19:45Z", "hours": 9.0592, "text": "Coming in the next full update will also be UI modes This is so that the UI is optimized for every device and their input methods This is the Mobile one, and the main page will (when its finished) have all remotes including non-connected ones and a button to add more remotes and such."}, {"post_id": 80144, "ts": "2026-10-16T11:58:28Z", "hours": 3.9517, "text": "Working on settings…! After this there will be configuration on the serverside and then after that, audio streaming!"}, {"post_id": 79731, "ts": "2026-10-15T07:54:37Z", "hours": 6.7103, "text": "New logo! (credits at end) I intend to make the logo customizable by allowing you to change the color of various elements, and choose between different logos (since no other software ive seen does this) Maybe even change the color of the scanner display when someone is talking even… Thanks to Unomelon for the base, which I used to draw the scanner. Check out Unomelon here: https://bsky.app/profile/unomelon.bsky.social , and his very cool game Allumeria here: https://allumeria.com/ (wasnt asked to add this but I think the game is really cool and am somewhat active in the community)"}, {"post_id": 77782, "ts": "2026-10-08T08:12:30Z", "hours": 5.2025, "text": "Finally committed the latest Shiki changes, will release UniScan’s next commit tomorrow."}, {"post_id": 76647, "ts": "2026-10-04T07:57:18Z", "hours": 11.0072, "text": "Have been working on more Shiki refactors and a nice language system for servers in UniScan to provide language strings without being able to overwrite client language strings Reworked most of the TaskPipelineBuilder with many more accepting delegate types and have done some cleanup since Tomorrow I will finish up releasing the next Shiki version and then I think I will be able to release the next UniScan commit and then keep working for an alpha release."}, {"post_id": 73501, "ts": "2026-09-25T07:49:46Z", "hours": 9.2694, "text": "getting yelled at by starpheus because I haven’t made devlog yet spent all nighter last night refactoring shiki’s modulemanagement project and then today I refactored lots of shiki’s taskpipeline project, as well as some work being done on Shiki’s Result and family (shiki is the side project library with most of it’s code originating from UniScan, and UniScan heavily depends on it) Now the browser initialization is much cleaner (but not perfect of course) (first screenshot is new, second is old) Removed HostEnvironment because we usually only grab the parts from DI anyway"}, {"post_id": 73041, "ts": "2026-09-24T08:06:31Z", "hours": 11.4114, "text": "For funzies, here’s the dev build running inside a rooted Oculus Quest 2 (thanks to my friend for testing this) This is also a good test of the netcode over a long distance (they’re in Malaysia while I’m in the US) Getting close to committing this all alongside Shiki and such… Long cleanup process."}, {"post_id": 70021, "ts": "2026-09-18T09:20:00Z", "hours": 2.1572, "text": "Here’s a showcase of my Uniden SDS100 scanning, with UniScan showing the details in real time! I programmed in some garbage test channels so you won’t see any channels talking in this video. Everything shown here is sent by the server and updated by the server… Still somewhat far from complete as I have to figure out more stuff (mainly more stuff for the client to deal with, like hiding state display textblock on null bindings and more UI features/styling)."}, {"post_id": 69912, "ts": "2026-09-18T01:47:47Z", "hours": 10.1983, "text": "Okayyy so I was able to actually completely gut DeviceState and now it’s actually just a class which is also used to serialize individual states. This also means I can nuke reflection from the serialization process since I can just make IDeviceState forced to inherit IStateSerializer which will be much more dynamic!!! This means literally any states can be sent to the client and as long as the server or the module has the UI to render the states, it will work. This also allows states to be diffed and only the changed parts to be sent Second screenshot shows the UI sent by the server, note that the Volume: 0 is actually all being handled on the client via binding strings (where the server only sends the client the device states and the binding strings will look up those states itself)"}, {"post_id": 67990, "ts": "2026-09-14T10:18:38Z", "hours": 0.7964, "text": "And now we can finally start seeing the fruits of our labor"}, {"post_id": 67864, "ts": "2026-09-14T04:29:36Z", "hours": 7.07, "text": "IT FINALLY WORKS The UI shit I built on the server now syncs to the client correctly, and the flow isn’t actually too bad! Although this will be improved by also having a registry…registry…(yeah I know it’s weird) on the client so that UI elements can have values bind to them, and all the server has to do is send the client data to those registries"}, {"post_id": 65237, "ts": "2026-09-10T07:13:02Z", "hours": 3.4144, "text": "Went on a small side-tangent. Icons! (dw still working on the SSR device stuff)"}, {"post_id": 63401, "ts": "2026-09-07T06:50:20Z", "hours": 5.6181, "text": "Sorry, haven’t been super active due to life. Fixed a few bugs in the meantime and implemented most of the SSR binding stuff, but it’s far from finished, hell I haven’t even gotten to test it yet. Will be gone for a bit tomorrow, and the next day I will be at a different house for a few days albeit with my computer."}, {"post_id": 61349, "ts": "2026-09-04T07:02:15Z", "hours": 5.4761, "text": "While I didn’t get to scanner state displaying yet, I did refactor the classes that handle how remotes connect, disconnect, etc so that it’s not spread around the codebase. This fixes a few bugs related to state management due to how originally these viewmodels were constructed separately of eachother. Tomorrow I will be gone for a few hrs but should be back soon enough to hopefully make some more refactors and/or start on the remote display. Pictured is the new disconnect button in the remote on the sidebar"}, {"post_id": 60741, "ts": "2026-09-03T09:41:59Z", "hours": 2.8389, "text": "The client can now disconnect itself, and more styling has been added to the SSR UI (shown here is a Container which is centered and has a slight margin) tomorrow will be some more work on the SSR UI and then finally getting the scanner state to show on the client. I’m not too pleased with the idea that the server may change the look of the device pages on the clients, though… I still feel like there could be some better way to go about this."}, {"post_id": 60674, "ts": "2026-09-03T06:03:58Z", "hours": 7.28, "text": "I FINALLY GOT SSR WORKING MY GOD still too primitive to do anything atm, working on it."}, {"post_id": 59441, "ts": "2026-09-01T09:14:39Z", "hours": 2.6186, "text": "A friend of mine was able to test it on iOS, we got it working. Gonna have them send in the PR later and set up CI for it."}, {"post_id": 58714, "ts": "2026-08-31T07:59:18Z", "hours": 3.1222, "text": "Started working on state sync, will continue tomorrow probably States are synced now but I need to think about how to deal with scanner groups and channels and such because there are different types of channels (such as P25, conventional, etc) among other type issues and I want to reduce the need for any modules on the client if I can."}, {"post_id": 56408, "ts": "2026-08-28T05:18:41Z", "hours": 1.9061, "text": "UniScan Client v0.1.0, UniScan Server (Host) v0.1.1 Lots of changes, most of them are backend changes, but there are also a handful of frontend changes too! https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.1.0 Remotes are now stored per file instead of one large file, and the UI has been neatened up. The server now sends metadata containing a logo, various information, an MOTD, links, etc. The UI has been updated to display this information too. There are more changes than this, but there are too many to list here without hitting the 4000 char limit. Attached is a small video showing some of the new UI stuffs. By no means is it bug free, but the PR reached a point where it could be merged to allow for other important tasks to be focused on (like y’know, showing the actual scanner info)"}, {"post_id": 55440, "ts": "2026-08-27T08:29:55Z", "hours": 1.0639, "text": "I think this looks pretty nice apparently Avalonia has some nuget package that adds ItemsRepeater which does what I was originally trying to do in a cleaner way"}, {"post_id": 55410, "ts": "2026-08-27T06:57:46Z", "hours": 0.9983, "text": "Here’s the announcements UI, I think I’m almost done on this branch and then I’ll continue on main."}, {"post_id": 55287, "ts": "2026-08-27T00:47:49Z", "hours": 2.4511, "text": "Need opinions on this UI The server logo now shows where possible, so on the home view and in the sidebar In the remote view, there is a top ‘window’(?) that holds (from top to bottom): logo (to the side: title, description), server links and then the bottom floating window thing holds the server MOTD I still need to find a place to hold the server announcements… Alongside this were a ton of internal refactors, and the subscribe button now works (but the server still won’t properly send the current state) Been trying to post this since yesterday (I re-recorded the video today), but Hackatime has been down."}, {"post_id": 54227, "ts": "2026-08-25T03:48:43Z", "hours": 5.8811, "text": "Remotes are now stored per file instead of all inside one file. Additionally, server info is now properly cached! I had to rewrite most of the remote initialization flow, but now it’s much better. Adding and removing remotes automatically saves to disk because I can observe the list. This isn’t the end of this overhaul, but we’re getting closer… I think I want to refactor more of UniScanClient next. This is happening on another branch: https://github.com/UniScanProject/UniScan/tree/feat/use_server_provided_display_names After this branch is merged into main, I will make the available server info also show since we have the entire RemoteInfo being sent, which includes announcements, a description, a logo, etc."}, {"post_id": 53539, "ts": "2026-08-24T04:08:25Z", "hours": 3.6514, "text": "Working on dropping display names from client remotes As well as some refactor of the connection flow using my new TaskPipeline Once this is done, the server will be able to send branding, announcements, and other useful information on connect for the client to display!"}, {"post_id": 52159, "ts": "2026-08-22T07:56:54Z", "hours": 1.7483, "text": "Just released a new version, now you can make remotes from the UI finally. Here’s a video showing the creation flow. Note that the list is dynamic based on classes implementing IConnectionMethodFactoryViewModel with attribute ConnectionMethodFactoryViewModelAttribute"}, {"post_id": 52085, "ts": "2026-08-22T04:54:12Z", "hours": 2.8142, "text": "working on fixing the fact that you can’t really make remotes"}, {"post_id": 51645, "ts": "2026-08-21T13:05:32Z", "hours": 3.4047, "text": "FINALLY I GOT IT DONE IM SO TIRED New loading screen!!!! And OPFS file handles are now keyed by int im going to sleep now https://uniscan.dexrn.me"}, {"post_id": 51484, "ts": "2026-08-21T06:59:47Z", "hours": 0.3158, "text": "Much nicer loading screen"}, {"post_id": 51332, "ts": "2026-08-20T22:40:12Z", "hours": 2.3814, "text": "Alright I’ve committed and now you can access UniScan through https://uniscan.dexrn.me Note that since this is still an early version, you can’t really do much. You can also install it as a PWA on iOS, Android, and most desktop browsers. (pictured is UniScan as a PWA in ungoogled-chromium) Hopefully tomorrow I will fix the crash with adding remotes by making some sort of map of connection type -> UI widget to define the settings for them. (meant to post this yesterday, but GH was still working on some cert garbage)"}, {"post_id": 50726, "ts": "2026-08-20T02:11:03Z", "hours": 1.7997, "text": "UniScan now works in browser! I’ve also added a nice crash handler since unhandled exceptions act weird in the browser. Just polishing up now, will commit and set up Actions to host this. Once it’s up, the link will be https://uniscan.dexrn.me (The crash shown in the video is a real issue and will be fixed later.)"}, {"post_id": 50685, "ts": "2026-08-20T00:10:14Z", "hours": 2.6617, "text": "FINALLY I GOT OPFS WORKING GG"}, {"post_id": 50163, "ts": "2026-08-19T08:34:19Z", "hours": 0.6781, "text": "OK I GOT IT SOMEWHAT WORKING IN BROWSER FINALLY still need to keep implementing OPFS stuff though. serilog 01:32:29 [ERR | UniScan.Client.Core.Config.Remote.RemotesListFile] Failed to save remotes to remotes.json System.Exception: Entry not found at SpawnDev.SpawnJS.SpawnJSRuntime.<_InteropCallApplyAsync>d__132`1[[SpawnDev.SpawnJS.JSObjects.FileSystemSyncAccessHandle, SpawnDev.SpawnJS, Version=2.1.8.0, Culture=neutral, PublicKeyToken=null]].MoveNext()"}, {"post_id": 50120, "ts": "2026-08-19T06:14:18Z", "hours": 1.0522, "text": "I think this looks pretty good for a little loading screen. I’ll probably add a try/catch if possible and show an error dialog when some fatal exception is thrown… The “Loading…” text is temporary and is done in Avalonia, will make a proper loading screen there sometime later."}, {"post_id": 50073, "ts": "2026-08-19T03:53:07Z", "hours": 1.5272, "text": "Using this time to test out M3 web (even though it’s in maintenance mode) This is just for the loading screen while it downloads all the WASMs. The cell tower is temporary until I can either make my own logo or find someone who will make one for me."}, {"post_id": 49405, "ts": "2026-08-18T06:53:24Z", "hours": 0.5689, "text": "Waiting on a bug to be fixed in SpawnJS.WebWorkers and then hopefully next update will include web support + a website for y’all to test the client!!! Couldn’t do much today since I was so busy, however since I’m home now I can work on UniScan at a better time than 12 in the morning."}, {"post_id": 48708, "ts": "2026-08-17T06:57:16Z", "hours": 2.0306, "text": "Didn’t get to release last night, as a new bug popped up. 11>MessagePack.GeneratedMessagePackResolver.g.cs(74,74): Error CS0426 : The type name 'Shiki' does not exist in the type 'GeneratedMessagePackResolver'11>------- Finished building project: UniScan.Network. Succeeded: False. Errors: 1. Was able to fix it with some property in the AssemblyInfo. (see: github.com/MessagePack-CSharp/MessagePack-CSharp/issues/2133) I changed the Identifier to be a Slug instead for the devices. Working on browser stuff real quick and will commit sometime soon."}, {"post_id": 47901, "ts": "2026-08-16T05:27:47Z", "hours": 1.0794, "text": "Not fully happy with the manner in which this works, but the virtual scanner does work! Will publish some if not all of it tonight, but no version tag for this yet until I fix my refactoring."}, {"post_id": 47322, "ts": "2026-08-15T06:23:55Z", "hours": 1.4389, "text": "Working on a virtual scanner module to help development by simulating a scanner, hope to have it ready by tomorrow. This also means any future contributors will be able to start contributing even if they do not own a scanner!"}, {"post_id": 46716, "ts": "2026-08-14T05:00:44Z", "hours": 0.8869, "text": "spun up entire android emulator just to realize it was some debug code I forgot to remove that was causing it to throw and die because afaik currentdirectory is / for android apps? gonna release this and then start working on remote adding from UI I think"}, {"post_id": 46099, "ts": "2026-08-13T02:11:59Z", "hours": 5.3278, "text": "UniScan source is now up, you can view it at https://github.com/UniScanProject/UniScan UniScan Client & Server v0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Server.Host%2F0.0.2 Added CI for UniScan.Server.Host UniScan.Client.Core Use DI for PacketRegistry Update RemoteFactory.Create to pass PacketRegistry instance from DI Breaking Changes Updated RemoteServer constructors to take an instance of PacketRegistry Removed InternalUniScanClientPacketConfigurator Packets are now registered from AssembliesPacketSource InternalUniScanClientModule no longer adds an IPacketConfigurator to DI as this class has been removed. UniScan.Network Breaking Changes Renamed ScannerInfoPacket -> ScannerRegistrationPacket The new ID for this packet is UniScan:packet/clientbound/device/registration This fixes a bug where there were two instances of the same packet ID used for different packets in the codebase Removed BuiltinPacketRegistrar Removed IPacketConfigurator Moved PacketRegistry and RegistryPacketAttribute to UniScan.Network.Registry Created IPacketSource and AssembliesPacketSource AssembliesPacketSource collects all classes that inherit IPacket and have the RegistryPacket attribute. Removed the singleton Instance property from PacketRegistry Created PacketRegistry.RegisterFromSource and PacketRegistry.RegisterFromSource<TPacketSource> PacketRegistry.RegisterFromSource takes a given IPacketSource and registers all the packets it provides. PacketRegistry.RegisterFromSource<TPacketSource> creates a new instance of the given TPacketSource type and passes it to PacketRegistry.RegisterFromSource UniScan.Server.Core SubscribePacketHandler now sends the newly renamed ScannerRegistrationPacket Breaking Changes Removed PacketRegistry.RegisterFromSource InternalUniScanServerModule no longer adds an IPacketConfigurator to DI as this class has been removed. Packets are now registered from AssembliesPacketSource UniScan.Server.Host Now creates its own PacketRegistry and passes it to the UniScanServer constructor. UniScan.Tests Now creates its own PacketRegistry and passes it to the ClientSocket constructor."}, {"post_id": 44449, "ts": "2026-08-10T06:23:32Z", "hours": 11.9661, "text": "Been working on cleaning up the codebase in preparation for the initial commit. (thanks @CT5 for some of the motivation) https://github.com/UniScanProject/UniScan will be the project’s home. This does NOT mean it is ready to use, it is far from so. However, it means I will be able to publish releases and such, and everyone will be able to read the code. I will also be working on a Module alongside the core project, which acts as a virtual scanner, for testing of course. My next steps will be getting the virtual scanner module good enough to use as testing, then figure out what to do about the UI, as I don’t really want to force modules onto users. My idea here is that we send a UI ‘definition’(?) to the client for it to render, and let modules hook into them. Means we can also have each button call to the server when pressed if it’s meant to perform a server-side action. I am also planning a scope increase to include SDRs and two-way radios in the distant future. Would like y’alls opinions."}, {"post_id": 28082, "ts": "2026-07-14T03:34:16Z", "hours": 15.6422, "text": "Doing better at Avalonia so I was able to fix some issues and make the Home screen actually contain something useful, with this being a list of all connected remotes and their devices in one place. Oh, and a ton of netcode setup which I forgot to post in this devlog, will show it in the next one."}, {"post_id": 18787, "ts": "2026-06-30T00:07:21Z", "hours": 34.5525, "text": "so far so good! I might want to make the Identifier text slightly smaller….. Now onto making “subscriptions” work, couldn’t come up with a better name than this though. It takes me so long to do anything because I constantly have the urge to refactor things, as well as trying to get stuff perfect the first time."}, {"post_id": 7411, "ts": "2026-06-12T10:42:10Z", "hours": 11.1469, "text": "FINALLY HOLY SHIT WHY IS IT SUCH PAIN TO DO ASYNC INIT IN AVALONIA I wouldnt need to do this if the browser wasnt so picky with OPFS and async………. UGH basically now during OnFrameworkInitializationCompleted I just run task in background that calls my async function at end of async function it sets Content of root view to newly created MainViewModel"}, {"post_id": 6029, "ts": "2026-06-10T03:40:35Z", "hours": 2.2417, "text": "Finally getting remotes closer to working Now you can add them from the GUI (but you can’t connect to them yet…)"}, {"post_id": 5432, "ts": "2026-06-09T06:21:20Z", "hours": 0.9203, "text": "didn’t notice at the time but I was writing out the length with the wrong endianness fixed it and now dotnetty doesn’t silently ignore it"}, {"post_id": 5404, "ts": "2026-06-09T04:53:56Z", "hours": 10.0017, "text": "testing the socket, seems like packets aren’t being handled just yet but at least we’re getting somewhere"}]...
|
Title: UniScan by @dexrn | Stardance
Devlogs:
tes Title: UniScan by @dexrn | Stardance
Devlogs:
testing the socket, seems like packets aren’t being handled just yet but at least we’re getting somewhere
didn’t notice at the time but I was writing out the length with the wrong endianness fixed it and now dotnetty doesn’t silently ignore it
Finally getting remotes closer to working Now you can add them from the GUI (but you can’t connect to them yet…)
FINALLY HOLY SHIT WHY IS IT SUCH PAIN TO DO ASYNC INIT IN AVALONIA I wouldnt need to do this if the browser wasnt so picky with OPFS and async………. UGH basically now during OnFrameworkInitializationCompleted I just run task in background that calls my async function at end of async function it sets Content of root view to newly created MainViewModel
so far so good! I might want to make the Identifier text slightly smaller….. Now onto making “subscriptions” work, couldn’t come up with a better name than this though. It takes me so long to do anything because I constantly have the urge to refactor things, as well as trying to get stuff perfect the first time.
Doing better at Avalonia so I was able to fix some issues and make the Home screen actually contain something useful, with this being a list of all connected remotes and their devices in one place. Oh, and a ton of netcode setup which I forgot to post in this devlog, will show it in the next one.
Been working on cleaning up the codebase in preparation for the initial commit. (thanks @CT5 for some of the motivation) https://github.com/UniScanProject/UniScan will be the project’s home. This does NOT mean it is ready to use, it is far from so. However, it means I will be able to publish releases and such, and everyone will be able to read the code. I will also be working on a Module alongside the core project, which acts as a virtual scanner, for testing of course. My next steps will be getting the virtual scanner module good enough to use as testing, then figure out what to do about the UI, as I don’t really want to force modules onto users. My idea here is that we send a UI ‘definition’(?) to the client for it to render, and let modules hook into them. Means we can also have each button call to the server when pressed if it’s meant to perform a server-side action. I am also planning a scope increase to include SDRs and two-way radios in the distant future. Would like y’alls opinions.
UniScan source is now up, you can view it at https://github.com/UniScanProject/UniScan UniScan Client & Server v0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Server.Host%2F0.0.2 Added CI for UniScan.Server.Host UniScan.Client.Core Use DI for PacketRegistry Update RemoteFactory.Create to pass PacketRegistry instance from DI Breaking Changes Updated RemoteServer constructors to take an instance of PacketRegistry Removed InternalUniScanClientPacketConfigurator Packets are now registered from AssembliesPacketSource InternalUniScanClientModule no longer adds an IPacketConfigurator to DI as this class has been removed. UniScan.Network Breaking Changes Renamed ScannerInfoPacket -> ScannerRegistrationPacket The new ID for this packet is UniScan:packet/clientbound/device/registration This fixes a bug where there were two instances of the same packet ID used for different packets in the codebase Removed BuiltinPacketRegistrar Removed IPacketConfigurator Moved PacketRegistry and RegistryPacketAttribute to UniScan.Network.Registry Created IPacketSource and AssembliesPacketSource AssembliesPacketSource collects all classes that inherit IPacket and have the RegistryPacket attribute. Removed the singleton Instance property from PacketRegistry Created PacketRegistry.RegisterFromSource and PacketRegistry.RegisterFromSource<TPacketSource> PacketRegistry.RegisterFromSource takes a given IPacketSource and registers all the packets it provides. PacketRegistry.RegisterFromSource<TPacketSource> creates a new instance of the given TPacketSource type and passes it to PacketRegistry.RegisterFromSource UniScan.Server.Core SubscribePacketHandler now sends the newly renamed ScannerRegistrationPacket Breaking Changes Removed PacketRegistry.RegisterFromSource InternalUniScanServerModule no longer adds an IPacketConfigurator to DI as this class has been removed. Packets are now registered from AssembliesPacketSource UniScan.Server.Host Now creates its own PacketRegistry and passes it to the UniScanServer constructor. UniScan.Tests Now creates its own PacketRegistry and passes it to the ClientSocket constructor.
spun up entire android emulator just to realize it was some debug code I forgot to remove that was causing it to throw and die because afaik currentdirectory is / for android apps? gonna release this and then start working on remote adding from UI I think
Working on a virtual scanner module to help development by simulating a scanner, hope to have it ready by tomorrow. This also means any future contributors will be able to start contributing even if they do not own a scanner!
Not fully happy with the manner in which this works, but the virtual scanner does work! Will publish some if not all of it tonight, but no version tag for this yet until I fix my refactoring.
Didn’t get to release last night, as a new bug popped up. 11>MessagePack.GeneratedMessagePackResolver.g.cs(74,74): Error CS0426 : The type name 'Shiki' does not exist in the type 'GeneratedMessagePackResolver'11>------- Finished building project: UniScan.Network. Succeeded: False. Errors: 1. Was able to fix it with some property in the AssemblyInfo. (see: github.com/MessagePack-CSharp/MessagePack-CSharp/issues/2133) I changed the Identifier to be a Slug instead for the devices. Working on browser stuff real quick and will commit sometime soon.
Waiting on a bug to be fixed in SpawnJS.WebWorkers and then hopefully next update will include web support + a website for y’all to test the client!!! Couldn’t do much today since I was so busy, however since I’m home now I can work on UniScan at a better time than 12 in the morning.
Using this time to test out M3 web (even though it’s in maintenance mode) This is just for the loading screen while it downloads all the WASMs. The cell tower is temporary until I can either make my own logo or find someone who will make one for me.
I think this looks pretty good for a little loading screen. I’ll probably add a try/catch if possible and show an error dialog when some fatal exception is thrown… The “Loading…” text is temporary and is done in Avalonia, will make a proper loading screen there sometime later.
OK I GOT IT SOMEWHAT WORKING IN BROWSER FINALLY still need to keep implementing OPFS stuff though. serilog 01:32:29 [ERR | UniScan.Client.Core.Config.Remote.RemotesListFile] Failed to save remotes to remotes.json System.Exception: Entry not found at SpawnDev.SpawnJS.SpawnJSRuntime.<_InteropCallApplyAsync>d__132`1[[SpawnDev.SpawnJS.JSObjects.FileSystemSyncAccessHandle, SpawnDev.SpawnJS, Version=2.1.8.0, Culture=neutral, PublicKeyToken=null]].MoveNext()
FINALLY I GOT OPFS WORKING GG
UniScan now works in browser! I’ve also added a nice crash handler since unhandled exceptions act weird in the browser. Just polishing up now, will commit and set up Actions to host this. Once it’s up, the link will be https://uniscan.dexrn.me (The crash shown in the video is a real issue and will be fixed later.)
Alright I’ve committed and now you can access UniScan through https://uniscan.dexrn.me Note that since this is still an early version, you can’t really do much. You can also install it as a PWA on iOS, Android, and most desktop browsers. (pictured is UniScan as a PWA in ungoogled-chromium) Hopefully tomorrow I will fix the crash with adding remotes by making some sort of map of connection type -> UI widget to define the settings for them. (meant to post this yesterday, but GH was still working on some cert garbage)
Much nicer loading screen
FINALLY I GOT IT DONE IM SO TIRED New loading screen!!!! And OPFS file handles are now keyed by int im going to sleep now https://uniscan.dexrn.me
working on fixing the fact that you can’t really make remotes
Just released a new version, now you can make remotes from the UI finally. Here’s a video showing the creation flow. Note that the list is dynamic based on classes implementing IConnectionMethodFactoryViewModel with attribute ConnectionMethodFactoryViewModelAttribute
Working on dropping display names from client remotes As well as some refactor of the connection flow using my new TaskPipeline Once this is done, the server will be able to send branding, announcements, and other useful information on connect for the client to display!
Remotes are now stored per file instead of all inside one file. Additionally, server info is now properly cached! I had to rewrite most of the remote initialization flow, but now it’s much better. Adding and removing remotes automatically saves to disk because I can observe the list. This isn’t the end of this overhaul, but we’re getting closer… I think I want to refactor more of UniScanClient next. This is happening on another branch: https://github.com/UniScanProject/UniScan/tree/feat/use_server_provided_display_names After this branch is merged into main, I will make the available server info also show since we have the entire RemoteInfo being sent, which includes announcements, a description, a logo, etc.
Need opinions on this UI The server logo now shows where possible, so on the home view and in the sidebar In the remote view, there is a top ‘window’(?) that holds (from top to bottom): logo (to the side: title, description), server links and then the bottom floating window thing holds the server MOTD I still need to find a place to hold the server announcements… Alongside this were a ton of internal refactors, and the subscribe button now works (but the server still won’t properly send the current state) Been trying to post this since yesterday (I re-recorded the video today), but Hackatime has been down.
Here’s the announcements UI, I think I’m almost done on this branch and then I’ll continue on main.
I think this looks pretty nice apparently Avalonia has some nuget package that adds ItemsRepeater which does what I was originally trying to do in a cleaner way
UniScan Client v0.1.0, UniScan Server (Host) v0.1.1 Lots of changes, most of them are backend changes, but there are also a handful of frontend changes too! https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.1.0 Remotes are now stored per file instead of one large file, and the UI has been neatened up. The server now sends metadata containing a logo, various information, an MOTD, links, etc. The UI has been updated to display this information too. There are more changes than this, but there are too many to list here without hitting the 4000 char limit. Attached is a small video showing some of the new UI stuffs. By no means is it bug free, but the PR reached a point where it could be merged to allow for other important tasks to be focused on (like y’know, showing the actual scanner info)
Started working on state sync, will continue tomorrow probably States are synced now but I need to think about how to deal with scanner groups and channels and such because there are different types of channels (such as P25, conventional, etc) among other type issues and I want to reduce the need for any modules on the client if I can.
A friend of mine was able to test it on iOS, we got it working. Gonna have them send in the PR later and set up CI for it.
I FINALLY GOT SSR WORKING MY GOD still too primitive to do anything atm, working on it.
The client can now disconnect itself, and more styling has been added to the SSR UI (shown here is a Container which is centered and has a slight margin) tomorrow will be some more work on the SSR UI and then finally getting the scanner state to show on the client. I’m not too pleased with the idea that the server may change the look of the device pages on the clients, though… I still feel like there could be some better way to go about this.
While I didn’t get to scanner state displaying yet, I did refactor the classes that handle how remotes connect, disconnect, etc so that it’s not spread around the codebase. This fixes a few bugs related to state management due to how originally these viewmodels were constructed separately of eachother. Tomorrow I will be gone for a few hrs but should be back soon enough to hopefully make some more refactors and/or start on the remote display. Pictured is the new disconnect button in the remote on the sidebar
Sorry, haven’t been super active due to life. Fixed a few bugs in the meantime and implemented most of the SSR binding stuff, but it’s far from finished, hell I haven’t even gotten to test it yet. Will be gone for a bit tomorrow, and the next day I will be at a different house for a few days albeit with my computer.
Went on a small side-tangent. Icons! (dw still working on the SSR device stuff)
IT FINALLY WORKS The UI shit I built on the server now syncs to the client correctly, and the flow isn’t actually too bad! Although this will be improved by also having a registry…registry…(yeah I know it’s weird) on the client so that UI elements can have values bind to them, and all the server has to do is send the client data to those registries
And now we can finally start seeing the fruits of our labor
Okayyy so I was able to actually completely gut DeviceState and now it’s actually just a class which is also used to serialize individual states. This also means I can nuke reflection from the serialization process since I can just make IDeviceState forced to inherit IStateSerializer which will be much more dynamic!!! This means literally any states can be sent to the client and as long as the server or the module has the UI to render the states, it will work. This also allows states to be diffed and only the changed parts to be sent Second screenshot shows the UI sent by the server, note that the Volume: 0 is actually all being handled on the client via binding strings (where the server only sends the client the device states and the binding strings will look up those states itself)
Here’s a showcase of my Uniden SDS100 scanning, with UniScan showing the details in real time! I programmed in some garbage test channels so you won’t see any channels talking in this video. Everything shown here is sent by the server and updated by the server… Still somewhat far from complete as I have to figure out more stuff (mainly more stuff for the client to deal with, like hiding state display textblock on null bindings and more UI features/styling).
For funzies, here’s the dev build running inside a rooted Oculus Quest 2 (thanks to my friend for testing this) This is also a good test of the netcode over a long distance (they’re in Malaysia while I’m in the US) Getting close to committing this all alongside Shiki and such… Long cleanup process.
getting yelled at by starpheus because I haven’t made devlog yet spent all nighter last night refactoring shiki’s modulemanagement project and then today I refactored lots of shiki’s taskpipeline project, as well as some work being done on Shiki’s Result and family (shiki is the side project library with most of it’s code originating from UniScan, and UniScan heavily depends on it) Now the browser initialization is much cleaner (but not perfect of course) (first screenshot is new, second is old) Removed HostEnvironment because we usually only grab the parts from DI anyway
Have been working on more Shiki refactors and a nice language system for servers in UniScan to provide language strings without being able to overwrite client language strings Reworked most of the TaskPipelineBuilder with many more accepting delegate types and have done some cleanup since Tomorrow I will finish up releasing the next Shiki version and then I think I will be able to release the next UniScan commit and then keep working for an alpha release.
Finally committed the latest Shiki changes, will release UniScan’s next commit tomorrow.
New logo! (credits at end) I intend to make the logo customizable by allowing you to change the color of various elements, and choose between different logos (since no other software ive seen does this) Maybe even change the color of the scanner display when someone is talking even… Thanks to Unomelon for the base, which I used to draw the scanner. Check out Unomelon here: https://bsky.app/profile/unomelon.bsky.social , and his very cool game Allumeria here: https://allumeria.com/ (wasnt asked to add this but I think the game is really cool and am somewhat active in the community)
Working on settings…! After this there will be configuration on the serverside and then after that, audio streaming!
Coming in the next full update will also be UI modes This is so that the UI is optimized for every device and their input methods This is the Mobile one, and the main page will (when its finished) have all remotes including non-connected ones and a button to add more remotes and such....
|
1792785158.047574
|
1793389958.047574
|
|
21799
|
Kursal by @Kubik | Stardance
|
Kubik
|
1
|
241.28
|
4494
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T19:31:18Z", "hours": 225.0, "multiplier": 17.91, "payout": 4494, "blessing": "neutral", "text": "I built Kursal! A peer-to-peer, decentralized (means no central server!) and end-to-end encrypted messenger. It’s all coded in Rust for the backend and Svelte for the interface. There’s also a website for it showing a bit everything, it’s cool Basically when you open your client, it connects to other clients and creates a “mesh” of clients, communicating through each other. I think a good comparison is a mix of Bitcoin and Tor? Anyway it took me super long to code, and I hope you enjoy!", "repo": "https://github.com/KursalChat/Kursal", "demo": "https://kursal.chat/download"}]...
|
[{"post_id": 79997, "ts": "202 [{"post_id": 79997, "ts": "2026-10-15T20:32:51Z", "hours": 9.2917, "text": "Shipped and received ratings, thank you guys! We reached 25 stars on GitHub Changes: various bug fixes… lol (and dependency bumps) iOS build! and signed mac build! meaning you can know open the app on mac without it saying “broken”! (this was a signing issue yes, the app is not actually broken…) got Kursal working for ARCH !! finally, arch users can now open the app :) Still trying to get published on the app store and google play…. damn I did not think it would take that long"}, {"post_id": 73960, "ts": "2026-09-26T12:21:34Z", "hours": 6.9917, "text": "that gotta be the last devlog 😅 Basically i just “routine maintenance” the repo ¯ \\ (ツ) /¯ spent time TRYING getting it on the app store or play store… it’s pain 😭 but i’ll get it eventually!"}, {"post_id": 64991, "ts": "2026-09-09T19:21:46Z", "hours": 6.4067, "text": "Hi! I’m done! (i hope lol) i’m still in the process of publishing to the app store and play store… but heh it takes so long i’ll ship before i’m approved there lol Changes: Few possible vulnerability fixes: only allow LAN devices to reach LAN-specific endpoints Show security codes when added locally Strip more image metadata (like GPS infos) on more formats"}, {"post_id": 59064, "ts": "2026-08-31T17:38:46Z", "hours": 12.395, "text": "for real last devlog lol, mostly “ci” changes, nothing much Changes: improved code blocks! it has colors :) (thanks highlight.js) thanks Tiazzz for translating into Dutch! android + IOS building code updater on mobile opens the mobile store (instead of breaking) I spent a LOT of time on the Google and Apple publishing websites….. it takes time to get an app published…. :/"}, {"post_id": 54519, "ts": "2026-08-25T15:29:28Z", "hours": 11.0444, "text": "okay i think that’s the last devlog before I ship! sorry for that long time devlog but i was in holidays lol Changes: Use autonat on clients to determine if they can act as public relays Complete rework of the onboarding screens Better QR codes :D Bug Fixes: Fixed some potential security issues in the frontend (injections) Rewrite a part of the front-end to group util functions and avoid redundant code AND!! i’m almost done with the camera rewrite! i’m in the process of migrating that to the rust backend but this means native “per-device” code. Almost done! here are the onboarding screens one by one, i cant add more than 4 attachments so you’ll have to try urself to see ;)"}, {"post_id": 51026, "ts": "2026-08-20T14:49:41Z", "hours": 10.2336, "text": "hi! another devlog! i just turned 18 Changes: switched the formatter from prettier to oxfmt (it’s faster!) changed the icon got approved on OpenCollective ! Bug Fixes: avatar transfers now always work even when the other is offline removed some useless code… lol (like migration code) spent lot of time trying to migrate camera to backend but that’s still in the works… soon™"}, {"post_id": 48329, "ts": "2026-08-16T17:17:49Z", "hours": 9.6311, "text": "wow time actually flies! gotta devlog again XD i made cool assets for the app store release Features: you can now delete log files from the app unlimited file transfers (file transfers already existed, but now no size limit!) Bug Fixes stop spamming connections to peers… lol big language loading improvements! now shows the percentage of translation too more avatar work to store it on disk and not in the DB you can now mirror your camera if you want :) defer android permission window thingy for those interested i used a figma template for the phones 3d + a plugin (that was so much pain but it looks great lol)"}, {"post_id": 47315, "ts": "2026-08-15T05:58:52Z", "hours": 10.5314, "text": "more changess!!! and lots of fixes lol oh also i have setup https://status.kursal.chat (but not tracked that time) Performance: improved performance for the database (parallel reading) improved performance (storage & ram) for emojis perf: store avatars in files instead of serialized in the Contact {} struct more performance changes (camera loading, command palette) Bug Fixes: tried keeping less active connections to not blow up the client lol fixed a svelte #each issue… lol"}, {"post_id": 45057, "ts": "2026-08-11T10:00:47Z", "hours": 10.0292, "text": "okay I got some more work in! I’m getting really close to shipping, i’d like to get a demo and a proper app icon first tho Changes better QR code scanning screen! and it works on iOS :D the bluetooth module got improvements! no unwrap left (= cannot panic now) + better transfer speed! compressed all image assets to webp (gained like at least few MB) translated again everything in french lol migrated some localStorage data (file-path association) to the encrypted database"}, {"post_id": 43310, "ts": "2026-08-08T14:38:07Z", "hours": 10.1664, "text": "Lots of work! but no release yet, i’m almost done for beta.6!! :D a major thing i worked on is Github actions release. Now, when I create the draft release, GH actions will build for every platform in parallel and release! Features Contact page complete rework (easier to understand :p), with autocorrect etc Call ringtone (probably temporary, but it’s shipped!) Bug Fixes Smaller offline messages checks Addresses display, general UI improvements Prefer local connections & improved file transfers MacOS .kursal file association"}, {"post_id": 41634, "ts": "2026-08-05T23:40:37Z", "hours": 10.2592, "text": "Released beta.4 and beta.5 with lots of improvements and fixes! I spent uh… some time on trying to make a ring tone (like an hour maybe?) but i cant upload it here :/ but whatever it’s not that good anyway lol Features Updater progress bar (spinner go spinnyyy) Major long-term code improvements: you can now select the number of uses and the time it expires Bug Fixes critical first-contact deadlock fix… (oopsy) Pinned & unread messages improvements More accurate user status and that’s basically it I guess!"}, {"post_id": 40748, "ts": "2026-08-04T14:08:58Z", "hours": 10.1056, "text": "Released beta.3 and currently reworking long-term codes for beta.4! not done yet, but it’s WIP :) Features app now embeds the latest ToS update date, so when you update and last agreed to a previous version it shows a pop up so you can agree again Bug Fixes lots of CI fixes… like really a lot 😅 re-enabled mDNS, kinda forgot to put it back… app displays edge-to-edge on mobile, no weird offset! (normally) grammar fixes in english and french… yeeah!"}, {"post_id": 38297, "ts": "2026-07-31T16:46:21Z", "hours": 9.8047, "text": "Released a beta.2 fixing lots of things and almost done with a beta.3 I think… :D What changed? first, i spent like 4 hours translating everything into french LOL Features Mobile native file sharing (this one is crazy!) Large messages send as file (10k+) In-app log view File caption (sends as msg) Bug Fixes Otp consumption Offline messages edits Contact onboarding mobile self-lock (yeah u couldnt do the onboarding on phone in beta.1 😅) File upload location & UI Less in-app notifications that’s it for this devlog! we’ll see if I ship now or wait a bit more? i really want something to work super well :p"}, {"post_id": 37588, "ts": "2026-07-30T12:50:51Z", "hours": 10.1344, "text": "Okayy! i started publishing clean commits now and working with my github structure. Basically: I code on branches, like feature/some-feature . once it’s done, I squash it to dev. And when I want to release, I just make a branch release/0.1.0 (with the actual version) and change few things there! What changed? DOCKER WORKING! you can now host your relays using it Kursal JS is out too, you can now use the app API! Large messages send as file (10k+) In-app log view File caption (sends as msg) fixes: App focus notifications Contact onboarding mobile self-lock File upload location & UI Less in-app notifications File downloads What next I’m currently working on adding the native “share with” for Kursal to share images and files directly from your OS."}, {"post_id": 36273, "ts": "2026-07-28T08:26:38Z", "hours": 11.1028, "text": "Alright i got the new repo up! What changed? lots of bug fixes (IT OPENS ON ANDROID!) ci improvements got mail sending working from the domain spent lot of time setting the new repo up released the first beta + website update What next? testing… and getting to a stable release :)"}, {"post_id": 34027, "ts": "2026-07-24T13:26:17Z", "hours": 9.9975, "text": "hi! probably last few devlogs before a release?! What changed? more website improvements! added legal pages (boring stuff lol) fixed so many bugs offline messages work now!! and calls too tray icon & background process :) LOTS OF TESTING. and lots of improvements too What next? finish testing and publishing to the repo!"}, {"post_id": 32311, "ts": "2026-07-21T12:19:37Z", "hours": 10.9506, "text": "nothing much changed, again What changed? lots of internal code structure, some logic bugs & stuff Added docker support for hosting a relay! Improved the website and prepared for a beta release (not published yet, will do) More .md docs to explain everything! but more importantly (the only visual changes lol) terminal user interface for the relay! --tui new home for the app! (with stats)"}, {"post_id": 29439, "ts": "2026-07-16T11:58:15Z", "hours": 9.4086, "text": "again, nothing much to see… but lots of internal changes! What changed? complete rust refactor: made macros for frequently used things, organized the code better & stuff like that some quality of life features for the frontend like pasting an image in the chat directly more tutorials explaining kursal (offline messaging, file transfers) What next? i’m preparing everything for a soon-ish release! it’ll be a public beta version and yeah! hope it works"}, {"post_id": 27997, "ts": "2026-07-13T23:28:00Z", "hours": 10.3989, "text": "oops forgot to devlog again… and no new features this time What changed? as i said…. well nothing lots of bug fixes lots of code improvements (refactor stuff…) some UI/UX improvements but like nothing too crazy What next? honestly I cannot tell. I think i’m gonna start to plan the release and finally push to the public repo. gotta get everything ready, more bug fixes and proofread the code I guess! PS: sorry i really got no screenshots to show here so uh… here’s the intro animation when you first open the app!"}, {"post_id": 23055, "ts": "2026-07-05T19:50:56Z", "hours": 9.2908, "text": "I tried getting a feature out…. but nope, only fixed bugs What changed? Added AEC (active echo cancellation) on some platforms: i have to compile FROM these platforms, like cross-compilation straight up does not work… sorry windows Fixed file transfers and improved it’s UI Fixed offline messaging… i hope i had to figure out how to compile audio libs to other platforms… that took me a while…….. thanks opus What next? uhhh good question? more tests maybe? and UI improvements i was thinking about making a background process run, separate from the app that would get messages so you can close the app while that runs… will have to look into it"}, {"post_id": 21137, "ts": "2026-07-02T22:50:54Z", "hours": 4.73, "text": "hi! Started testing Kursal and found…. bugs! so i spent quite some time fixing them… What changed? Connections between peers were unstable: increased timeout + fixed a rate limiter bug Improved the UI with a new “connected nodes” section (see screenshot) Added an option to change the sample rate (defaults to 48 kHz, but you can lower to improve potential lag) and small UI improvements like moving the call bar to the bottom which fits better What next? test. test. test. my goal is to release the app in beta before august and get the first stable version out mid-august… we’ll see!"}, {"post_id": 18715, "ts": "2026-06-29T21:55:38Z", "hours": 11.0786, "text": "yooo 3rd devlog :) sorry i’m not posting very often, i’d like to devlog feature by feature but they really take time… What changed? Fixed vulnerabilities (post-quantum encryption in mailbox system & useless signature removal) Managing nodes in the settings (like viewing and adding connections) A lot of UI improvements a bit everywhere! calls… work in progress! calls is the feature i’ve been working on for a while. I re-used the encryption mechanism of file transfers: make a temporary secret key and then use it. I got SOUND going!! What next? testing offline messaging (my friends were still offline) testing calls (a lot)! improving call UI"}, {"post_id": 16325, "ts": "2026-06-26T15:51:40Z", "hours": 11.6608, "text": "Hello Got a lot of improvements working! Mainly on the front-end but quite a lot on the backend too actually! What changed? Added a CMD+K / CTRL+K search menu (see screenshot): you can search for settings, contacts or even messages! Made the background of the DMG installation on mac Searching messages!! and a few skeletons for when stuff is loading backend fixes… lots of em… like fixed adding a contact What next? still test offline messaging, still didn’t do that somehow"}, {"post_id": 13211, "ts": "2026-06-21T17:18:01Z", "hours": 15.6786, "text": "Hii! First Kursal devlog! This is a project i’ve started during Flavortown but I wasn’t done yet! Sorry kinda didn’t see the time pass lol What changed? Website rebranding! –> https://kursal.chat Spent a lot of time setuping “side-projects” like an uptime manager, translation manager etc Reworked the workflow for building, checking & more Lots of UI/UX changes POSSIBLY working offline messaging… (will test lol) What next? I’m about to test offline messaging, the whole app too actually lol…… hope it all works 🙏"}]...
|
Title: Kursal by @Kubik | Stardance
Devlogs:
Hii! Title: Kursal by @Kubik | Stardance
Devlogs:
Hii! First Kursal devlog! This is a project i’ve started during Flavortown but I wasn’t done yet! Sorry kinda didn’t see the time pass lol What changed? Website rebranding! –> https://kursal.chat Spent a lot of time setuping “side-projects” like an uptime manager, translation manager etc Reworked the workflow for building, checking & more Lots of UI/UX changes POSSIBLY working offline messaging… (will test lol) What next? I’m about to test offline messaging, the whole app too actually lol…… hope it all works 🙏
Hello Got a lot of improvements working! Mainly on the front-end but quite a lot on the backend too actually! What changed? Added a CMD+K / CTRL+K search menu (see screenshot): you can search for settings, contacts or even messages! Made the background of the DMG installation on mac Searching messages!! and a few skeletons for when stuff is loading backend fixes… lots of em… like fixed adding a contact What next? still test offline messaging, still didn’t do that somehow
yooo 3rd devlog :) sorry i’m not posting very often, i’d like to devlog feature by feature but they really take time… What changed? Fixed vulnerabilities (post-quantum encryption in mailbox system & useless signature removal) Managing nodes in the settings (like viewing and adding connections) A lot of UI improvements a bit everywhere! calls… work in progress! calls is the feature i’ve been working on for a while. I re-used the encryption mechanism of file transfers: make a temporary secret key and then use it. I got SOUND going!! What next? testing offline messaging (my friends were still offline) testing calls (a lot)! improving call UI
hi! Started testing Kursal and found…. bugs! so i spent quite some time fixing them… What changed? Connections between peers were unstable: increased timeout + fixed a rate limiter bug Improved the UI with a new “connected nodes” section (see screenshot) Added an option to change the sample rate (defaults to 48 kHz, but you can lower to improve potential lag) and small UI improvements like moving the call bar to the bottom which fits better What next? test. test. test. my goal is to release the app in beta before august and get the first stable version out mid-august… we’ll see!
I tried getting a feature out…. but nope, only fixed bugs What changed? Added AEC (active echo cancellation) on some platforms: i have to compile FROM these platforms, like cross-compilation straight up does not work… sorry windows Fixed file transfers and improved it’s UI Fixed offline messaging… i hope i had to figure out how to compile audio libs to other platforms… that took me a while…….. thanks opus What next? uhhh good question? more tests maybe? and UI improvements i was thinking about making a background process run, separate from the app that would get messages so you can close the app while that runs… will have to look into it
oops forgot to devlog again… and no new features this time What changed? as i said…. well nothing lots of bug fixes lots of code improvements (refactor stuff…) some UI/UX improvements but like nothing too crazy What next? honestly I cannot tell. I think i’m gonna start to plan the release and finally push to the public repo. gotta get everything ready, more bug fixes and proofread the code I guess! PS: sorry i really got no screenshots to show here so uh… here’s the intro animation when you first open the app!
again, nothing much to see… but lots of internal changes! What changed? complete rust refactor: made macros for frequently used things, organized the code better & stuff like that some quality of life features for the frontend like pasting an image in the chat directly more tutorials explaining kursal (offline messaging, file transfers) What next? i’m preparing everything for a soon-ish release! it’ll be a public beta version and yeah! hope it works
nothing much changed, again What changed? lots of internal code structure, some logic bugs & stuff Added docker support for hosting a relay! Improved the website and prepared for a beta release (not published yet, will do) More .md docs to explain everything! but more importantly (the only visual changes lol) terminal user interface for the relay! --tui new home for the app! (with stats)
hi! probably last few devlogs before a release?! What changed? more website improvements! added legal pages (boring stuff lol) fixed so many bugs offline messages work now!! and calls too tray icon & background process :) LOTS OF TESTING. and lots of improvements too What next? finish testing and publishing to the repo!
Alright i got the new repo up! What changed? lots of bug fixes (IT OPENS ON ANDROID!) ci improvements got mail sending working from the domain spent lot of time setting the new repo up released the first beta + website update What next? testing… and getting to a stable release :)
Okayy! i started publishing clean commits now and working with my github structure. Basically: I code on branches, like feature/some-feature . once it’s done, I squash it to dev. And when I want to release, I just make a branch release/0.1.0 (with the actual version) and change few things there! What changed? DOCKER WORKING! you can now host your relays using it Kursal JS is out too, you can now use the app API! Large messages send as file (10k+) In-app log view File caption (sends as msg) fixes: App focus notifications Contact onboarding mobile self-lock File upload location & UI Less in-app notifications File downloads What next I’m currently working on adding the native “share with” for Kursal to share images and files directly from your OS.
Released a beta.2 fixing lots of things and almost done with a beta.3 I think… :D What changed? first, i spent like 4 hours translating everything into french LOL Features Mobile native file sharing (this one is crazy!) Large messages send as file (10k+) In-app log view File caption (sends as msg) Bug Fixes Otp consumption Offline messages edits Contact onboarding mobile self-lock (yeah u couldnt do the onboarding on phone in beta.1 😅) File upload location & UI Less in-app notifications that’s it for this devlog! we’ll see if I ship now or wait a bit more? i really want something to work super well :p
Released beta.3 and currently reworking long-term codes for beta.4! not done yet, but it’s WIP :) Features app now embeds the latest ToS update date, so when you update and last agreed to a previous version it shows a pop up so you can agree again Bug Fixes lots of CI fixes… like really a lot 😅 re-enabled mDNS, kinda forgot to put it back… app displays edge-to-edge on mobile, no weird offset! (normally) grammar fixes in english and french… yeeah!
Released beta.4 and beta.5 with lots of improvements and fixes! I spent uh… some time on trying to make a ring tone (like an hour maybe?) but i cant upload it here :/ but whatever it’s not that good anyway lol Features Updater progress bar (spinner go spinnyyy) Major long-term code improvements: you can now select the number of uses and the time it expires Bug Fixes critical first-contact deadlock fix… (oopsy) Pinned & unread messages improvements More accurate user status and that’s basically it I guess!
Lots of work! but no release yet, i’m almost done for beta.6!! :D a major thing i worked on is Github actions release. Now, when I create the draft release, GH actions will build for every platform in parallel and release! Features Contact page complete rework (easier to understand :p), with autocorrect etc Call ringtone (probably temporary, but it’s shipped!) Bug Fixes Smaller offline messages checks Addresses display, general UI improvements Prefer local connections & improved file transfers MacOS .kursal file association
okay I got some more work in! I’m getting really close to shipping, i’d like to get a demo and a proper app icon first tho Changes better QR code scanning screen! and it works on iOS :D the bluetooth module got improvements! no unwrap left (= cannot panic now) + better transfer speed! compressed all image assets to webp (gained like at least few MB) translated again everything in french lol migrated some localStorage data (file-path association) to the encrypted database
more changess!!! and lots of fixes lol oh also i have setup https://status.kursal.chat (but not tracked that time) Performance: improved performance for the database (parallel reading) improved performance (storage & ram) for emojis perf: store avatars in files instead of serialized in the Contact {} struct more performance changes (camera loading, command palette) Bug Fixes: tried keeping less active connections to not blow up the client lol fixed a svelte #each issue… lol
wow time actually flies! gotta devlog again XD i made cool assets for the app store release Features: you can now delete log files from the app unlimited file transfers (file transfers already existed, but now no size limit!) Bug Fixes stop spamming connections to peers… lol big language loading improvements! now shows the percentage of translation too more avatar work to store it on disk and not in the DB you can now mirror your camera if you want :) defer android permission window thingy for those interested i used a figma template for the phones 3d + a plugin (that was so much pain but it looks great lol)
hi! another devlog! i just turned 18 Changes: switched the formatter from prettier to oxfmt (it’s faster!) changed the icon got approved on OpenCollective ! Bug Fixes: avatar transfers now always work even when the other is offline removed some useless code… lol (like migration code) spent lot of time trying to migrate camera to backend but that’s still in the works… soon™
okay i think that’s the last devlog before I ship! sorry for that long time devlog but i was in holidays lol Changes: Use autonat on clients to determine if they can act as public relays Complete rework of the onboarding screens Better QR codes :D Bug Fixes: Fixed some potential security issues in the frontend (injections) Rewrite a part of the front-end to group util functions and avoid redundant code AND!! i’m almost done with the camera rewrite! i’m in the process of migrating that to the rust backend but this means native “per-device” code. Almost done! here are the onboarding screens one by one, i cant add more than 4 attachments so you’ll have to try urself to see ;)
for real last devlog lol, mostly “ci” changes, nothing much Changes: improved code blocks! it has colors :) (thanks highlight.js) thanks Tiazzz for translating into Dutch! android + IOS building code updater on mobile opens the mobile store (instead of breaking) I spent a LOT of time on the Google and Apple publishing websites….. it takes time to get an app published…. :/
Hi! I’m done! (i hope lol) i’m still in the process of publishing to the app store and play store… but heh it takes so long i’ll ship before i’m approved there lol Changes: Few possible vulnerability fixes: only allow LAN devices to reach LAN-specific endpoints Show security codes when added locally Strip more image metadata (like GPS infos) on more formats
that gotta be the last devlog 😅 Basically i just “routine maintenance” the repo ¯ \ (ツ) /¯ spent time TRYING getting it on the app store or play store… it’s pain 😭 but i’ll get it eventually!
Shipped and received ratings, thank you guys! We reached 25 stars on GitHub Changes: various bug fixes… lol (and dependency bumps) iOS build! and signed mac build! meaning you can know open the app on mac without it saying “broken”! (this was a signing issue yes, the app is not actually broken…) got Kursal working for ARCH !! finally, arch users can now open the app :) Still trying to get published on the app store and google play…. damn I did not think it would take that long
Ships:
I built Kursal! A peer-to-peer, decentralized (means no central server!) and end-to-end encrypted messenger. It’s all coded in Rust for the backend and Svelte for the interface. There’s also a website for it showing a bit everything, it’s cool Basically when you open your client, it connects to other clients and creates a “mesh” of clients, communicating through each other. I think a good comparison is a mix of Bitcoin and Tor? Anyway it took me super long to code, and I hope you enjoy!...
|
1792853529.229275
|
1792939929.229275
|
|
43178
|
GamEngine by @bartoszkasyna | Stardance
|
bartoszkasyna
|
1
|
244.34
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T15:49:21Z", "hours": 195.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made GPU driven game engine. It use vulkan 1.4. GTAO and VSM are still little bugged. Project will be still in development. This experimental version. More deatils are in devlogs. If engine or demo crashes on your device please send me generated logs and device specification", "repo": "https://github.com/B4rtekk1/GamEngine", "demo": "https://github.com/B4rtekk1/GamEngine/releases/tag/v0.1.0"}]...
|
[{"post_id": 79106, "ts": "202 [{"post_id": 79106, "ts": "2026-10-12T18:07:52Z", "hours": 10.8381, "text": "I was working on bug fixes and glass system. Glass is not working was I want but it havs some progress. Currently glass is highly unoptimized."}, {"post_id": 78281, "ts": "2026-10-10T08:29:57Z", "hours": 4.4117, "text": "I made custom installer for my engine. Now i willl work on optimatization"}, {"post_id": 74967, "ts": "2026-09-28T18:36:35Z", "hours": 9.7639, "text": "I mainly working on bug fixing. Now VSM and GTAO are fully stable, TAA still needs some love. I was also working on fbx model importer. On the image you can see Amazon Lumberyard Bistro which has 2.7M triangles with 140FPS. I have to work on fps stability while moving camera and make glass shader/object."}, {"post_id": 74396, "ts": "2026-09-27T09:59:55Z", "hours": 9.5208, "text": "I was trying to made my version of DDGI but it was unstable, so I made this disabled. Full DDGI would be impossible for my gpu so I used Brixelizer GI from FidelityFX SDK from AMD. It looks good and stable. Image is capyured on intel sponza which has 2.7M traingles - 13x more than original sponza so my engine scale well."}, {"post_id": 73521, "ts": "2026-09-25T09:34:28Z", "hours": 9.7292, "text": "I was working on Ray Traced Contact Shadows and DDGI. Ray traced shadows works well without droping fps that much. Currently my DDGI is bugged - its very dark. The image is taken with RTCS, DGGI disabled"}, {"post_id": 72555, "ts": "2026-09-23T06:37:29Z", "hours": 5.0792, "text": "Successfully optimized GTAO and VSM, 40FPS gain and more stable 1% low"}, {"post_id": 71260, "ts": "2026-09-20T15:17:19Z", "hours": 7.5197, "text": "I was working on game optimization, editor functionalities and standalone game building. I successfully optimized GTAO and VSM a little. GTAO still have some halo around some objects and VSM are not full stable. I added option build game in editor. I have to optimize editor a little and add some more functionalities. On the first image you can see nvidia nsight graphics profiler and on the second one standalone game build running in 160 after few seconds. This is decent score for rtx 3050."}, {"post_id": 70490, "ts": "2026-09-19T08:46:32Z", "hours": 7.4986, "text": "I was trying to fix shadows but it didint go well, so I gave up and started refactoring code for better readibiliy. On the image you can see broken verin of shadows, dont worry I went back to working ones. I fixed few smaller nearly invisible shadows bugs, so I didint waste myy time. Now I will focus on optimatization and graphics effet"}, {"post_id": 69704, "ts": "2026-09-17T16:43:10Z", "hours": 8.0603, "text": "I started migration to dynamic rendering, so rendering pipeline would be much easier for user. I also made custom title bar. Im in process of improving UI. I found two bugs - in certains camera angle shadows/AO or something doesnt work correctly. Second - some random patterns may occur while looking into sky inside sponza"}, {"post_id": 69075, "ts": "2026-09-16T10:23:21Z", "hours": 5.7283, "text": "I made water system but it look horrible and performance isnt great, so i focused next on large models importing. Big models are now devided into meshlets. On the image you can see very popular benchmark scene, its called crytek sponza. I think that 170FPS in this stage is good"}, {"post_id": 68570, "ts": "2026-09-15T10:28:57Z", "hours": 8.1017, "text": "I am working on water system. I decided to make something diffrent that normal water commonly used in every modern engine. I want to make virtual water system which is inspired by VSM. More technical details I will provide in devlog when I finish my water system. I dont have any working water image so I just upload some engine footage. PS. It might be much more optimize than normal water."}, {"post_id": 67943, "ts": "2026-09-14T08:27:35Z", "hours": 6.5411, "text": "I was working on water system and improving GTAO. While testing I found weird little horizontal strips on shadows. I thought it was my WSM bug so I was trying to fix it. After I checked all possible bugs i realized that I could downgrade GTAO by linear interpolation. I fixed it and now works fine. Water currently has implemented SSR and simple Gernster waves. On the images you can see clip levels and virutal pages shown in shadow debug mode"}, {"post_id": 67159, "ts": "2026-09-13T07:20:53Z", "hours": 7.1444, "text": "I was working on editor optimatization and bug fixes. Editor launch time jumped from ~7seconds to 1.5 seconds if editor has cache, otherwise 4.3 seconds. Launching editor no more cause vulkan errors. I also added IBL and reflects. I also bugged shadows a little."}, {"post_id": 66406, "ts": "2026-09-12T06:58:22Z", "hours": 6.8744, "text": "I was working on finishing render graph. I also optimized editor - in huge scenes it will have more stable 60FPS. I optimized game mode - 1% low are higher now"}, {"post_id": 65853, "ts": "2026-09-11T08:49:16Z", "hours": 8.0272, "text": "I was mainly working on models and textures compression. Textures are now compressed into BC7 format. I also added remdergraph so user dont have to make it manually."}, {"post_id": 65239, "ts": "2026-09-10T07:13:42Z", "hours": 7.9544, "text": "Today I was working on game optimatization and little shadows improvements. I was mainly working on game profiler as you can see in the image"}, {"post_id": 64328, "ts": "2026-09-08T16:49:40Z", "hours": 9.6778, "text": "Last 2 days I was working on editor functionalities. I added built-in powersheell terminal. I also added shadergraph which currently is doesnt want to compile properly"}, {"post_id": 63480, "ts": "2026-09-07T11:14:38Z", "hours": 6.3356, "text": "I was working on UX in editor. Then I found bug which I couldnt fix for 3 hours. Bug was caused my matrix decompose floating point"}, {"post_id": 62420, "ts": "2026-09-05T19:23:52Z", "hours": 5.1811, "text": "Today I was working on optimatization, code quality and better model imports. fps jumped from ~400 to ~430."}, {"post_id": 61744, "ts": "2026-09-04T20:02:01Z", "hours": 8.3261, "text": "I was working on game optimzatization. I made jump from around 200FPS to 400. There is still a lot more things to optimize."}, {"post_id": 59136, "ts": "2026-08-31T19:21:14Z", "hours": 5.6275, "text": "I was working on optimizing grass system. I added wind component and optimized colission with other objects. Thanks to optimatization FPS jumped from ~250 to ~320. I also modified scene saving system - binary file as main file and .terrains failes as terrain data. I added Editor layout to AppData so editor rembeber your last layout"}, {"post_id": 58356, "ts": "2026-08-30T19:03:02Z", "hours": 6.1303, "text": "Today i was adding missing tests. I also updated terrain sculping system - you can now sculp all terrain at once if multiple instances. I added some utils and deleted fps limit in play mode."}, {"post_id": 57564, "ts": "2026-08-29T19:02:32Z", "hours": 4.8972, "text": "Today I was working on better shadow implemenatation. I implemented VSM shadows - smiliar are used in UE5. I think its looks good"}, {"post_id": 56852, "ts": "2026-08-28T20:10:13Z", "hours": 5.6839, "text": "Today I was working on code quality and better terrain sculping tools. I added grass painting. I also added some nice shader to grass - A rolling ball leaves a trail in the grass. Check it out!"}, {"post_id": 56432, "ts": "2026-08-28T06:18:19Z", "hours": 5.745, "text": "I was working on terrain sculping. I was inspired by unity system generator so I wanted to make something smiliar. Now there is only one brush but i will extend possibilities of my system."}, {"post_id": 55427, "ts": "2026-08-27T07:58:03Z", "hours": 4.6125, "text": "Added gltf models importing with editor asset manager. Imported gameobject has his unique mesh collider."}, {"post_id": 54988, "ts": "2026-08-26T12:44:55Z", "hours": 2.9125, "text": "I was fixing my physics system. I fixed some bugs and created new ones. First new bug is sphere bouning up on first contact. 2 bug is cube lifting up another cube. I’m happy that I removed object shaking"}, {"post_id": 54700, "ts": "2026-08-25T19:29:26Z", "hours": 6.6933, "text": "Today I was mainly working on code quality and project refactorization. When I was testing scenes with various of configuration I found some type of physics bug - Objects are shaking for some reason, you can see this in attached video"}, {"post_id": 53759, "ts": "2026-08-24T13:13:25Z", "hours": 1.2175, "text": "last 1.25h I was adding cube physics, imo it look very satisfying."}, {"post_id": 53644, "ts": "2026-08-24T09:33:54Z", "hours": 4.9856, "text": "I was working on realistic sphere physics. I think it looks good enough. I was also working on tests. Fixed bug when ramp after start/stop was changing her location."}, {"post_id": 52942, "ts": "2026-08-23T09:58:18Z", "hours": 3.4753, "text": "I added simple gravity and colliders. I also reorganized code a little - I make high level API so user dont have to use Vulkan and SDL directly."}, {"post_id": 52275, "ts": "2026-08-22T11:51:51Z", "hours": 3.0019, "text": "Added Color picker, and updated window reloading while adding MSAA or new color. Now you can easily change color in editor"}, {"post_id": 51666, "ts": "2026-08-21T13:55:21Z", "hours": 2.4742, "text": "I made object scriptable!"}, {"post_id": 50944, "ts": "2026-08-20T12:37:57Z", "hours": 4.6658, "text": "I messed something up and m editor wasnt responding I couldt click anything. I was trying to fix it almost 5 hours. What I fixed? - vulkan and SDL were recreating while turning MSAA on and GPU was loosing context"}, {"post_id": 49752, "ts": "2026-08-18T17:53:31Z", "hours": 3.2764, "text": "Editor Update The editor has been significantly improved and now looks much better. Cross-Platform Support The editor no longer depends on the Windows API, which means it should work on both Windows and Linux . Technology Stack The original goal was to use only: C++ Vulkan SDK SDL3 GLM These are all standard components that come with a typical Vulkan development setup. After further research, Dear ImGui was also added. It is currently the only third-party dependency . Performance Both the Scene View and Game View are capped at 60 FPS . The Scene View captures the 90th frame of the particle effect so that it remains static. Next Steps Focus will now shift to expanding the editor’s functionality."}, {"post_id": 49441, "ts": "2026-08-18T09:01:45Z", "hours": 1.725, "text": "I made basic editor. Now looks like terrible but I will make it better"}, {"post_id": 49021, "ts": "2026-08-17T16:44:03Z", "hours": 1.5692, "text": "Added movement, you can move by using wasd, scroll and RMB"}, {"post_id": 48153, "ts": "2026-08-16T13:31:10Z", "hours": 4.0589, "text": "Particle System I was trying to add .glb models importer but this is very hard to do without third parties dependencies and i messed up something - Tree looks flat(second attachment). After many failed attempts I decided to start making particle system, as you can see it looks good. It is also optimized. FPS drop which you can see on video is caused by cmake compilation in background. I hope you like my particles :) All of this is made in C++ and the Vulkan SDK."}, {"post_id": 47579, "ts": "2026-08-15T15:41:56Z", "hours": 2.8206, "text": "Progress Update – Last 3 Hours Focused on two main things: Engine Optimization Font Rasterizer – added support for rendering fonts in the HUD Optimizations: Integrated VMA (Vulkan Memory Allocator) Added object instancing Fixed a buffer bug that was causing a memory leak Image: Cube made of 30×30×30 (27 000) smaller cubes + HUD with rendered font. All of this is made in C++ and the Vulkan SDK."}, {"post_id": 47338, "ts": "2026-08-15T06:56:33Z", "hours": 5.75, "text": "Engine Updates Added GPU-driven Hi-Z culling Added canvas — you can now make HUDs Optimized scenes a little Added Scene Serializer Added Asset Manager Added Color class — you no longer have to work with plain vectors Showcase On the image you can see a cube made from 30×30×30 smaller cubes, each one casting a shadow. In the bottom-left corner you can see the canvas. All of this is made in C++ and the Vulkan SDK ."}, {"post_id": 46339, "ts": "2026-08-13T14:18:08Z", "hours": 4.5861, "text": "Added Engine Math based on glm. Optimized multi object drawing. Made better project structure"}, {"post_id": 45817, "ts": "2026-08-12T15:21:12Z", "hours": 2.5969, "text": "Added shadows, game objects, engine vectors and matrixs, standaole camera, position and transforms"}, {"post_id": 40303, "ts": "2026-08-03T18:52:30Z", "hours": 3.1914, "text": "I have reorganized code. I added MSAA and rotaing cube!"}, {"post_id": 39619, "ts": "2026-08-02T18:45:09Z", "hours": 0.8017, "text": "I finished my previus project so now i can have two concurrent - this and c++/cuda custom llm. Successfully rendered triangle :) Its only about ~1000 lines of code. I used offical tutorial for start."}]...
|
Title: GamEngine by @bartoszkasyna | Stardance
De Title: GamEngine by @bartoszkasyna | Stardance
Devlogs:
I finished my previus project so now i can have two concurrent - this and c++/cuda custom llm. Successfully rendered triangle :) Its only about ~1000 lines of code. I used offical tutorial for start.
I have reorganized code. I added MSAA and rotaing cube!
Added shadows, game objects, engine vectors and matrixs, standaole camera, position and transforms
Added Engine Math based on glm. Optimized multi object drawing. Made better project structure
Engine Updates Added GPU-driven Hi-Z culling Added canvas — you can now make HUDs Optimized scenes a little Added Scene Serializer Added Asset Manager Added Color class — you no longer have to work with plain vectors Showcase On the image you can see a cube made from 30×30×30 smaller cubes, each one casting a shadow. In the bottom-left corner you can see the canvas. All of this is made in C++ and the Vulkan SDK .
Progress Update – Last 3 Hours Focused on two main things: Engine Optimization Font Rasterizer – added support for rendering fonts in the HUD Optimizations: Integrated VMA (Vulkan Memory Allocator) Added object instancing Fixed a buffer bug that was causing a memory leak Image: Cube made of 30×30×30 (27 000) smaller cubes + HUD with rendered font. All of this is made in C++ and the Vulkan SDK.
Particle System I was trying to add .glb models importer but this is very hard to do without third parties dependencies and i messed up something - Tree looks flat(second attachment). After many failed attempts I decided to start making particle system, as you can see it looks good. It is also optimized. FPS drop which you can see on video is caused by cmake compilation in background. I hope you like my particles :) All of this is made in C++ and the Vulkan SDK.
Added movement, you can move by using wasd, scroll and RMB
I made basic editor. Now looks like terrible but I will make it better
Editor Update The editor has been significantly improved and now looks much better. Cross-Platform Support The editor no longer depends on the Windows API, which means it should work on both Windows and Linux . Technology Stack The original goal was to use only: C++ Vulkan SDK SDL3 GLM These are all standard components that come with a typical Vulkan development setup. After further research, Dear ImGui was also added. It is currently the only third-party dependency . Performance Both the Scene View and Game View are capped at 60 FPS . The Scene View captures the 90th frame of the particle effect so that it remains static. Next Steps Focus will now shift to expanding the editor’s functionality.
I messed something up and m editor wasnt responding I couldt click anything. I was trying to fix it almost 5 hours. What I fixed? - vulkan and SDL were recreating while turning MSAA on and GPU was loosing context
I made object scriptable!
Added Color picker, and updated window reloading while adding MSAA or new color. Now you can easily change color in editor
I added simple gravity and colliders. I also reorganized code a little - I make high level API so user dont have to use Vulkan and SDL directly.
I was working on realistic sphere physics. I think it looks good enough. I was also working on tests. Fixed bug when ramp after start/stop was changing her location.
last 1.25h I was adding cube physics, imo it look very satisfying.
Today I was mainly working on code quality and project refactorization. When I was testing scenes with various of configuration I found some type of physics bug - Objects are shaking for some reason, you can see this in attached video
I was fixing my physics system. I fixed some bugs and created new ones. First new bug is sphere bouning up on first contact. 2 bug is cube lifting up another cube. I’m happy that I removed object shaking
Added gltf models importing with editor asset manager. Imported gameobject has his unique mesh collider.
I was working on terrain sculping. I was inspired by unity system generator so I wanted to make something smiliar. Now there is only one brush but i will extend possibilities of my system.
Today I was working on code quality and better terrain sculping tools. I added grass painting. I also added some nice shader to grass - A rolling ball leaves a trail in the grass. Check it out!
Today I was working on better shadow implemenatation. I implemented VSM shadows - smiliar are used in UE5. I think its looks good
Today i was adding missing tests. I also updated terrain sculping system - you can now sculp all terrain at once if multiple instances. I added some utils and deleted fps limit in play mode.
I was working on optimizing grass system. I added wind component and optimized colission with other objects. Thanks to optimatization FPS jumped from ~250 to ~320. I also modified scene saving system - binary file as main file and .terrains failes as terrain data. I added Editor layout to AppData so editor rembeber your last layout
I was working on game optimzatization. I made jump from around 200FPS to 400. There is still a lot more things to optimize.
Today I was working on optimatization, code quality and better model imports. fps jumped from ~400 to ~430.
I was working on UX in editor. Then I found bug which I couldnt fix for 3 hours. Bug was caused my matrix decompose floating point
Last 2 days I was working on editor functionalities. I added built-in powersheell terminal. I also added shadergraph which currently is doesnt want to compile properly
Today I was working on game optimatization and little shadows improvements. I was mainly working on game profiler as you can see in the image
I was mainly working on models and textures compression. Textures are now compressed into BC7 format. I also added remdergraph so user dont have to make it manually.
I was working on finishing render graph. I also optimized editor - in huge scenes it will have more stable 60FPS. I optimized game mode - 1% low are higher now
I was working on editor optimatization and bug fixes. Editor launch time jumped from ~7seconds to 1.5 seconds if editor has cache, otherwise 4.3 seconds. Launching editor no more cause vulkan errors. I also added IBL and reflects. I also bugged shadows a little.
I was working on water system and improving GTAO. While testing I found weird little horizontal strips on shadows. I thought it was my WSM bug so I was trying to fix it. After I checked all possible bugs i realized that I could downgrade GTAO by linear interpolation. I fixed it and now works fine. Water currently has implemented SSR and simple Gernster waves. On the images you can see clip levels and virutal pages shown in shadow debug mode
I am working on water system. I decided to make something diffrent that normal water commonly used in every modern engine. I want to make virtual water system which is inspired by VSM. More technical details I will provide in devlog when I finish my water system. I dont have any working water image so I just upload some engine footage. PS. It might be much more optimize than normal water.
I made water system but it look horrible and performance isnt great, so i focused next on large models importing. Big models are now devided into meshlets. On the image you can see very popular benchmark scene, its called crytek sponza. I think that 170FPS in this stage is good
I started migration to dynamic rendering, so rendering pipeline would be much easier for user. I also made custom title bar. Im in process of improving UI. I found two bugs - in certains camera angle shadows/AO or something doesnt work correctly. Second - some random patterns may occur while looking into sky inside sponza
I was trying to fix shadows but it didint go well, so I gave up and started refactoring code for better readibiliy. On the image you can see broken verin of shadows, dont worry I went back to working ones. I fixed few smaller nearly invisible shadows bugs, so I didint waste myy time. Now I will focus on optimatization and graphics effet
I was working on game optimization, editor functionalities and standalone game building. I successfully optimized GTAO and VSM a little. GTAO still have some halo around some objects and VSM are not full stable. I added option build game in editor. I have to optimize editor a little and add some more functionalities. On the first image you can see nvidia nsight graphics profiler and on the second one standalone game build running in 160 after few seconds. This is decent score for rtx 3050.
Successfully optimized GTAO and VSM, 40FPS gain and more stable 1% low
I was working on Ray Traced Contact Shadows and DDGI. Ray traced shadows works well without droping fps that much. Currently my DDGI is bugged - its very dark. The image is taken with RTCS, DGGI disabled
I was trying to made my version of DDGI but it was unstable, so I made this disabled. Full DDGI would be impossible for my gpu so I used Brixelizer GI from FidelityFX SDK from AMD. It looks good and stable. Image is capyured on intel sponza which has 2.7M traingles - 13x more than original sponza so my engine scale well.
I mainly working on bug fixing. Now VSM and GTAO are fully stable, TAA still needs some love. I was also working on fbx model importer. On the image you can see Amazon Lumberyard Bistro which has 2.7M triangles with 140FPS. I have to work on fps stability while moving camera and make glass shader/object.
I made custom installer for my engine. Now i willl work on optimatization
I was working on bug fixes and glass system. Glass is not working was I want but it havs some progress. Currently glass is highly unoptimized.
Ships:
I made GPU driven game engine. It use vulkan 1.4. GTAO and VSM are still little bugged. Project will be still in development. This experimental version. More deatils are in devlogs. If engine or demo crashes on your device please send me generated logs and device specification...
|
1792853413.3946517
|
1792939813.3946517
|
|
19730
|
chat by @shash | Stardance
|
shash
|
0
|
249.0
|
0
|
[]
|
[{"post_id": 21107, "ts": "202 [{"post_id": 21107, "ts": "2026-07-02T21:59:19Z", "hours": 4.0, "text": "devlog"}, {"post_id": 20800, "ts": "2026-07-02T14:34:02Z", "hours": 10.0, "text": "another devlog"}, {"post_id": 20448, "ts": "2026-07-02T01:24:29Z", "hours": 2.0, "text": "anoher devlog"}, {"post_id": 19999, "ts": "2026-07-01T14:05:01Z", "hours": 33.0, "text": "dev log"}, {"post_id": 18738, "ts": "2026-06-29T22:30:05Z", "hours": 136.0, "text": "longass devlog"}, {"post_id": 12096, "ts": "2026-06-19T18:58:36Z", "hours": 4.0, "text": "devlog"}, {"post_id": 11962, "ts": "2026-06-19T14:58:39Z", "hours": 19.0, "text": "devlog"}, {"post_id": 11052, "ts": "2026-06-18T02:39:41Z", "hours": 8.0, "text": "."}, {"post_id": 10598, "ts": "2026-06-17T12:54:14Z", "hours": 6.0, "text": "nextdelog?"}, {"post_id": 10421, "ts": "2026-06-17T03:46:36Z", "hours": 3.0, "text": "more devlogs"}, {"post_id": 10225, "ts": "2026-06-16T21:10:28Z", "hours": 4.0, "text": "devlog 4?"}, {"post_id": 10053, "ts": "2026-06-16T17:01:07Z", "hours": 3.0, "text": "dev log 3"}, {"post_id": 9918, "ts": "2026-06-16T13:00:47Z", "hours": 2.0, "text": "devlog 2"}, {"post_id": 9786, "ts": "2026-06-16T07:03:34Z", "hours": 15.0, "text": "chat"}]...
|
Title: chat by @shash | Stardance
Devlogs:
chat
d Title: chat by @shash | Stardance
Devlogs:
chat
devlog 2
dev log 3
devlog 4?
more devlogs
nextdelog?
.
devlog
devlog
longass devlog
dev log
anoher devlog
another devlog
devlog...
|
1791823064.9270303
|
1792687064.9270303
|
|
34181
|
INDEMNITY by @ilfattorino | Stardance
|
ilfattorino
|
0
|
249.28
|
0
|
[]
|
[{"post_id": 62466, "ts": "202 [{"post_id": 62466, "ts": "2026-09-05T20:24:58Z", "hours": 10.1272, "text": "renamed game + launcher for this update i renamed the game and all the functions with the new chosen name, i also added where needed the logo in place of the old “decimation” red text and it looks really good now. i also made the window a fixed size so it looks always good. added also the logo for the app that was previous the default empty logo."}, {"post_id": 61740, "ts": "2026-09-04T19:56:55Z", "hours": 9.2, "text": "new name + logo i choose to change the name of the game to “Indemnity” i believe that it suits the game really well and im working rn on remaking the site. these are the new logos and graphics i also kept working on the mod like usual, it takes ages. !!please tell me what you think about these logos and how they could be better!!"}, {"post_id": 61262, "ts": "2026-09-04T03:29:51Z", "hours": 9.5453, "text": "changed the name + kept working i choose to officially change the name into another one the ti will share in the next devlog, i bought the new domain, set up the server, configured the domain with cloud flare and now it works perfectly. i need to still finish building the site but it works very well. Go now it just says test because i only put an h1 with that word but i will replace it soon with the site. After all this i kept also working on the mod continuing renaming functions and cleaning up the code"}, {"post_id": 60549, "ts": "2026-09-02T23:24:11Z", "hours": 10.0283, "text": "kept working on cleaning up code for this devlog i kept working on and cleaning up the code, there isn’t much left and i think that in 3-4 devlogs the code for the mod should be completly readable and ready to be shipped, wth it there will be also the open source launcher and other things like the network"}, {"post_id": 59965, "ts": "2026-09-02T01:23:15Z", "hours": 10.1897, "text": "worked on the mod a lot & other For this devlog, I spent many hours on the mod, resolving issues that caused occasional lag or crashes. A decompiled block of code had turned into gibberish yet still compiled; once isolated, it revealed the entire file was failing because of that section. I also corrected a minor problem in the email client from the previous dev logs where login worked only with a passkey and not with the password, and it is now resolved."}, {"post_id": 59304, "ts": "2026-09-01T00:54:31Z", "hours": 10.8267, "text": "Optimized email client + mod debugging For this devlog i optimized the email client to make it work as intedend, there were some issues with the html formatting of emails and many many issues with creating the email client like the passkeys not actually allowing to access the account and similiar things but now it works as intended and i don’t think additional modifications are required. From now on i will only work on the mod and i’m going to rebrand it to something else different, i don’t like the community that is left of this mod, it’s too much toxic and i don’t want to have to handle all of that childish behavior"}, {"post_id": 58542, "ts": "2026-08-30T23:49:15Z", "hours": 10.0103, "text": "Added offline status + fixed issue with profile For this devlog i added a full screen alert that says when the client is disconnected from the network and prevents the launching of the game. I also fixed an issue where when closing the launcher, disconnecting from the network and then reopening the launcher it would display a dummy profile in place of the logged in one I also spent a lot of time like all the other devlogs debugging the mod code and functions"}, {"post_id": 57774, "ts": "2026-08-30T02:09:38Z", "hours": 9.935, "text": "Created Mail Server, Client, and SMTP Server For this devlog, I built the mail server and client to handle, manage, view, and send emails for the game and foundation. I initially tried running everything locally, but AWS blocked me, they toughtI was using port 25 for malicious activity and refused to unlock it. After that, I attempted to use AWS SES, but it was a nightmare: overly complex, required a ton of verification, and cost more than other options, so I scrapped it.While searching for a better solution, everything else was already working well, though I did spend a lot of time debugging with ChatGPT. Eventually, I found a free SMTP service that provided exactly what I needed. I integrated it with the server, and now everything runs smoothly."}, {"post_id": 56865, "ts": "2026-08-28T20:44:52Z", "hours": 10.9875, "text": "Worked on the server part of the mod I worked on making the server part of the mod work, now the servers work perfectly fine and I’m working on optimizing the code to make it run even smoother"}, {"post_id": 55700, "ts": "2026-08-27T17:44:31Z", "hours": 10.8569, "text": "kept working on the mod in these days i just kept working on the mod, cleaning up code and rewriting functions, nothing much but time intensive. Also i fixed the mobs that didn’t worked before, now they are functional."}, {"post_id": 53844, "ts": "2026-08-24T15:24:32Z", "hours": 10.2333, "text": "making logos + kept working on the mod I’ve been working on the logos of the foundation and the game that i didn’t like the old ones, and also I’m thinking about changing the name of this mod because it doesn’t make sense with all the hate received to keep working on this and as soon as it gets available to get ddosed and harassed. I’ve also been working like usual on the mod fixing bugs and more."}, {"post_id": 52030, "ts": "2026-08-22T02:11:47Z", "hours": 10.62, "text": "kept deobfuscating the game + kept modifying the foundation site i gave a new look to the foundation site with a new logo and kept working on the mod and maps"}, {"post_id": 50992, "ts": "2026-08-20T14:12:26Z", "hours": 10.7794, "text": "encountered e-gangsters, little edit on the launcher and kept modifying the client I had the pleasure to encounter e-ganster and they promised to search for exploits and to “disgust” the playerbase, how tuff.. They also said that the foundation registered with hcb is not real, lol After this little encounter i also kept modifying the launcher and the game. i kept debugging and fixed a little issue that was brought up by a kind person that the play button was bad, really bad, now it’s looking alright."}, {"post_id": 50004, "ts": "2026-08-19T01:09:18Z", "hours": 10.9497, "text": "I kept modifying the site + deobfuscating the mod and editing the launcher 1 ) I kept editing the site for the foundation that is still not looking professional enough and serious (I believe at least). Please share your opinion, what’s missing and what should I change: https://iidastemfoundation.org 2 ) I kept working on deobfuscating the mod (in fact all the hours counted for this devlog came from doing it) that is extremely hard to do and I don’t have any more tokens to use for this month so I guess I just have to keep working manually (feeling like in a coal mine rn). 3 ) I kept also working a bit on the launcher but nothing much for this update."}, {"post_id": 48884, "ts": "2026-08-17T13:31:35Z", "hours": 10.6075, "text": "made the site for the foundation + continued making the launcher For this devlog i made the public facing website for the foundation. It has been kinda hard to do right but finally it’s kinda good looking. I also continued to make the launcher and fix things that didn’t worked."}, {"post_id": 47689, "ts": "2026-08-15T19:26:30Z", "hours": 17.5217, "text": "registered nonprofit + added google login and discord rich presence in the last days i successfully registered the nonprofit that owns the game. It took some time but it’s now registered. I succesfully added the google and microsoft login that will allow users to access only using those ways. It increases security and makes everything easier. I integrated also Discord Rich Presence do display on users running the game and launcher the status."}, {"post_id": 45473, "ts": "2026-08-11T23:34:56Z", "hours": 14.2642, "text": "made settings, servers and news pages + continued to edit the mod Hi everyone, in these days i’ve continued to build the launcher by making all these pages, they work well except for settings that a few things have still to be made."}, {"post_id": 44329, "ts": "2026-08-10T00:34:00Z", "hours": 14.4689, "text": "Restyle of the launcher + future of the mod I have restyled the Launcher to be prettier and more useful. The last release was only the first test interface to verify that it worked. Now it’s looking way better and far more usable. I’ve also been thinking about not just remaking this mod and then leaving it to die again. I intend to continue it, but I have no intention to profit from it. Because of this, I’m planning to create the iida Foundation through the HCB portal of Hack Club. The foundation will aim to create STEM projects to increase teenagers’ knowledge, specially through games that are actually interesting to play and provide real world skills, not just in game benefits. These skills include technology, energy, handcraft, and farming."}, {"post_id": 42652, "ts": "2026-08-07T14:24:40Z", "hours": 9.2544, "text": "First peek at the launcher This is the first look at the Launcher. I’m building this launcher in C++ with Qt. I chose this combination because it streamlines development and delivers superior graphics. The fields are currently empty, I’m using placeholders rather than mock data so once i connect the backend server all fields will populate automatically. Join our community on Discord: discord.gg/decimation Thanks for your interest!"}, {"post_id": 41630, "ts": "2026-08-05T23:20:54Z", "hours": 10.2097, "text": "the launcher I’ve started building the open source launcher in C++. I chose C++ for its flexibility across multiple platforms and because it’s the language I’m most comfortable with. (The design is currently AI generated, I’ll design something polished later.) I’m also continuing to refactor and clean up the mod’s codebase."}, {"post_id": 39981, "ts": "2026-08-03T10:17:23Z", "hours": 10.0, "text": "code clean up + debug lately i focused mostly on fixing bugs in the code that came from the deobfuscation and cleaning up duplicated functions/not needed anymore. I also started renaming functions that were like Ab and Ad to the actual use of it, however many functions are still incompressible on what they do and it’s taking me a lot to do it. As promised before i will now start building the launcher to finally make it playable again."}, {"post_id": 35793, "ts": "2026-07-27T13:36:56Z", "hours": 9.9894, "text": "Singleplayer Singleplayer is running great. No crashes, no blockers, nothing hanging on startup. Everything works as intended: Food and Drinks are usable, Weapons shoot, reload and work fully, Bombs the same, Cars are Driveable, Glider works, Clothes protect and are wearable Protocol coverage Piece by piece i’ve been reconstructing every message type the client sends and expects back matching the exact wire format so nothing breaks on either end. At this point the server correctly handles: Player profile fetching and viewing Kill counts, death counts, and zombie kill counts all tracked and saved per player Supporter status checks Crash report submissions, saved server-side Live player count, reported back to the client accurately A few message types are still open (server list population, some global stats, in-game notifications), but the core loop, the stuff a player actually touches every session is in and working. The top-right info panel is live The panel in the top-right corner of the client is now pulling its data straight from the network, live, with no issues. That data isn’t hardcoded or cached it’s a real pulled from the server like it’s supposed to. Getting that thing stable was one of the trickier parts of this whole stretch given how many layers of networking had to line up first but it’s paying off now. What this adds up to Individually none of these matter much, Together they mean the actual hard part (the plumbing nobody sees) is done and holding up. Singleplayer works, the network path from client to server works, the core gameplay data (kills, deaths, profiles, supporter status) is being tracked correctly. The next stretch of work is the hardest, filling in the remaining protocol gaps (server list, global stats, notifications) and starting to build the launcher Thanks for sticking with this rebuild. Hop into the Discord if you want to follow updates discord.gg/decimation"}, {"post_id": 34879, "ts": "2026-07-25T23:03:57Z", "hours": 7.4592, "text": "Hello everyone new updates!! The original mod talked to a server over raw TCP/UDP sockets (using a Java networking library called KryoNet) for things like player stats, the server list screen, and update checks. That backend was never open source and doesn’t exist anymore, so I’ve been writing a brand new one that speaks the exact same “language” the client expects matching its wire protocol message by message so the old client just works against new server code without needing to be rewritten itself. So far that new server handles: Player profiles (kills/deaths/stats) The in game server list Live player count More message types (server-side crash reports, supporter status, the update system) are getting added one at a time as I work through them. Networking infrastructure. Got a relay set up so the client’s existing hardcoded connection info actually reaches the new server, DNS pointed at the right place, and both sides talking over the same ports without falling over which involved learning more about TCP vs UDP port binding and firewall/security groups than I expected to going in. Fixed a pile of dead links. A handful of things the mod calls out to at runtime (update checks, a resource pack, some JSON it fetches for the main menu) pointed at old GitHub links that don’t exist anymore. Tracked those down one at a time and replaced them with working equivalents, including chasing down a sneaky “blocked because of the default Java user-agent” issue that looked like a permissions bug at first."}, {"post_id": 28052, "ts": "2026-07-14T02:18:51Z", "hours": 1.2119, "text": "Hey everyone, It’s been a while but Decimation is alive again. I want to give you a real update on where things stand, because a lot has happened behind the scenes and I don’t want that work to go unnoticed. (and i have no clue why it logged only 46m over the +100 hours of work done but whatever.) Where this started Like some of you may know, development on Decimation stalled a long time ago and the original source code was never made public. For a long time that meant the mod was effectively frozen, no fixes, no updates, no working mod. Over the past weeks I’ve been working on reviving the project from the ground up: rebuilding a working development environment, restoring the codebase to a buildable state, and getting the whole thing running on modern tooling instead of the outdated setup it originally shipped with. This has been a genuinely massive undertaking. We’re talking about thousands of individual issues that needed to be worked through one by one, some tiny, some structural, across a codebase that spans dozens of systems. It has not been a quick job, and there were several points where the smart move was to stop, rethink the approach, and redo work rather than push forward on a shaky foundation. What’s been accomplished so far Full build pipeline rebuilt. The mod now compiles against a modern, actively maintained toolchain instead of infrastructure that had quietly rotted away over the years (dead package repositories, unsupported build tools, etc). The codebase itself has been restored to a compilable state. This included resolving a huge number of structural issues throughout the mod’s systems, core mechanics, networking, rendering, player data, UI, and more. First successful in-game boot. After all of the above, I’ve gotten Decimation to actually launch in a Minecraft client again for the first time. Cross-machine reliability. Ironing out environment specific quirks so the project builds consistently regardless of which machine it’s compiled on. What’s next The immediate focus now is functional testing, going system by system to confirm everything behaves the way it’s supposed to, catching runtime issues that don’t show up until you actually play the mod, and gradually cleaning up the codebase so future changes are easier to make than this initial recovery was. I’m not going to promise a release date, because anyone who’s done a project like this knows those promises tend to age badly. What I can promise is that this isn’t a “one big push and abandon it again” situation, the goal is to get Decimation back to a state where it can actually be maintained and built upon going forward."}]...
|
Title: INDEMNITY by @ilfattorino | Stardance
Devl Title: INDEMNITY by @ilfattorino | Stardance
Devlogs:
Hey everyone, It’s been a while but Decimation is alive again. I want to give you a real update on where things stand, because a lot has happened behind the scenes and I don’t want that work to go unnoticed. (and i have no clue why it logged only 46m over the +100 hours of work done but whatever.) Where this started Like some of you may know, development on Decimation stalled a long time ago and the original source code was never made public. For a long time that meant the mod was effectively frozen, no fixes, no updates, no working mod. Over the past weeks I’ve been working on reviving the project from the ground up: rebuilding a working development environment, restoring the codebase to a buildable state, and getting the whole thing running on modern tooling instead of the outdated setup it originally shipped with. This has been a genuinely massive undertaking. We’re talking about thousands of individual issues that needed to be worked through one by one, some tiny, some structural, across a codebase that spans dozens of systems. It has not been a quick job, and there were several points where the smart move was to stop, rethink the approach, and redo work rather than push forward on a shaky foundation. What’s been accomplished so far Full build pipeline rebuilt. The mod now compiles against a modern, actively maintained toolchain instead of infrastructure that had quietly rotted away over the years (dead package repositories, unsupported build tools, etc). The codebase itself has been restored to a compilable state. This included resolving a huge number of structural issues throughout the mod’s systems, core mechanics, networking, rendering, player data, UI, and more. First successful in-game boot. After all of the above, I’ve gotten Decimation to actually launch in a Minecraft client again for the first time. Cross-machine reliability. Ironing out environment specific quirks so the project builds consistently regardless of which machine it’s compiled on. What’s next The immediate focus now is functional testing, going system by system to confirm everything behaves the way it’s supposed to, catching runtime issues that don’t show up until you actually play the mod, and gradually cleaning up the codebase so future changes are easier to make than this initial recovery was. I’m not going to promise a release date, because anyone who’s done a project like this knows those promises tend to age badly. What I can promise is that this isn’t a “one big push and abandon it again” situation, the goal is to get Decimation back to a state where it can actually be maintained and built upon going forward.
Hello everyone new updates!! The original mod talked to a server over raw TCP/UDP sockets (using a Java networking library called KryoNet) for things like player stats, the server list screen, and update checks. That backend was never open source and doesn’t exist anymore, so I’ve been writing a brand new one that speaks the exact same “language” the client expects matching its wire protocol message by message so the old client just works against new server code without needing to be rewritten itself. So far that new server handles: Player profiles (kills/deaths/stats) The in game server list Live player count More message types (server-side crash reports, supporter status, the update system) are getting added one at a time as I work through them. Networking infrastructure. Got a relay set up so the client’s existing hardcoded connection info actually reaches the new server, DNS pointed at the right place, and both sides talking over the same ports without falling over which involved learning more about TCP vs UDP port binding and firewall/security groups than I expected to going in. Fixed a pile of dead links. A handful of things the mod calls out to at runtime (update checks, a resource pack, some JSON it fetches for the main menu) pointed at old GitHub links that don’t exist anymore. Tracked those down one at a time and replaced them with working equivalents, including chasing down a sneaky “blocked because of the default Java user-agent” issue that looked like a permissions bug at first.
Singleplayer Singleplayer is running great. No crashes, no blockers, nothing hanging on startup. Everything works as intended: Food and Drinks are usable, Weapons shoot, reload and work fully, Bombs the same, Cars are Driveable, Glider works, Clothes protect and are wearable Protocol coverage Piece by piece i’ve been reconstructing every message type the client sends and expects back matching the exact wire format so nothing breaks on either end. At this point the server correctly handles: Player profile fetching and viewing Kill counts, death counts, and zombie kill counts all tracked and saved per player Supporter status checks Crash report submissions, saved server-side Live player count, reported back to the client accurately A few message types are still open (server list population, some global stats, in-game notifications), but the core loop, the stuff a player actually touches every session is in and working. The top-right info panel is live The panel in the top-right corner of the client is now pulling its data straight from the network, live, with no issues. That data isn’t hardcoded or cached it’s a real pulled from the server like it’s supposed to. Getting that thing stable was one of the trickier parts of this whole stretch given how many layers of networking had to line up first but it’s paying off now. What this adds up to Individually none of these matter much, Together they mean the actual hard part (the plumbing nobody sees) is done and holding up. Singleplayer works, the network path from client to server works, the core gameplay data (kills, deaths, profiles, supporter status) is being tracked correctly. The next stretch of work is the hardest, filling in the remaining protocol gaps (server list, global stats, notifications) and starting to build the launcher Thanks for sticking with this rebuild. Hop into the Discord if you want to follow updates discord.gg/decimation
code clean up + debug lately i focused mostly on fixing bugs in the code that came from the deobfuscation and cleaning up duplicated functions/not needed anymore. I also started renaming functions that were like Ab and Ad to the actual use of it, however many functions are still incompressible on what they do and it’s taking me a lot to do it. As promised before i will now start building the launcher to finally make it playable again.
the launcher I’ve started building the open source launcher in C++. I chose C++ for its flexibility across multiple platforms and because it’s the language I’m most comfortable with. (The design is currently AI generated, I’ll design something polished later.) I’m also continuing to refactor and clean up the mod’s codebase.
First peek at the launcher This is the first look at the Launcher. I’m building this launcher in C++ with Qt. I chose this combination because it streamlines development and delivers superior graphics. The fields are currently empty, I’m using placeholders rather than mock data so once i connect the backend server all fields will populate automatically. Join our community on Discord: discord.gg/decimation Thanks for your interest!
Restyle of the launcher + future of the mod I have restyled the Launcher to be prettier and more useful. The last release was only the first test interface to verify that it worked. Now it’s looking way better and far more usable. I’ve also been thinking about not just remaking this mod and then leaving it to die again. I intend to continue it, but I have no intention to profit from it. Because of this, I’m planning to create the iida Foundation through the HCB portal of Hack Club. The foundation will aim to create STEM projects to increase teenagers’ knowledge, specially through games that are actually interesting to play and provide real world skills, not just in game benefits. These skills include technology, energy, handcraft, and farming.
made settings, servers and news pages + continued to edit the mod Hi everyone, in these days i’ve continued to build the launcher by making all these pages, they work well except for settings that a few things have still to be made.
registered nonprofit + added google login and discord rich presence in the last days i successfully registered the nonprofit that owns the game. It took some time but it’s now registered. I succesfully added the google and microsoft login that will allow users to access only using those ways. It increases security and makes everything easier. I integrated also Discord Rich Presence do display on users running the game and launcher the status.
made the site for the foundation + continued making the launcher For this devlog i made the public facing website for the foundation. It has been kinda hard to do right but finally it’s kinda good looking. I also continued to make the launcher and fix things that didn’t worked.
I kept modifying the site + deobfuscating the mod and editing the launcher 1 ) I kept editing the site for the foundation that is still not looking professional enough and serious (I believe at least). Please share your opinion, what’s missing and what should I change: https://iidastemfoundation.org 2 ) I kept working on deobfuscating the mod (in fact all the hours counted for this devlog came from doing it) that is extremely hard to do and I don’t have any more tokens to use for this month so I guess I just have to keep working manually (feeling like in a coal mine rn). 3 ) I kept also working a bit on the launcher but nothing much for this update.
encountered e-gangsters, little edit on the launcher and kept modifying the client I had the pleasure to encounter e-ganster and they promised to search for exploits and to “disgust” the playerbase, how tuff.. They also said that the foundation registered with hcb is not real, lol After this little encounter i also kept modifying the launcher and the game. i kept debugging and fixed a little issue that was brought up by a kind person that the play button was bad, really bad, now it’s looking alright.
kept deobfuscating the game + kept modifying the foundation site i gave a new look to the foundation site with a new logo and kept working on the mod and maps
making logos + kept working on the mod I’ve been working on the logos of the foundation and the game that i didn’t like the old ones, and also I’m thinking about changing the name of this mod because it doesn’t make sense with all the hate received to keep working on this and as soon as it gets available to get ddosed and harassed. I’ve also been working like usual on the mod fixing bugs and more.
kept working on the mod in these days i just kept working on the mod, cleaning up code and rewriting functions, nothing much but time intensive. Also i fixed the mobs that didn’t worked before, now they are functional.
Worked on the server part of the mod I worked on making the server part of the mod work, now the servers work perfectly fine and I’m working on optimizing the code to make it run even smoother
Created Mail Server, Client, and SMTP Server For this devlog, I built the mail server and client to handle, manage, view, and send emails for the game and foundation. I initially tried running everything locally, but AWS blocked me, they toughtI was using port 25 for malicious activity and refused to unlock it. After that, I attempted to use AWS SES, but it was a nightmare: overly complex, required a ton of verification, and cost more than other options, so I scrapped it.While searching for a better solution, everything else was already working well, though I did spend a lot of time debugging with ChatGPT. Eventually, I found a free SMTP service that provided exactly what I needed. I integrated it with the server, and now everything runs smoothly.
Added offline status + fixed issue with profile For this devlog i added a full screen alert that says when the client is disconnected from the network and prevents the launching of the game. I also fixed an issue where when closing the launcher, disconnecting from the network and then reopening the launcher it would display a dummy profile in place of the logged in one I also spent a lot of time like all the other devlogs debugging the mod code and functions
Optimized email client + mod debugging For this devlog i optimized the email client to make it work as intedend, there were some issues with the html formatting of emails and many many issues with creating the email client like the passkeys not actually allowing to access the account and similiar things but now it works as intended and i don’t think additional modifications are required. From now on i will only work on the mod and i’m going to rebrand it to something else different, i don’t like the community that is left of this mod, it’s too much toxic and i don’t want to have to handle all of that childish behavior
worked on the mod a lot & other For this devlog, I spent many hours on the mod, resolving issues that caused occasional lag or crashes. A decompiled block of code had turned into gibberish yet still compiled; once isolated, it revealed the entire file was failing because of that section. I also corrected a minor problem in the email client from the previous dev logs where login worked only with a passkey and not with the password, and it is now resolved.
kept working on cleaning up code for this devlog i kept working on and cleaning up the code, there isn’t much left and i think that in 3-4 devlogs the code for the mod should be completly readable and ready to be shipped, wth it there will be also the open source launcher and other things like the network
changed the name + kept working i choose to officially change the name into another one the ti will share in the next devlog, i bought the new domain, set up the server, configured the domain with cloud flare and now it works perfectly. i need to still finish building the site but it works very well. Go now it just says test because i only put an h1 with that word but i will replace it soon with the site. After all this i kept also working on the mod continuing renaming functions and cleaning up the code
new name + logo i choose to change the name of the game to “Indemnity” i believe that it suits the game really well and im working rn on remaking the site. these are the new logos and graphics i also kept working on the mod like usual, it takes ages. !!please tell me what you think about these logos and how they could be better!!
renamed game + launcher for this update i renamed the game and all the functions with the new chosen name, i also added where needed the logo in place of the old “decimation” red text and it looks really good now. i also made the window a fixed size so it looks always good. added also the logo for the app that was previous the default empty logo....
|
1791820111.845715
|
1792684111.845715
|
|
37669
|
STELLA by @Loibo_2 | Stardance
|
Loibo_2
|
0
|
249.54
|
0
|
[]
|
[{"post_id": 65363, "ts": "202 [{"post_id": 65363, "ts": "2026-09-10T13:33:28Z", "hours": 10.0181, "text": "New Devlog :D It’s finally almost done… a working orbit system. I had sooo many problems with the different velocities, coordinates, and a lot of other things. But now it’s finally starting to look like something. Of course, it’s not perfect right now and still needs some adjustments, but the basic principle is done. For the next devlog, I’ll try to polish it and fully complete the system. I also want to give it a better look with some custom graphics and add a few more orbit lines without making it too laggy. Hope you like it :)"}, {"post_id": 63453, "ts": "2026-09-07T09:54:44Z", "hours": 9.6464, "text": "New Devlog :D I’m finally getting somewhere! After a lot of fixing and debugging, I now have an orbit line system that doesn’t behave weirdly when the time is set to a high value. I can now also project escape trajectories, elliptical orbits, and more. The next few things I want to work on are SOIs and collisions with them, as well as some other things like multiple planets, moons, and more rockets. Hope you like it"}, {"post_id": 60120, "ts": "2026-09-02T09:05:23Z", "hours": 9.8636, "text": "Sadly, I didn’t get much done this time :/ I did sooo much debugging on the physics system, but nothing was really working. I had so many issues with acceleration, different systems using different values, and multiple problems with ground detection. So I started all over again… Right now, I’ve removed all the physics and ground collision parts from the code, and I’ll try again. This time, I want to use one variable for each value and build an improved and more realistic engine instead of just guessing values and parameters. I also drew a few new parts. Hope you like it (:"}, {"post_id": 58390, "ts": "2026-08-30T19:57:55Z", "hours": 10.3636, "text": "New Devlog :D OMG I did it. The orbit line rendering is finally done, and it took sooo much debbugging. I spend most of the time converting the map coordinates to the planet coordinates, that are used in the physics system. I also had soo many small issues, like missing minus signs or just bad or old weird code that was causing problems. But now it is mostly working. The only think that still needs fixing is the transistion when going above 120km in altitude. Once that and a few other small things are fixed, most of the physics stuff should be finisched. I also got the time warp working in the planet view so that isn´t a problem anymore. The current max is x10 below 120km and x100 below 600km. Hope you like it :)"}, {"post_id": 57249, "ts": "2026-08-29T11:11:52Z", "hours": 9.9744, "text": "New Devlog :D The first thing I did was to remove the orbit line system. I noticed that it was full of bugs, and the different x, y, vx and vy values in the map, the game and depending on whether the rocket was in the planet´s orthe sun´s sphere of influence were becoming to complicated. SO i scrapped thewhole system. Then i stated over by deleting everything related too physics from the maps code and moving it into the games physics code. After that, I divided the pysics system into muliple sections: physics on the ground, in the air, in an orbit around the planet and in an orbit aroun the sun. By doing this, I can get better results for each part of the game and make the system easier to manage. I also added a new function, and now the rocket accelerates whn pressing W. For the next devlog, I´ll try to get at least some parts of the orbit system working so I can move on to another part of the game. Hope you like it"}, {"post_id": 56501, "ts": "2026-08-28T09:25:19Z", "hours": 7.7267, "text": "New Devlog :D Spend most of the time working on the new system to show the orbital lines. The first step was to add a Sphere of Influence (SOI), so the rocket isn´t pulled constantly by two or more bodies at the same time. Next I somehow got the pysics to work so that the orbit line stops when it would enter a SOI. It´s very buggy right now, though. The white orbit is sometimes glitching, and after entering the SOI the rocket just gets teleportet to the ground. Also addet two markers to show the Apogee and the Periapsis. I will keep working on it, because this is such an importent feature. Hope you like it"}, {"post_id": 55217, "ts": "2026-08-26T20:02:34Z", "hours": 10.275, "text": "New Devlog :D Puhhh, another big one. Most of the time, I spent trying to somehow turn the flat map of the game into a sphere. This took sooooo long, and it still isn’t quite right. I don’t know why, but the terrain isn’t fully the same. Also, the rocket is now a dot on the map that shows its coordinates. It also has a simple orbit line and can be centered. The planet now has the correct dimensions and radius, based on the other values. A big problem I had was that the 32-bit values were too small for the scale at which the pixels were being rendered. Hope you like it :)"}, {"post_id": 54441, "ts": "2026-08-25T13:45:19Z", "hours": 10.17, "text": "New Devlog :D Addet soooo much new stuff. Some features were really big, and I didn´t have the motivation to finish them completely, so a few thinks are a bit buggy right now. New stuff: Biggest point: Fixed the physics system. Before the fix, all rockets were just spinning around when sitting on a slope. They also glitched into the gorund or just fell in infinitly. Now both probles are fixed. The first one by using a point system to determie if the rocket is on a slope and should slide, as well as a lever arm that uses the mass to rotate the craft. For the second problem, I introduced a new outline system that now uses a convex hull. The only problem is that parts like the engine aren´t drawn accurately. Sooo thats one think i need to fix. New 0x time warp to stop the whole think and get a closer look. The planet now has its actural terrain height when viewed p close, instead of just beeing a cricle. It is terrabil right now and only a fist try. A new marker to show, where the rocket is on the map. Thinks to do next: Fix the convex hull New system for when the planet is viewed up close in the map view Fix everything in the map view around the planet Hope you like it :)"}, {"post_id": 53620, "ts": "2026-08-24T08:34:16Z", "hours": 9.035, "text": "New Devlog :D I´m not completely done with the terrain system, but i´m gonna stop working on it for now. It looks okay, until you zoom out to far and I´m not really making any progress anymore. Right now, it uses a simplex Noise with some other noise types in layers on top, aswell as some plateu logic and corosion. Also a biome system, that is in a okay shape right now, wich gives each section a unique color. Next i will focus more on thinks like physic, propulsion and the map. Hope you like it :)"}, {"post_id": 52897, "ts": "2026-08-23T08:55:01Z", "hours": 9.7747, "text": "New Devlog :D Did sooooo much work on the terrain system… For the most part , I looked online for some code snippets and tried to get them working with javascript. In the previous devlog, I showed the different colors for the biome system. I build around that, so each biome has it´s different amount of octaves, roughness and amplitude. Roughness in this case just says how smooth the different Simplex noise points should be between each other. This worked fine until you zoomed out. Especially in mointain areas, the waves from the sin and cos funtions were noticeable. So i tried a few things… Using a warp funtion to stretch high waves Terracing points, which wee a complety failure Stacking more functions on top of each other But everyting had its ownsides and nothing worekd fine… While trying those things, I wrote somecode that now lts you zoom out as far as you want by removing more and more lines so it doesn´t get laggy. Right now it looks terrible, but i have a final idea. For evey point above a given threshold, I´m gonna randomly choose two points and randomly flatten everything bewteen them. If you have any ideas how to get better terrain, please write it down in the comments. Hope you like it :)"}, {"post_id": 51582, "ts": "2026-08-21T11:03:54Z", "hours": 7.5636, "text": "Devlog time :D Last time, I showed a terrain geration system where the main factor was different biomes that were more or less hardcoded. - I scrubbed all of that and startet over. The new system is based on a simplex/perlin noise with a 8 layers of octaves. This took so long and i still don´t fully understand the code i put together using different websites. The noise generates random height nosies that are a few pixels apart and the rest is calculatet in between. next I added the biome overlay. Right now it´s just a prototype, but it uses the same noise technique with the pixels spaced further apart and gives each sector a random color. The problem right now is that everything is roughly the same height and the biomes are way to small and with way to clean fades between them. I will keep working on the terrain sytsem. Hope you like it :)"}, {"post_id": 50470, "ts": "2026-08-19T17:11:57Z", "hours": 7.0219, "text": "New Develog I never thought that terrain generation would be that hard Dx. I tried to generate the map pixel by pixel using a custom seed and many differt parameters. For now, I got a simple biome system working, but it still doesn´t looks quiet right. The biomes are stored in an array with a few parameters like height, roughness and the chances of craters, etc. This workes kinda okay, but the normal tarrein is not in a good shape right now. I will try to work on that and get a more realistic landscape. Also, I want to make a better system to randomly place craters, rocks and other stuff. Hope you like it :)"}, {"post_id": 49878, "ts": "2026-08-18T20:34:22Z", "hours": 9.3578, "text": "New Devlog :D First of all, this took bit longer because I had to switch on my androit tablet… I got visual studio code running bey installing termux and running it via an ubuntu extension. Worked a lot on the physics system. It now has collision and uses the exact same code for calculating the planet height. The rocket can´t go blow the ground height. It´s not perfect but okay. Some problems are still present, especially with falling over and beeing to slippery. Still good progress. Hope you like it :)"}, {"post_id": 48171, "ts": "2026-08-16T13:49:56Z", "hours": 8.9831, "text": "Devlog time :D It´s not completly done but her is the first version of the pyhsics part. Right now there is no atmosphere or a solid ground, but it is something and it took way to long, especially calculating some of the turning math. The craft is turned with ‘E’ and ‘Q’ and turns around the command pod wich is the onle part that can turn right now. And I still haven´t fixed the build menu. I also noticed that the parts placed in the ame now look off and I don´t know why. Hope you like it :)"}, {"post_id": 47440, "ts": "2026-08-15T11:28:06Z", "hours": 7.8667, "text": "Devlog time :D Worked on a lot of thinks: The new timewarp system. It is not completly done and 1x is not the real time right now. You can now click and still follow the same object while beeing in the map view. Improved the orbit lines. (not as wobbly as before) Tried to fix the build menu… and failed. It´s now worse then before urgh. For the next devlog the menu issues will hopefully be fixed. Hope you like it :)"}, {"post_id": 46269, "ts": "2026-08-13T12:07:46Z", "hours": 8.9306, "text": "New develog :D Worked a lot on the map viewof my space game. Features addet: Improved the view of the planet and the sun. In this example, I used the proportions of the sun and mars. Addet a button to switch the currect object the camera ist locked onto. Addet a line that shows the orbit of each object, but it´s not finished yet.. the closer you are, the more wobbly it get´s. Changed the color of the locked objct. Hope you like it :)"}, {"post_id": 44567, "ts": "2026-08-10T12:33:20Z", "hours": 7.9642, "text": "Devlog time :D Worked on the map menu. It does not look like much but the smaller circle is in an orbit around the big one. Not in the right scale and far from beeing realstic, but i´m getting there. Hope i can finish it soon :)"}, {"post_id": 43339, "ts": "2026-08-08T15:17:11Z", "hours": 3.4517, "text": "Small devlog :D Added the rocket to the actual game. No physics or collision yet, but that will be my next task. Also addet weight to every part. The yellow rect is the center of mass. Hope you like it :)"}, {"post_id": 42933, "ts": "2026-08-07T22:24:58Z", "hours": 6.4756, "text": "New Devlog :D Right now it doesn´t look like much, but this is the technique I´m going to use to rander planets. The idea is that if you´re close enough, every planet or moon looks flat on the surface. So instead of rendering a full sqhere, i´m using an finite strip with a thousends of pixels. Each pixel gets his height trough a seed, so it should look the exact same everytime. This way, I dont have to bend pixels and can stay with the pixelized look. Hope you like it :)"}, {"post_id": 42511, "ts": "2026-08-07T09:40:03Z", "hours": 7.2953, "text": "New devlog :) It´s not much to look at, but got a lot of thinks working: added a new file structure to change the sceen to other modes like the main menu createt 7 new files for all the different modes and structure and state files hours of debugging… those canva lines are not easy That´s all for now, hope you like it :)"}, {"post_id": 41840, "ts": "2026-08-06T09:32:24Z", "hours": 7.3692, "text": "Finished a major part of the building system: you can now select and drag parts or entire structures. I had some trouble figuring out how to store each part so I could identify all parts below it. Also fixed: the rendering of the build menu some big array structures Hope you like it :)"}, {"post_id": 41236, "ts": "2026-08-05T09:52:06Z", "hours": 4.1428, "text": "Omg i did it… took way to much work and isn´t 100% done, but now it´s just fixing some points and remaking some texures :) Next things to do are: Fix the engines More Parts and inner tanks Smaller Tanks and parts Part moving system"}, {"post_id": 40718, "ts": "2026-08-04T13:09:12Z", "hours": 9.6061, "text": "Sadly didn´t get much done :/ I had way to much debugging and couldn´t really find teh errors. But I will trying to fix it :) The Idea is to have large empty structual components where you can deside what to put into them. right now there are only two types of tanks (oxigen and liquid propellant) but more will come, like hydrogen, helium and other stuff like batteries or life support system."}, {"post_id": 39436, "ts": "2026-08-02T12:00:33Z", "hours": 6.3542, "text": "Lots of small technical things fixed. New detection System for different parts and a new mode for building tanks. Also some new textures, because 58 is not divisible by 4… Next update probabyl gonna be big :)"}, {"post_id": 38703, "ts": "2026-08-01T07:30:37Z", "hours": 7.7958, "text": "Did some progress on the menu and added some new parts :) Also a lot of debugging…"}, {"post_id": 38131, "ts": "2026-07-31T10:59:29Z", "hours": 7.4672, "text": "Finished the overlap system today and also a few new parts. :)"}, {"post_id": 37582, "ts": "2026-07-30T12:36:09Z", "hours": 8.8811, "text": "Sooooo, new update :D I did a lot of work on the system for how parts are stored and the overlap detection. I also worked on detecting, when two different rockets are connectet (though that part isn´t finished yet). This took and still will tage a lot of work. Dx In the video, you can see the new detection system. It uses points stored in a array to draw a “hitbox” around each object. The last thing I improved was how teh parts are rendered on screen. I´m now useing a function that efficently calculates the correct coordinates. Next, I´ll try to further improve the code, remove as many unnecessary lines as possible, and finally design some new txtuers and parts. Hope you like it :)"}, {"post_id": 36583, "ts": "2026-07-28T19:56:10Z", "hours": 6.9833, "text": "Puhhh finally did it. Took a lot of time, but here it the working Snap System :)"}, {"post_id": 35965, "ts": "2026-07-27T19:09:10Z", "hours": 9.8314, "text": "In the last 9 hours, I made some really good progress on the building system of my space game. A big part of the work was figuring out how to properly store all the data of the individual pieces in arrays, and how to link them together so they can form larger structures. This turned out to be more challenging than expected, especially when trying to keep everything flexible and organized. I also spent some time improving the overall logic behind placimg parts, so it feels more consistent. There’s still a lot to do, but the core system is starting to come together now. Next, I’m planning to finish the building system by adding more features, including a snap-in-place system to make building smoother and more intuitive. I’ll also start working on visuals soon, since everything is still pretty basic at the moment. Hope you enjoy it :)"}, {"post_id": 33633, "ts": "2026-07-23T18:25:19Z", "hours": 9.3525, "text": "I’m working on my first project in JavaScript. It’s going to be a small space simulator. I didn’t get much done in the first 10 hours, but so far I’ve created a build menu where you can choose, scroll, and select parts (though there are no images yet). That’s it for now, but more will come, and the graphics are far from finished :)"}]...
|
Title: STELLA by @Loibo_2 | Stardance
Devlogs:
I’ Title: STELLA by @Loibo_2 | Stardance
Devlogs:
I’m working on my first project in JavaScript. It’s going to be a small space simulator. I didn’t get much done in the first 10 hours, but so far I’ve created a build menu where you can choose, scroll, and select parts (though there are no images yet). That’s it for now, but more will come, and the graphics are far from finished :)
In the last 9 hours, I made some really good progress on the building system of my space game. A big part of the work was figuring out how to properly store all the data of the individual pieces in arrays, and how to link them together so they can form larger structures. This turned out to be more challenging than expected, especially when trying to keep everything flexible and organized. I also spent some time improving the overall logic behind placimg parts, so it feels more consistent. There’s still a lot to do, but the core system is starting to come together now. Next, I’m planning to finish the building system by adding more features, including a snap-in-place system to make building smoother and more intuitive. I’ll also start working on visuals soon, since everything is still pretty basic at the moment. Hope you enjoy it :)
Puhhh finally did it. Took a lot of time, but here it the working Snap System :)
Sooooo, new update :D I did a lot of work on the system for how parts are stored and the overlap detection. I also worked on detecting, when two different rockets are connectet (though that part isn´t finished yet). This took and still will tage a lot of work. Dx In the video, you can see the new detection system. It uses points stored in a array to draw a “hitbox” around each object. The last thing I improved was how teh parts are rendered on screen. I´m now useing a function that efficently calculates the correct coordinates. Next, I´ll try to further improve the code, remove as many unnecessary lines as possible, and finally design some new txtuers and parts. Hope you like it :)
Finished the overlap system today and also a few new parts. :)
Did some progress on the menu and added some new parts :) Also a lot of debugging…
Lots of small technical things fixed. New detection System for different parts and a new mode for building tanks. Also some new textures, because 58 is not divisible by 4… Next update probabyl gonna be big :)
Sadly didn´t get much done :/ I had way to much debugging and couldn´t really find teh errors. But I will trying to fix it :) The Idea is to have large empty structual components where you can deside what to put into them. right now there are only two types of tanks (oxigen and liquid propellant) but more will come, like hydrogen, helium and other stuff like batteries or life support system.
Omg i did it… took way to much work and isn´t 100% done, but now it´s just fixing some points and remaking some texures :) Next things to do are: Fix the engines More Parts and inner tanks Smaller Tanks and parts Part moving system
Finished a major part of the building system: you can now select and drag parts or entire structures. I had some trouble figuring out how to store each part so I could identify all parts below it. Also fixed: the rendering of the build menu some big array structures Hope you like it :)
New devlog :) It´s not much to look at, but got a lot of thinks working: added a new file structure to change the sceen to other modes like the main menu createt 7 new files for all the different modes and structure and state files hours of debugging… those canva lines are not easy That´s all for now, hope you like it :)
New Devlog :D Right now it doesn´t look like much, but this is the technique I´m going to use to rander planets. The idea is that if you´re close enough, every planet or moon looks flat on the surface. So instead of rendering a full sqhere, i´m using an finite strip with a thousends of pixels. Each pixel gets his height trough a seed, so it should look the exact same everytime. This way, I dont have to bend pixels and can stay with the pixelized look. Hope you like it :)
Small devlog :D Added the rocket to the actual game. No physics or collision yet, but that will be my next task. Also addet weight to every part. The yellow rect is the center of mass. Hope you like it :)
Devlog time :D Worked on the map menu. It does not look like much but the smaller circle is in an orbit around the big one. Not in the right scale and far from beeing realstic, but i´m getting there. Hope i can finish it soon :)
New develog :D Worked a lot on the map viewof my space game. Features addet: Improved the view of the planet and the sun. In this example, I used the proportions of the sun and mars. Addet a button to switch the currect object the camera ist locked onto. Addet a line that shows the orbit of each object, but it´s not finished yet.. the closer you are, the more wobbly it get´s. Changed the color of the locked objct. Hope you like it :)
Devlog time :D Worked on a lot of thinks: The new timewarp system. It is not completly done and 1x is not the real time right now. You can now click and still follow the same object while beeing in the map view. Improved the orbit lines. (not as wobbly as before) Tried to fix the build menu… and failed. It´s now worse then before urgh. For the next devlog the menu issues will hopefully be fixed. Hope you like it :)
Devlog time :D It´s not completly done but her is the first version of the pyhsics part. Right now there is no atmosphere or a solid ground, but it is something and it took way to long, especially calculating some of the turning math. The craft is turned with ‘E’ and ‘Q’ and turns around the command pod wich is the onle part that can turn right now. And I still haven´t fixed the build menu. I also noticed that the parts placed in the ame now look off and I don´t know why. Hope you like it :)
New Devlog :D First of all, this took bit longer because I had to switch on my androit tablet… I got visual studio code running bey installing termux and running it via an ubuntu extension. Worked a lot on the physics system. It now has collision and uses the exact same code for calculating the planet height. The rocket can´t go blow the ground height. It´s not perfect but okay. Some problems are still present, especially with falling over and beeing to slippery. Still good progress. Hope you like it :)
New Develog I never thought that terrain generation would be that hard Dx. I tried to generate the map pixel by pixel using a custom seed and many differt parameters. For now, I got a simple biome system working, but it still doesn´t looks quiet right. The biomes are stored in an array with a few parameters like height, roughness and the chances of craters, etc. This workes kinda okay, but the normal tarrein is not in a good shape right now. I will try to work on that and get a more realistic landscape. Also, I want to make a better system to randomly place craters, rocks and other stuff. Hope you like it :)
Devlog time :D Last time, I showed a terrain geration system where the main factor was different biomes that were more or less hardcoded. - I scrubbed all of that and startet over. The new system is based on a simplex/perlin noise with a 8 layers of octaves. This took so long and i still don´t fully understand the code i put together using different websites. The noise generates random height nosies that are a few pixels apart and the rest is calculatet in between. next I added the biome overlay. Right now it´s just a prototype, but it uses the same noise technique with the pixels spaced further apart and gives each sector a random color. The problem right now is that everything is roughly the same height and the biomes are way to small and with way to clean fades between them. I will keep working on the terrain sytsem. Hope you like it :)
New Devlog :D Did sooooo much work on the terrain system… For the most part , I looked online for some code snippets and tried to get them working with javascript. In the previous devlog, I showed the different colors for the biome system. I build around that, so each biome has it´s different amount of octaves, roughness and amplitude. Roughness in this case just says how smooth the different Simplex noise points should be between each other. This worked fine until you zoomed out. Especially in mointain areas, the waves from the sin and cos funtions were noticeable. So i tried a few things… Using a warp funtion to stretch high waves Terracing points, which wee a complety failure Stacking more functions on top of each other But everyting had its ownsides and nothing worekd fine… While trying those things, I wrote somecode that now lts you zoom out as far as you want by removing more and more lines so it doesn´t get laggy. Right now it looks terrible, but i have a final idea. For evey point above a given threshold, I´m gonna randomly choose two points and randomly flatten everything bewteen them. If you have any ideas how to get better terrain, please write it down in the comments. Hope you like it :)
New Devlog :D I´m not completely done with the terrain system, but i´m gonna stop working on it for now. It looks okay, until you zoom out to far and I´m not really making any progress anymore. Right now, it uses a simplex Noise with some other noise types in layers on top, aswell as some plateu logic and corosion. Also a biome system, that is in a okay shape right now, wich gives each section a unique color. Next i will focus more on thinks like physic, propulsion and the map. Hope you like it :)
New Devlog :D Addet soooo much new stuff. Some features were really big, and I didn´t have the motivation to finish them completely, so a few thinks are a bit buggy right now. New stuff: Biggest point: Fixed the physics system. Before the fix, all rockets were just spinning around when sitting on a slope. They also glitched into the gorund or just fell in infinitly. Now both probles are fixed. The first one by using a point system to determie if the rocket is on a slope and should slide, as well as a lever arm that uses the mass to rotate the craft. For the second problem, I introduced a new outline system that now uses a convex hull. The only problem is that parts like the engine aren´t drawn accurately. Sooo thats one think i need to fix. New 0x time warp to stop the whole think and get a closer look. The planet now has its actural terrain height when viewed p close, instead of just beeing a cricle. It is terrabil right now and only a fist try. A new marker to show, where the rocket is on the map. Thinks to do next: Fix the convex hull New system for when the planet is viewed up close in the map view Fix everything in the map view around the planet Hope you like it :)
New Devlog :D Puhhh, another big one. Most of the time, I spent trying to somehow turn the flat map of the game into a sphere. This took sooooo long, and it still isn’t quite right. I don’t know why, but the terrain isn’t fully the same. Also, the rocket is now a dot on the map that shows its coordinates. It also has a simple orbit line and can be centered. The planet now has the correct dimensions and radius, based on the other values. A big problem I had was that the 32-bit values were too small for the scale at which the pixels were being rendered. Hope you like it :)
New Devlog :D Spend most of the time working on the new system to show the orbital lines. The first step was to add a Sphere of Influence (SOI), so the rocket isn´t pulled constantly by two or more bodies at the same time. Next I somehow got the pysics to work so that the orbit line stops when it would enter a SOI. It´s very buggy right now, though. The white orbit is sometimes glitching, and after entering the SOI the rocket just gets teleportet to the ground. Also addet two markers to show the Apogee and the Periapsis. I will keep working on it, because this is such an importent feature. Hope you like it
New Devlog :D The first thing I did was to remove the orbit line system. I noticed that it was full of bugs, and the different x, y, vx and vy values in the map, the game and depending on whether the rocket was in the planet´s orthe sun´s sphere of influence were becoming to complicated. SO i scrapped thewhole system. Then i stated over by deleting everything related too physics from the maps code and moving it into the games physics code. After that, I divided the pysics system into muliple sections: physics on the ground, in the air, in an orbit around the planet and in an orbit aroun the sun. By doing this, I can get better results for each part of the game and make the system easier to manage. I also added a new function, and now the rocket accelerates whn pressing W. For the next devlog, I´ll try to get at least some parts of the orbit system working so I can move on to another part of the game. Hope you like it
New Devlog :D OMG I did it. The orbit line rendering is finally done, and it took sooo much debbugging. I spend most of the time converting the map coordinates to the planet coordinates, that are used in the physics system. I also had soo many small issues, like missing minus signs or just bad or old weird code that was causing problems. But now it is mostly working. The only think that still needs fixing is the transistion when going above 120km in altitude. Once that and a few other small things are fixed, most of the physics stuff should be finisched. I also got the time warp working in the planet view so that isn´t a problem anymore. The current max is x10 below 120km and x100 below 600km. Hope you like it :)
Sadly, I didn’t get much done this time :/ I did sooo much debugging on the physics system, but nothing was really working. I had so many issues with acceleration, different systems using different values, and multiple problems with ground detection. So I started all over again… Right now, I’ve removed all the physics and ground collision parts from the code, and I’ll try again. This time, I want to use one variable for each value and build an improved and more realistic engine instead of just guessing values and parameters. I also drew a few new parts. Hope you like it (:
New Devlog :D I’m finally getting somewhere! After a lot of fixing and debugging, I now have an orbit line system that doesn’t behave weirdly when the time is set to a high value. I can now also project escape trajectories, elliptical orbits, and more. The next few things I want to work on are SOIs and collisions with them, as well as some other things like multiple planets, moons, and more rockets. Hope you like it
New Devlog :D It’s finally almost done… a working orbit system. I had sooo many problems with the different velocities, coordinates, and a lot of other things. But now it’s finally starting to look like something. Of course, it’s not perfect right now and still needs some adjustments, but the basic principle is done. For the next devlog, I’ll try to polish it and fully complete the system. I also want to give it a better look with some custom graphics and add a few more orbit lines without making it too laggy. Hope you like it :)...
|
1791825926.2448518
|
1792689926.2448518
|
|
25673
|
Observatory by @Gerafftes | Stardance
|
Gerafftes
|
0
|
264.57
|
0
|
[]
|
[{"post_id": 80706, "ts": "202 [{"post_id": 80706, "ts": "2026-10-18T15:55:28Z", "hours": 10.1042, "text": "DEVLOG #42 RX3 and RX4 have passed their individual checks on the latest firmware. A complete OTA update, the LED pattern test and ten minutes of stability monitoring each, with no errors recorded. The false SOS warning on RX1 is also fixed and verified on the board now. I corrected concurrent access in the shared UDP sender and transport statistics, too. Those are real software fixes, but I still can’t claim they explain the original RX3 heap corruption or watchdog resets. I also improved CAD profile handling. Profiles can use a separate store, the UI shows which revision is loaded, and refreshing no longer overwrites unsaved edits or brings back an older saved version. The rollout isn’t finished, though. The next RX1 update stopped because its device identity couldn’t be confirmed, so RX2’s update to this latest version hasn’t started either. Next: resolve that binding, finish updating RX1 and RX2, then move on to the actual two-way peer comparison. Tracking acceptance is still open."}, {"post_id": 80452, "ts": "2026-10-17T17:48:17Z", "hours": 9.9825, "text": "DEVLOG #41 RX1 finally passed a full three-minute TX1→RX1 test. 6,407 qualified CSI frames, around 35.6 per second, and all 173 measurement windows passed. The firmware had been rejecting our setup because TX1 is also the Wi-Fi access point. That’s corrected and installed now. SOS is the warning for missing or stale usable CSI from TX1. It doesn’t automatically mean the board is broken. Ironically, the warning itself had a bug, RX1 reported stale data even though a matching frame had arrived just 8.7 milliseconds earlier. A timing race between the LED task and CSI reception caused the false alarm. The fix is built and tested offline, but isn’t installed yet. Host startup and recording also work now. RX2 is still a problem, though: its upload timed out while CSI kept arriving, and the cause isn’t confirmed. Next: install and verify the LED fix on RX1 before continuing with the other receivers. The actual two-way peer comparison and tracking acceptance are still open."}, {"post_id": 80208, "ts": "2026-10-16T19:06:18Z", "hours": 10.01, "text": "DEVLOG #40 I cut the recording footprint from 4.54 to 2.67 GB in the full synthetic test, about 41% less. The saving comes mainly from removing duplicate exports, not throwing away raw data or evidence. I also corrected timing and CSI rate-limit bugs offline, plus a cleanup issue that could prevent the recorder from stopping its own processes when disk space got tight. The frustrating part is that the peer comparison still hasn’t recorded anything. One attempt stopped on the timing bug, after that was fixed, the next hit a missing signing key during host startup. No peer firmware was uploaded and no capture started in either attempt. Next: fix host startup and prepare a separate 35-minute pilot. The actual peer comparison and tracking acceptance are still open."}, {"post_id": 79987, "ts": "2026-10-15T19:13:06Z", "hours": 10.2558, "text": "DEVLOG #39 All four receivers finally made it through a full 30-minute CSI run together. RX1, RX3 and RX4 are now on C1, while RX2 stays on C. Each delivered around 17–20 matching frames per second, and 99.61% of the shared measurement windows passed the CSI checks. The RX1↔RX4 peer firmware and recording workflow are also implemented and tested offline now. The actual radio comparison hasn’t happened yet, so I still don’t know whether those extra links will improve positioning. One annoying bug kept rejecting good data after a 128→64→128 format change. That’s fixed in the offline analysis, along with separate format rules for TX1 and peer links and a recorder completion check. I also added RX and radar exports that keep raw data, timing and recording boundaries together. That path works in offline tests; it isn’t a new live hardware result. Next: check both mmWave sensors individually and then together at known points. The shared CSI run is a milestone, but tracking and full-system acceptance are still open."}, {"post_id": 79381, "ts": "2026-10-13T18:55:19Z", "hours": 9.4147, "text": "DEVLOG #38 RX2 is finally delivering a lot more matching CSI data. After installing the new firmware, the rate went from about 1.9 to 31.9 frames per second. A longer, half-hour capture averaged around 30. The firmware now fixes Wi-Fi bandwidth at 20 MHz and guards against invalid CSI callbacks. One annoying catch: the long capture only recorded RX2 because some device endpoints were outdated or mixed up. I’ve prepared a stricter preflight so an incomplete group can’t silently become a four-receiver test again. I also corrected the offline window analysis. A valid frame with a different format no longer ruins an entire otherwise usable window. The UI code now separates format exclusions from unexplained sequence gaps instead of calling everything “loss”. The host fixes are tested locally, but aren’t active on the running server yet. Next: complete a proper simultaneous four-RX capture, then implement the RX1 <-> RX4 peer profile for testing. Tracking and full-system acceptance are still open."}, {"post_id": 78806, "ts": "2026-10-11T17:42:21Z", "hours": 9.8042, "text": "DEVLOG #37 I narrowed down the RX2 and mmWave2 issues from the failed run. Still no hardware fix, but the picture is getting clearer. The surprising part is that RX2 was still sending valid CSI packets during its apparent dropout. They just weren’t the 128-subcarrier frames the current evaluation needs. mmWave2, on the other hand, really did have gaps in packets reaching the host. I’m looking into its send-and-acknowledgement path, but haven’t proven the cause yet. I also found a parser mistake. A supposedly damaged RX packet was actually a valid warning message. That’s corrected in the isolated diagnostic tools, which now also distinguish device timeouts from requests the collector skipped or cancelled. New diagnostic firmware candidates for TX1, RX2 and mmWave2 are built locally to help trace where things stop moving. They aren’t installed yet, and the TX send errors are still unresolved. The UI is less misleading now, too: an ESP being reachable doesn’t mean radar data is arriving, and old readings no longer keep disconnected devices looking active. Next: review the diagnostic candidates, then use a short, controlled hardware run to investigate the remaining errors. The last full acceptance is still a FAIL."}, {"post_id": 78171, "ts": "2026-10-09T21:04:22Z", "hours": 9.5261, "text": "DEVLOG #36 The first full TX1 acceptance run is done now and it failed, but at least I finally have a much clearer picture of what is still going wrong… The common setup passed: all seven expected participants were visible, and 22 complete snapshots kept the shared basis valid for more than 20 seconds. Then Scope A ran its three 120-second windows. All three failed. There were 14 new TX send errors, and the diagnostic counters placed them in the wifi_handoff ENOMEM stage. That tells me where the error was recorded, but not yet why it happens or whether it is fixed. MMWAVE2 also became stale in parts of the run, and several RX requests were missing, so none of the historical comparisons could count as a valid PASS. Scope B stopped itself at the safety gate when the source binding became inconsistent and RX2 was already 5.044 seconds old. This is frustrating, but the guard did exactly what it was supposed to do, it refused to turn an incomplete 120-second window into a result. Next: decide how to continue the ENOMEM and source-binding issues before starting another acceptance run."}, {"post_id": 77864, "ts": "2026-10-08T16:16:06Z", "hours": 10.1556, "text": "DEVLOG #35 I fixed two concrete TX1 firmware bugs. An authentication check that ran too late and an HTTP task with too little stack space. The status endpoint could lose the request headers before checking authorization. I moved that check ahead of the response. I also increased the HTTP task’s stack from 4 KB to 8 KB after confirming that some call paths could exceed the old limit. Two independent builds matched byte for byte. After taking fresh backups, I installed the candidate and verified the complete 16 MiB flash against the expected image. That part passed. The UDP/ENOMEM errors are not yet proven fixed. Next: investigate the reset path, complete a clean controlled boot, then check the matching server setup, authentication, all participants, and the measurement windows."}, {"post_id": 77133, "ts": "2026-10-05T19:02:41Z", "hours": 10.1275, "text": "DEVLOG #34 The TX1 migration is now 100% verified , but the project is still only around ≈ 70% complete. The third and final boot attempt did not give me the clean result I was hoping for. Recovery happened within the allowed time, but UART0 showed two app starts. After the first start, an RTC_SW_CPU_RST appeared and the app started again. It eventually reached BOOT_OK , but because of the duplicate start I still cannot accept the boot trace or move on to server activation and measurements. I am currently documenting the exact restart sequence and trying to figure out what caused it. I also put together a source collection about Wi-Fi sensing and RF-based person detection. GitHub The separate mmWave freshness test did not reproduce the old MMWAVE2 delay problem, but that does not prove it is fixed. Next: get one clean TX1 boot, then activate the server and start collecting real measurements."}, {"post_id": 76667, "ts": "2026-10-04T09:40:44Z", "hours": 10.0744, "text": "DEVLOG #33 The TX1 finally made it all the way to BOOT_OK . After the CHECK_COUNTRY problem from the last update, the new candidate passed the Country20/Power44 and Wi-Fi checks, booted into test mode, and passed the local TX/RX4 checks. I also confirmed the amber LED and both mmWave transport paths. The previous candidate had stopped because one sampling gap grew to 10.2 seconds. I traced that back to the timing bookkeeping and changed the sampler to schedule from the last real sample completion. The corrected run stayed within the sampling limits. That is a real improvement, but it is not the final acceptance yet. The full coverage result is still blocked by the clock-binding requirement, and the radar window only showed no_target , not a position result. I also switched to the new diagnostic server in a controlled run. It stayed ready and a separate 61-second capture passed the coverage gate, but the active CSI position setup is still missing, so this does not count as a complete TX-7B or system pass. The CAD UI got a pretty big upgrade too. MMWAVE1 and MMWAVE2 can now be edited as separate sensors with their own colors, 6 m fields of view, direction arrows, and yaw handles. I added a button to aim them at each other, plus a wall-angle tool that draws the real beam/wall intersection and lets me set the angle directly. Marker labels also move out of the way automatically, and the snap setting survives a refresh. Next: fix the remaining coverage and clock evidence, activate the sealed CAD/CSI setup, and complete the full TX-7B validation."}, {"post_id": 76233, "ts": "2026-10-02T19:45:23Z", "hours": 10.1567, "text": "DEVLOG #32 I still do not really have a final result to show, but it has been another ten hours, so I did not want to skip the devlog. The latest TX1 boot attempt did at least narrow things down. The new firmware now passes the Wi-Fi channel checks: channel 6, HT40 with the secondary channel below, AP-only mode, and the other radio checks all matched the expected profile. It then stops at CHECK_COUNTRY , before reaching BOOT_OK . The TX1 migration is therefore still not accepted, but the failure is much more specific now. The confusing part is that the Wi-Fi power values do not line up cleanly. The country structure reports a different power field than expected, while the separate power API returns the expected value. This may be an SDK representation or comparison issue rather than a real transmit-power problem, but there is not enough evidence to call it fixed yet. I also corrected related checks for the country bytes, SSID representation, and status getters, and prepared another reproducible candidate offline. With the move to Python 3.15, I also added the new lazy-import implementation. The official Python documentation describes the new syntax. Eligible imports now use explicit lazy import and lazy from syntax, with a local verifier to keep the behavior consistent. After the failed candidate boot, I restored the original 16 MiB image and verified the return path. The historical firmware is running again, and RX4 plus both mmWave sensors are sending data. Next: resolve the country/power comparison, then attempt the candidate boot again under the existing safety gates."}, {"post_id": 74540, "ts": "2026-09-27T16:25:38Z", "hours": 9.8731, "text": "DEVLOG #31 The mmWave2 connection problem is finally understood. It was caused by a reproducible dependency on the WLAN transmit power: at around 19.5 dBm, the ESP kept running and received probe requests, but its test AP could not be found and connections failed. At 10 dBm, the AP worked immediately, csi-test connected again, and 360/360 pings succeeded without a disconnect. Raising the limit reproduced the issue, confirming the dependency. Both mmWave sensors now work reliably. The TX1 migration is also complete. I verified the candidate firmware and baseline, created two identical 16 MiB backups. The new app was written to app1 together with the NVS merge and OTA selection. A complete readback of all 16,777,216 bytes matched the expected flash image exactly. Next: Boot the candidate under the existing safety gates, check that TX1 comes up properly, and run the full comparison."}, {"post_id": 74078, "ts": "2026-09-26T17:07:07Z", "hours": 9.0633, "text": "DEVLOG #30 The replacement ESP for mmWave2 is now soldered and mounted on the previously working breadboard setup. The connection problem has not disappeared, however WiFi still fails, so I uploaded a minimal WiFi test script to isolate the radio and network path before testing the radar or UDP transport. The mmWave firmware now distinguishes MMWAVE1 and MMWAVE2 with separate build and upload paths, uses 55010 as the default UDP port, and logs the WiFi disconnect reason. These changes are prepared locally; the test image is not yet a confirmed fix, and the complete mmWave2 path is still unvalidated. In parallel, the TX1 replacement reached a stronger local checkpoint. Reproducible builds from fresh and isolated source copies are byte-identical, and the local test suite passed. The 7A TX1/RX4 baseline still produced no usable measurement data, so the migration remains blocked and 7B is NO-GO . Next: resolve the WiFi connection on the replacement ESP, verify mmWave2 communication, and continue with two-sensor validation and RX3 calibration."}, {"post_id": 73272, "ts": "2026-09-24T18:35:00Z", "hours": 7.6919, "text": "DEVLOG #29 The local RX work has expanded, but the two-sensor setup is currently blocked by a connection problem with mmWave2. RX-04 to RX-12 add bounded capture and queue handling, stale-frame rejection, corrected CSI parsing, clearer UDP/server counters, and timing and synchronization metadata. The firmware host tests, standard and raw ESP32-S3 builds, and targeted server checks pass. These are still software and build results. No live RX measurement has yet proven lower frame loss or data age. :( The 3D-printed part now fits. While investigating the mmWave2 connection, I tried to desolder its ESP, but it could not be removed cleanly. Since the connection problem is not resolved, I ordered a replacement ESP, a new mmWave sensor, and an FH/Fenghua 1206X106K160NT SMD component. The exact cause is still open, and the replacement parts have not been installed or tested yet. The existing TX1 replacement also remains locally tested but unflashed. Next: rebuild mmWave2 with the replacement parts, identify the connection fault, validate both sensor paths, and continue with RX3 calibration."}, {"post_id": 72260, "ts": "2026-09-22T15:24:39Z", "hours": 10.1567, "text": "DEVLOG #28 I prepared and locally verified an ESP-IDF replacement candidate for TX1. The firmware builds successfully, and the host-side checks for packet handling, scheduling, boot/OTA variants, and negative compile guards pass. This is still a software-only result. Nothing has been flashed, and TX1 has not been validated on hardware. Before replacing the existing TX1, the old TX1/RX4 baseline and network pre-check must still be completed. I also tightened the RX data path. Incoming frames are now checked for valid input and correct TX binding before passing through one jitter-tolerant 20 ms admission gate. Invalid or foreign frames no longer consume the timing budget. Callback, queue, UDP, and server-side counters are tracked separately, making it possible to see where loss or delay occurs. The deterministic fixtures and local ESP32-S3 build pass, but no live RX measurement has yet shown an actual reduction in frame loss or data age. The new 3D print exposed a mechanical error: it is approximately 1 mm too small and does not fit. It needs to be adjusted and printed again. Next: complete the read-only TX1/RX4 baseline, adjust and reprint the part, then continue with RX3 calibration and validation of both mmWave sensor paths."}, {"post_id": 71302, "ts": "2026-09-20T16:26:13Z", "hours": 9.9056, "text": "DEVLOG #27 I soldered a second PCB from revision 3, making the hardware for two mmWave sensors available. The software now keeps MMWAVE1 and MMWAVE2 separate through stable node identities and independent sequence, transform, and calibration state. The mmWave transport also crossed an important milestone. Because best-effort UDP was not enough, firmware 0.1.6 now uses ACK-based retransmission. In a controlled 60-second comparison, sequence loss reached 0.00% and the radar_sequence_loss_free gate passed, compared with 0.70% loss and 84 full ACK timeouts on firmware 0.1.5. The Tauri desktop shell has been replaced in the active build by a loopback control helper for discovery, provisioning, flashing, OTA, and WASM. I also created a new 3D-print file, which is currently being printed; the mechanical result is not finished yet. Next: validate both sensor paths together, resolve the RX3 Phase 1 offset, and repeat the full radar preflight."}, {"post_id": 70187, "ts": "2026-09-18T17:19:24Z", "hours": 5.8228, "text": "DEVLOG #26 I have completed, soldered, and tested the third and hopefully final PCB revision. Everything works, but the ground plane made soldering significantly more difficult than expected. Even with thermal reliefs around the solder pads, the plane acted like a heat sink, dissipating heat across the entire board. The shift to a browser-centric approach is progressing: the Tauri desktop app and its associated release pipeline are being removed, while hardware control is being moved to a standalone “loopback crate.” This crate handles tasks such as device discovery, serial access, provisioning, flashing, OTA updates, and WASM integration. This work is currently ongoing. The server now protects the /api/field and /ws/field endpoints using Bearer authentication and keeps auto mode offline until real data is available. An explicit simulated source is required for simulation. mmWave transmission has been improved but still exhibits a sequence loss rate of 13.1%, causing the radar preflight to remain blocked. The causes of the remaining loss still need to be investigated, particularly regarding channel conditions, the startup process/ARP, and Wi-Fi airtime and scheduling. The calibration offset for “Phase 1” on RX3 also remains unresolved. Next steps: fixing the RX3 offset, completing the migration to the browser/control setup, and re-running the radar preflight."}, {"post_id": 69194, "ts": "2026-09-16T15:53:57Z", "hours": 9.0253, "text": "DEVLOG #25 I measured and optimized the mmWave UDP transport, but the radar path still fails the lossless-transmission test (image 1) . The new firmware and server path use one UDP copy without artificial delay, disable Wi-Fi power saving on the mains-powered node, persist the collector target and CAD transform, and separate socket reads from processing. Reordering, sequence validation, deduplication, and rolling metrics expose failures instead of hiding them. Across three 60-second runs, unique arrivals improved by 11.2%, sequence loss fell from 20.6% to 13.1%, duplicates dropped to zero, and arrival P95 improved by 27.8%. Two copies did not reduce loss and only added duplicates, so one copy remains the default. The transport is better, but not lossless: 13.1% sequence loss still blocks the radar preflight. The 50 ms interval is not the bottleneck; LD2450 frames arrive in bursts and the bridge emits about 2.64 measurements per second, not 20 independent frames per second. Next I will investigate RSSI and channel conditions, ARP and startup behaviour, Wi-Fi retries and airtime, and packet scheduling. RX/CSI stayed offline, so this is not a full Wi-Fi validation. The server refactor from DEVLOG #24 is now integrated: routes, state, runtime, calibration, recording, model, and system responsibilities moved out of main.rs , with active, legacy, and unavailable-training contracts separated. Desktop-interface removal remains in progress. Hardware-control modules are moving to a standalone control crate, while loopback-only browser server controls with origin checks are being added. Phase 1 calibration is also getting a longer measurement window and persisted evidence. RX3 currently lands roughly two to three metres from its expected fixed point. I will not consider the calibration valid until the transform, profile binding, or target association causing this offset is understood and corrected. Next: resolve the RX3 Phase 1 offset (seen in image 2) , then repeat the full fixed-point calibration and re-verify the radar preflight."}, {"post_id": 66738, "ts": "2026-09-12T17:07:38Z", "hours": 7.1744, "text": "DEVLOG #24 I strengthened security for live-sensor operation and started aligning the Observatory UI with backend functionality that actually exists. Live WebSockets now require Bearer authentication along with strict Origin and Host checks. Browser and Python clients no longer send tokens in the URL. Regression tests cover missing, invalid, and duplicate requests as well as cross-origin access. The complete CAD geometry document is now persisted in SQLite and survives a server restart. Another issue was in the browser catalog: it listed routes that the active Rust server did not provide. I am separating active routes from legacy compatibility routes, adding the missing model-details contract, and returning unavailable or HTTP 501 when browser-triggered training is not available instead of falsely reporting that it started. Next: finish and commit the route extraction, then repeat the live mmWave preflight, including calibration."}, {"post_id": 62834, "ts": "2026-09-06T11:19:03Z", "hours": 4.7731, "text": "DEVLOG #23 The issue encountered during initial startup was a design error: the LD2450 had been mounted rotated by 180°. The UART routing itself was correct. After rotating the sensor and reflashing the ESP32-C3, everything worked again, though the physical setup doesn’t look very tidy. I designed PCB-03 based on PCB-02. The LD2450 connector and its wiring have been rotated by 180°. Everything else remains unchanged. I also added ground planes. Until the PCB arrives, the breadboard setup will continue to serve as a temporary mmWave configuration. Next steps: order PCB-03, mount the LD2450 in the marked orientation, and repeat the live radar verification. Continue using the breadboard setup until delivery."}, {"post_id": 61621, "ts": "2026-09-04T16:40:26Z", "hours": 6.7853, "text": "DEVLOG #22 I fixed the last browser security gap found in the local security review: a page on one local port can no longer reach an unauthenticated service on another local port by default. The review contained 13 entries. Entries 8 and 11, and entries 12 and 13, were duplicates, leaving 11 unique findings. The old check trusted the hostname alone, so every localhost port was accepted. I separated browser Origin validation from the existing Host /DNS-rebinding protection. WebSockets and state-changing /api/v1/* requests now require an exact scheme, host, and port. By default, only http://localhost:<http_port> , http://127.0.0.1:<http_port> , and http://[::1]:<http_port> are allowed. Repeatable --allowed-origin values or the comma-separated SENSING_ALLOWED_ORIGINS variable explicitly replace these defaults. Host-only values, wildcards, null , paths, userinfo, and invalid ports are rejected. The protection covers /ws/* and /api/v1/stream/pose on both the HTTP and dedicated WebSocket ports. CLI clients without an Origin header remain compatible. The regression test now returns 403 for an unlisted cross-port UI, while an explicitly allowlisted cross-port UI still works. All 24/24 Origin/Host tests, 471 sensing-server tests ( 1 ignored), HomeCore server/API/auth/WebSocket tests ( 18 + 18 + 6 + 5 ), and 7 Python/firmware security-boundary tests passed. Binary checks, targeted rustfmt, and git diff --check also passed. No flash or OTA action was performed. The ESP-IDF v5.4 build matrix is still inconclusive: the native ARM64 image is missing a containerd layer, while the AMD64 fallback crashes in the emulated Xtensa compiler inside MbedTLS. I therefore do not count the three firmware builds as passed. Next: Solder PCB-02 first, then mount the mmWave sensor in the corner."}, {"post_id": 58478, "ts": "2026-08-30T21:57:05Z", "hours": 2.7247, "text": "DEVLOG #21 The 65-second empty-room calibration failed before it could collect a usable baseline. The UI showed Samples 0 when I returned, so no calibration ID or context hash was created. The failure exposed a design problem in the run itself. A recoverable outside-room radar target could stop the entire measurement. I’m changing the workflow so the run always reaches its configured end and evaluates the evidence afterwards. The final report will mark it valid or invalid with concrete reasons instead of hiding the failure behind an early stop. This behavior change is planned, but not yet implemented or validated. No successful calibration, restored baseline, 10/10 acceptance, position index, guided room walk, or blind-test result is claimed. Next: implement and test the non-interrupting run plus the post-run validity report"}, {"post_id": 57699, "ts": "2026-08-29T22:49:17Z", "hours": 5.3125, "text": "DEVLOG #20 Today I finally found why the four RX streams kept disagreeing: the server was fusing packets from different transmitter moments. The old path had already reached 98,126 engine errors with a timestamp spread of about 710 ms . The first timing fix exposed the deeper problem. The server was simply taking the latest packet from each receiver, even when those packets did not belong to the same event. I replaced that with bounded per-RX queues and approximate-time matching. The existing 60 ms guard stays fail-closed, so an incoherent quartet is discarded instead of becoming a fake D6 input. The new tests cover packet loss, reboots, sequence wrap, clock jumps, queue matching, and host-time fallback. 484/485 tests passed in the sandbox,. Next: restart the server and verify a stable, error-free 25-second preflight. But for now, time to sleep."}, {"post_id": 56909, "ts": "2026-08-28T22:30:41Z", "hours": 4.6578, "text": "DEVLOG #19 I activated the new mmWave firmware and got the live 25-second preflight to pass once, but the first empty-room recording did not complete. The main work was hardening the transport: the firmware now sends redundant radar packets, while the server handles reordering, duplicates, short CSI gaps, and recent diagnostics instead of relying on cumulative counters. The UI also gained a controlled empty-room countdown. The remaining failure is intermittent: the sensor stays online and reports no local UDP send errors, but the server still recorded packets_lost=10 and packets_rejected=324 . The empty-room capture lasted only 4.8 s for radar and 5.1 s for CSI, so it is not a valid calibration reference. No calibration, training, or blind position result is claimed yet. Next: expose the exact reject reason and sequence-gap timing, fix the remaining transport problem, and repeat the complete empty-room measurement."}, {"post_id": 56202, "ts": "2026-08-27T21:07:33Z", "hours": 3.7439, "text": "DEVLOG #18 Since the LD2450 first worked, I connected TX, RX1–RX4, and Wi-Fi, positioned the sensor, sealed setup-v2 , and added a calibration preparation phase with a countdown and a minimum duration of 60 seconds . The real hardware UI is running on port 8080 ; port 3002 still shows the simulation. I started the workflow, but it currently stops at step 4, the empty-room Wi-Fi baseline , because radar packets are being lost. I improved server-side packet sorting and built a new 10 Hz firmware. The OTA update started, but the device still boots the old firmware from ota_0 at about 20.6 Hz . The sensor is online, but calibration is not ready. 63 UI tests pass; one Rust test mismatch remains. No real D6 calibration or blind validation has been completed yet. Next: activate the 10 Hz firmware, resolve the packet-loss blocker, and rerun the preflight and empty-room baseline."}, {"post_id": 55631, "ts": "2026-08-27T16:22:32Z", "hours": 3.55, "text": "DEVLOG #17 I finally verified the complete breadboard mmWave data path with the HLK-LD2450. After flashing the known firmware to a new ESP32-C3, it joined csi-test , received 192.168.4.2 , and exposed /ota/status on port 8032 . The status confirmed the expected UART mapping: GPIO20 RX, GPIO21 TX, and 256000 baud in calibration mode. The important test was a read-only UDP capture: 224 valid LD2450 datagrams in 20 seconds, followed by 222 more while the setup was powered only from the normal power supply. Every packet matched ruview.mmwave.ld2450.v1 and contained a recognized target. This proves that the breadboard wiring, UART parser, ESP Wi-Fi connection, and UDP transport work together. The reported coordinates are still sensor-frame data, not a validated room position. The permanent PCB-02 is still pending. Next I will validate the radar transform with known room marks, connect the CSI receivers, and continue with D6 calibration, training, blind tests, and the quality gates."}, {"post_id": 54003, "ts": "2026-08-24T18:57:34Z", "hours": 1.6292, "text": "DEVLOG #16 The ESP was not the problem After the original PCB failed during WLAN authentication, I redesigned the mmWave carrier as PCB-02 and isolated the ESP to find the real cause. PCB-02 replaces the too-small ESP contact pads with proper through-hole header rows, keeps the case-compatible outline, protects the antenna area, and retains the SMD capacitors. The routing and electrical checks passed, and the Gerbers are ready to order. The important experiment came next. I unsoldered the suspect ESP from the old PCB and powered it by itself. It joined csi-test , answered every ping, and returned HTTP 200 from /ota/status . A second ESP did exactly the same without any PCB attached. This was the key finding: both ESPs work outside the PCB. The earlier auth → init failure is therefore very unlikely to be a dead ESP. The likely cause is the old PCB assembly, its soldered fly-wires, power delivery, or the antenna/contact area. The LD2450 UART and radar path are still unverified. Next: as an interim solution, continue on a breadboard with one known-good ESP and the LD2450 before moving to manufactured PCB-02."}, {"post_id": 53168, "ts": "2026-08-23T16:42:54Z", "hours": 1.9047, "text": "DEVLOG #15 D4/D5/D6 evidence package I consolidated every archived D4/D5/D6 recording into one reproducible technical report and a 25-run CSV inventory. I kept historical A/G captures separate because their sample rate and guard settings do not support a direct percentage comparison. The result is clear: pooled D4 retained 88.4% still recall but produced 75.2% empty-room false presence. Historical D5 replay looked strong at 0.0% false presence and 89.3% recall, but the real D5 live run and D5-abs still-person run both collapsed to 0% recall. D5-abs therefore reduced false presence only by making still presence unusable. I also audited all five D6 raw CSI files against their sidecars. Every file is complete, has zero recorder drops, includes RX1–RX4, and uses one 2.437 GHz / 1-antenna / 64-subcarrier grid. The current empty-neutral-02 capture is a valid same-setup baseline candidate; the older setup and discovery capture remain separate. This is technical evidence, not an accuracy claim. No phase yet has independent mmWave ground truth, blind position validation, or a proven live localization path. Next I will install the heat-set thread inserts in the mmWave case and then check whether everything works as intended before deciding how to proceed."}, {"post_id": 51926, "ts": "2026-08-21T20:58:54Z", "hours": 2.4314, "text": "DEVLOG #14 Since the last devlog, I published a new Observatory Control Center and a guided calibration workflow for the D6 experiment. The setup now includes a CAD-style room editor for the TX and RX1–RX4 positions. It validates room boundaries, duplicate receiver positions, and the canonical node IDs. The continuous mmWave calibration route is now the primary workflow; the manual P01–P09 grid remains only as a legacy fallback. Experiment profiles, run phases, setup hashes, and prediction/truth artifact hashes are persisted in SQLite. The UI also makes READY , RUNNING , PASS , OFFLINE , and SOFTWARE-ONLY / UNVALIDATED states explicit, so a simulated workflow cannot be mistaken for a real sensor result. I ran 41 UI/Observatory tests and 4 targeted Rust workflow tests ; all passed. This validates the software workflow, but not the real CSI stream, LD2450 UART/UDP path, calibration data, or position accuracy. Next: connect the LD2450 to the working ESP on the breadboard, verify UART bytes and valid radar frames, and then continue with the sealed hardware workflow and real blind tests."}, {"post_id": 51771, "ts": "2026-08-21T16:41:39Z", "hours": 1.8486, "text": "DEVLOG #13 I narrowed the Wi-Fi authentication problem down to the original ESP32-C3 . A second ESP running the same firmware connected to csi-test , received an IP address, and started its HTTP server successfully. This shows that the TX, credentials, and firmware work in principle—and that the LD2450 is not causing the current Wi-Fi failure. The original ESP ( ac:a7:04:c2:71:f4 ) is now the main suspect, possibly because of its Wi-Fi hardware, power stability, flash state, or an access-point client entry. I also planned a breadboard-compatible power setup for testing without the SMD capacitors: a through-hole 100 nF ceramic capacitor and 10 µF electrolytic capacitor across 5 V and GND, placed close to the ESP and radar connections. The radar itself has not passed a UART test yet . Next, I will connect the unpowered LD2450 to the working ESP and check whether UART bytes and valid radar frames increase."}, {"post_id": 49852, "ts": "2026-08-18T20:01:28Z", "hours": 3.3072, "text": "DEVLOG #12 I built a new Observatory Control Center that guides the experiment through all ten phases—from creating and sealing the setup to calibration, blind tests, evaluation, and the final report. Run metadata, setup profiles, phase history, and artifact hashes are now stored persistently in SQLite, while the raw recordings remain separate files. The UI shows clear READY , RUNNING , PASS , OFFLINE , and UNVALIDATED states and keeps software-only demonstrations separate from real measurements. I also made continuous mmWave-guided calibration the main workflow. The manual P01–P09 capture grid remains available only as a legacy fallback. All 29 UI tests and all 4 targeted SQLite/workflow tests pass. This verifies the software workflow, but does not yet validate the real sensors or position accuracy . Next: connect the finished hardware and run the guided workflow with real data ."}, {"post_id": 48977, "ts": "2026-08-17T15:47:15Z", "hours": 3.4047, "text": "DEVLOG #11 I started assembling the reference-sensor PCB and soldered the available parts. The SMD capacitors have not arrived yet, and the ESP pads turned out to be too small for reliable soldering, so I have started connecting the ESP with wires instead. On the software side, I added diagnostics for UART bytes, valid radar frames, UDP transmissions, and errors. The server and UI now display these values and detect connection or network problems. I also tested the complete software path synthetically—from radar input through calibration, position indexing, blind-test gates, and the UI. All relevant tests passed, including 10/10 UI tests. This confirms the software path, but not the final live hardware setup. A read-only CSI check currently receives no RX packets. The last discovery did find TX and RX1–RX4 with a stable 64-subcarrier grid, although sequence gaps were around 5–6% . Next: finish the wiring, add the capacitors, and restore live CSI reception ."}, {"post_id": 46851, "ts": "2026-08-14T11:44:53Z", "hours": 1.2353, "text": "DEVLOG #10 I completed the calibration and evaluation pipeline for WiFi positioning with an HLK-LD2450 reference sensor. The new system includes: ESP32-C3 firmware with UART parsing, room coordinates, operating modes, Wi-Fi transmission, and protected configuration; persistent coordinate transformation with origin, rotation, and optional mirroring; synchronization of mmWave and RX1–RX4 CSI data within 150 ms ; a 65-second empty-room reference; automatic room coverage with nine reachable zones ( P01–P09 ) and six training blocks per zone; a position index that uses only CSI after calibration ; blind evaluation with separated WiFi predictions and mmWave reference data; fixed quality thresholds with automatic acceptance or rejection; and a guided German calibration assistant in the UI. The PCB has also arrived. I am checking it carefully before soldering and starting the first complete hardware tests. Next: verify the PCB, solder the components, and test the full system ."}, {"post_id": 46000, "ts": "2026-08-12T21:00:12Z", "hours": 1.3247, "text": "DEVLOG #09 I 3D-printed the case and a PCB mockup to test the fit. The IKEA Skådis mount and the retaining posts were slightly too large, possibly because supports were placed in the wrong areas. I have already updated the 3D model and will print the revised version tomorrow."}, {"post_id": 45443, "ts": "2026-08-11T21:51:23Z", "hours": 0.6469, "text": "DEVLOG #08 I finished the firmware and flashed it onto the ESP32-C3 SuperMini for the mmWave reference sensor. It uses the correct UART pins ( GPIO20 RX , GPIO21 TX , 256000 baud ), parses all three LD2450 targets using the official protocol , and sends timestamped UDP JSON data. It also separates calibration and reference recordings, supports protected A/B OTA, detects ambiguous multi-person measurements, and allows configurable radar placement. The firmware is ready, but the final PCB still needs to arrive. I then need to solder it before any complete hardware testing can begin. I will also finish the IKEA-board mount, print the case, and check the PCB fit—especially the retaining posts . Next: receive and solder the PCB, print the case, and test everything together ."}, {"post_id": 45318, "ts": "2026-08-11T18:12:17Z", "hours": 1.1956, "text": "DEVLOG #07 I added small retaining posts to hold the PCB securely inside the mmWave sensor case. I also designed a holder for mounting the enclosure to an IKEA board. These details should keep both the electronics and the finished case in place, but they still need to be printed and tested for fit. Next: print the parts and check the tolerances ."}, {"post_id": 45185, "ts": "2026-08-11T14:38:53Z", "hours": 1.9669, "text": "DEVLOG #06 I continued redesigning the mmWave reference sensor case and replaced the honeycomb pattern with cleaner parallel openings. I also refined the inside of the enclosure by adding two posts and a rectangular internal feature. The case now has a much cleaner shape, but it is still a CAD design and has not been printed or tested yet . Next: check the component fit and prepare the case for printing ."}, {"post_id": 44901, "ts": "2026-08-10T23:16:59Z", "hours": 1.9811, "text": "DEVLOG #05 Redesigning the mmWave reference sensor case Today Redesigned the 3D-printed enclosure for the mmWave reference sensor. Finish the enclosure and prepare it for printing. Current Challenge I am currently working on the honeycomb pattern. The new case is taking shape, but the pattern still needs to be fixed before the design is complete. Status: Redesigned , NOT FINISHED , currently focused on the pattern ."}, {"post_id": 44167, "ts": "2026-08-09T18:58:20Z", "hours": 2.1736, "text": "DEVLOG #04 D6 setup and calibration Today Sealed the 1TX/4RX setup and identified the TX without flashing. Passed the 25-second preflight and recorded 65 seconds of empty-room data. UI Fix Camera rotation was replaced with a display-only X-axis mirror: x_display = room_length - x Next Record training data at P01–P09 Build the position fingerprint index Run blind tests and evaluate both quality thresholds Complete all nine training positions. Build the fingerprint model. Validate before enabling live positioning. Status: Connected , UNCALIBRATED , setup sealed and unchanged"}, {"post_id": 43483, "ts": "2026-08-08T19:35:11Z", "hours": 1.7147, "text": "DEVLOG #03 Today I finished the 3D-printed case for the reference sensor (mmWave). Its purpose is to measure how accurate the WiFi CSI-based positioning actually is."}, {"post_id": 42271, "ts": "2026-08-06T22:02:29Z", "hours": 0.5714, "text": "DEVLOG #02 So, I had a big issue today. I finished my PCB after five hours of work and recorded the entire process as a timelapse in Lookout . Then I accidentally clicked Discard . Fortunately, I was able to recover the video on my Mac, including all of its metadata. Getting the logged time restored now depends on the incredible team at Hack Club/Laps . I have already asked for help on Slack and sent an email. The PCB Is Finished Despite the timelapse issue, the PCB shown below is finished and already ordered . Its purpose is to provide reference data for evaluating how accurately the Wi-Fi-based tracking system works. The board includes: an ESP32-C3 SuperMini ; and an mmWave radar sensor."}, {"post_id": 40866, "ts": "2026-08-04T17:44:34Z", "hours": 27.3636, "text": "DEVLOG #01 Hi, long time no see. Over the past few weeks, I have been developing two new approaches to presence detection. The main issue was that the system could not reliably distinguish between an empty room and a room with me standing inside :(. To solve this, I first developed D5 and then D6 . D5 is already available on GitHub . D6 is not available yet because it is still under development and has not been fully validated with real measurements and blind tests. D5 — Presence Detection D5 was designed to determine whether a room is empty or occupied. It compares current CSI measurements with a previously recorded empty-room reference. However, D5 mainly evaluated changes in one direction. In practice, a person’s presence can cause CSI values to either increase or decrease, depending on the receiver and propagation path. As a result, D5 behaved more like a motion detector and could miss a person who remained still. While it significantly improved presence detection, it was not robust enough for reliable real-world use. D6 — Presence Detection and Position Classification D6 builds on D5 by evaluating deviations from the empty-room reference in both directions , making it much more effective at detecting people who remain stationary. Once a person has been detected, D6 attempts to classify their position. Instead of calculating arbitrary coordinates, it identifies one of nine predefined locations ( P01–P09 ) that were previously trained using CSI recordings. A position is only reported if: the hardware setup is valid and sealed; all receivers provide fresh and valid CSI data; the correct transmitter has been verified; a person has been detected; a valid position index is available; and the classification result is sufficiently confident. If any of these conditions are not met, D6 deliberately reports no position instead of inventing one. The software pipeline is largely complete, but the system still needs to be validated using a new sealed setup, fresh training recordings, and independent blind tests before D6 can be released on GitHub. New Interface I also redesigned the standard RuView interface as a clean, white, Samaritan-inspired UI based on the AI system from the TV series Person of Interest ."}]...
|
Title: Observatory by @Gerafftes | Stardance
Devl Title: Observatory by @Gerafftes | Stardance
Devlogs:
DEVLOG #01 Hi, long time no see. Over the past few weeks, I have been developing two new approaches to presence detection. The main issue was that the system could not reliably distinguish between an empty room and a room with me standing inside :(. To solve this, I first developed D5 and then D6 . D5 is already available on GitHub . D6 is not available yet because it is still under development and has not been fully validated with real measurements and blind tests. D5 — Presence Detection D5 was designed to determine whether a room is empty or occupied. It compares current CSI measurements with a previously recorded empty-room reference. However, D5 mainly evaluated changes in one direction. In practice, a person’s presence can cause CSI values to either increase or decrease, depending on the receiver and propagation path. As a result, D5 behaved more like a motion detector and could miss a person who remained still. While it significantly improved presence detection, it was not robust enough for reliable real-world use. D6 — Presence Detection and Position Classification D6 builds on D5 by evaluating deviations from the empty-room reference in both directions , making it much more effective at detecting people who remain stationary. Once a person has been detected, D6 attempts to classify their position. Instead of calculating arbitrary coordinates, it identifies one of nine predefined locations ( P01–P09 ) that were previously trained using CSI recordings. A position is only reported if: the hardware setup is valid and sealed; all receivers provide fresh and valid CSI data; the correct transmitter has been verified; a person has been detected; a valid position index is available; and the classification result is sufficiently confident. If any of these conditions are not met, D6 deliberately reports no position instead of inventing one. The software pipeline is largely complete, but the system still needs to be validated using a new sealed setup, fresh training recordings, and independent blind tests before D6 can be released on GitHub. New Interface I also redesigned the standard RuView interface as a clean, white, Samaritan-inspired UI based on the AI system from the TV series Person of Interest .
DEVLOG #02 So, I had a big issue today. I finished my PCB after five hours of work and recorded the entire process as a timelapse in Lookout . Then I accidentally clicked Discard . Fortunately, I was able to recover the video on my Mac, including all of its metadata. Getting the logged time restored now depends on the incredible team at Hack Club/Laps . I have already asked for help on Slack and sent an email. The PCB Is Finished Despite the timelapse issue, the PCB shown below is finished and already ordered . Its purpose is to provide reference data for evaluating how accurately the Wi-Fi-based tracking system works. The board includes: an ESP32-C3 SuperMini ; and an mmWave radar sensor.
DEVLOG #03 Today I finished the 3D-printed case for the reference sensor (mmWave). Its purpose is to measure how accurate the WiFi CSI-based positioning actually is.
DEVLOG #04 D6 setup and calibration Today Sealed the 1TX/4RX setup and identified the TX without flashing. Passed the 25-second preflight and recorded 65 seconds of empty-room data. UI Fix Camera rotation was replaced with a display-only X-axis mirror: x_display = room_length - x Next Record training data at P01–P09 Build the position fingerprint index Run blind tests and evaluate both quality thresholds Complete all nine training positions. Build the fingerprint model. Validate before enabling live positioning. Status: Connected , UNCALIBRATED , setup sealed and unchanged
DEVLOG #05 Redesigning the mmWave reference sensor case Today Redesigned the 3D-printed enclosure for the mmWave reference sensor. Finish the enclosure and prepare it for printing. Current Challenge I am currently working on the honeycomb pattern. The new case is taking shape, but the pattern still needs to be fixed before the design is complete. Status: Redesigned , NOT FINISHED , currently focused on the pattern .
DEVLOG #06 I continued redesigning the mmWave reference sensor case and replaced the honeycomb pattern with cleaner parallel openings. I also refined the inside of the enclosure by adding two posts and a rectangular internal feature. The case now has a much cleaner shape, but it is still a CAD design and has not been printed or tested yet . Next: check the component fit and prepare the case for printing .
DEVLOG #07 I added small retaining posts to hold the PCB securely inside the mmWave sensor case. I also designed a holder for mounting the enclosure to an IKEA board. These details should keep both the electronics and the finished case in place, but they still need to be printed and tested for fit. Next: print the parts and check the tolerances .
DEVLOG #08 I finished the firmware and flashed it onto the ESP32-C3 SuperMini for the mmWave reference sensor. It uses the correct UART pins ( GPIO20 RX , GPIO21 TX , 256000 baud ), parses all three LD2450 targets using the official protocol , and sends timestamped UDP JSON data. It also separates calibration and reference recordings, supports protected A/B OTA, detects ambiguous multi-person measurements, and allows configurable radar placement. The firmware is ready, but the final PCB still needs to arrive. I then need to solder it before any complete hardware testing can begin. I will also finish the IKEA-board mount, print the case, and check the PCB fit—especially the retaining posts . Next: receive and solder the PCB, print the case, and test everything together .
DEVLOG #09 I 3D-printed the case and a PCB mockup to test the fit. The IKEA Skådis mount and the retaining posts were slightly too large, possibly because supports were placed in the wrong areas. I have already updated the 3D model and will print the revised version tomorrow.
DEVLOG #10 I completed the calibration and evaluation pipeline for WiFi positioning with an HLK-LD2450 reference sensor. The new system includes: ESP32-C3 firmware with UART parsing, room coordinates, operating modes, Wi-Fi transmission, and protected configuration; persistent coordinate transformation with origin, rotation, and optional mirroring; synchronization of mmWave and RX1–RX4 CSI data within 150 ms ; a 65-second empty-room reference; automatic room coverage with nine reachable zones ( P01–P09 ) and six training blocks per zone; a position index that uses only CSI after calibration ; blind evaluation with separated WiFi predictions and mmWave reference data; fixed quality thresholds with automatic acceptance or rejection; and a guided German calibration assistant in the UI. The PCB has also arrived. I am checking it carefully before soldering and starting the first complete hardware tests. Next: verify the PCB, solder the components, and test the full system .
DEVLOG #11 I started assembling the reference-sensor PCB and soldered the available parts. The SMD capacitors have not arrived yet, and the ESP pads turned out to be too small for reliable soldering, so I have started connecting the ESP with wires instead. On the software side, I added diagnostics for UART bytes, valid radar frames, UDP transmissions, and errors. The server and UI now display these values and detect connection or network problems. I also tested the complete software path synthetically—from radar input through calibration, position indexing, blind-test gates, and the UI. All relevant tests passed, including 10/10 UI tests. This confirms the software path, but not the final live hardware setup. A read-only CSI check currently receives no RX packets. The last discovery did find TX and RX1–RX4 with a stable 64-subcarrier grid, although sequence gaps were around 5–6% . Next: finish the wiring, add the capacitors, and restore live CSI reception .
DEVLOG #12 I built a new Observatory Control Center that guides the experiment through all ten phases—from creating and sealing the setup to calibration, blind tests, evaluation, and the final report. Run metadata, setup profiles, phase history, and artifact hashes are now stored persistently in SQLite, while the raw recordings remain separate files. The UI shows clear READY , RUNNING , PASS , OFFLINE , and UNVALIDATED states and keeps software-only demonstrations separate from real measurements. I also made continuous mmWave-guided calibration the main workflow. The manual P01–P09 capture grid remains available only as a legacy fallback. All 29 UI tests and all 4 targeted SQLite/workflow tests pass. This verifies the software workflow, but does not yet validate the real sensors or position accuracy . Next: connect the finished hardware and run the guided workflow with real data .
DEVLOG #13 I narrowed the Wi-Fi authentication problem down to the original ESP32-C3 . A second ESP running the same firmware connected to csi-test , received an IP address, and started its HTTP server successfully. This shows that the TX, credentials, and firmware work in principle—and that the LD2450 is not causing the current Wi-Fi failure. The original ESP ( ac:a7:04:c2:71:f4 ) is now the main suspect, possibly because of its Wi-Fi hardware, power stability, flash state, or an access-point client entry. I also planned a breadboard-compatible power setup for testing without the SMD capacitors: a through-hole 100 nF ceramic capacitor and 10 µF electrolytic capacitor across 5 V and GND, placed close to the ESP and radar connections. The radar itself has not passed a UART test yet . Next, I will connect the unpowered LD2450 to the working ESP and check whether UART bytes and valid radar frames increase.
DEVLOG #14 Since the last devlog, I published a new Observatory Control Center and a guided calibration workflow for the D6 experiment. The setup now includes a CAD-style room editor for the TX and RX1–RX4 positions. It validates room boundaries, duplicate receiver positions, and the canonical node IDs. The continuous mmWave calibration route is now the primary workflow; the manual P01–P09 grid remains only as a legacy fallback. Experiment profiles, run phases, setup hashes, and prediction/truth artifact hashes are persisted in SQLite. The UI also makes READY , RUNNING , PASS , OFFLINE , and SOFTWARE-ONLY / UNVALIDATED states explicit, so a simulated workflow cannot be mistaken for a real sensor result. I ran 41 UI/Observatory tests and 4 targeted Rust workflow tests ; all passed. This validates the software workflow, but not the real CSI stream, LD2450 UART/UDP path, calibration data, or position accuracy. Next: connect the LD2450 to the working ESP on the breadboard, verify UART bytes and valid radar frames, and then continue with the sealed hardware workflow and real blind tests.
DEVLOG #15 D4/D5/D6 evidence package I consolidated every archived D4/D5/D6 recording into one reproducible technical report and a 25-run CSV inventory. I kept historical A/G captures separate because their sample rate and guard settings do not support a direct percentage comparison. The result is clear: pooled D4 retained 88.4% still recall but produced 75.2% empty-room false presence. Historical D5 replay looked strong at 0.0% false presence and 89.3% recall, but the real D5 live run and D5-abs still-person run both collapsed to 0% recall. D5-abs therefore reduced false presence only by making still presence unusable. I also audited all five D6 raw CSI files against their sidecars. Every file is complete, has zero recorder drops, includes RX1–RX4, and uses one 2.437 GHz / 1-antenna / 64-subcarrier grid. The current empty-neutral-02 capture is a valid same-setup baseline candidate; the older setup and discovery capture remain separate. This is technical evidence, not an accuracy claim. No phase yet has independent mmWave ground truth, blind position validation, or a proven live localization path. Next I will install the heat-set thread inserts in the mmWave case and then check whether everything works as intended before deciding how to proceed.
DEVLOG #16 The ESP was not the problem After the original PCB failed during WLAN authentication, I redesigned the mmWave carrier as PCB-02 and isolated the ESP to find the real cause. PCB-02 replaces the too-small ESP contact pads with proper through-hole header rows, keeps the case-compatible outline, protects the antenna area, and retains the SMD capacitors. The routing and electrical checks passed, and the Gerbers are ready to order. The important experiment came next. I unsoldered the suspect ESP from the old PCB and powered it by itself. It joined csi-test , answered every ping, and returned HTTP 200 from /ota/status . A second ESP did exactly the same without any PCB attached. This was the key finding: both ESPs work outside the PCB. The earlier auth → init failure is therefore very unlikely to be a dead ESP. The likely cause is the old PCB assembly, its soldered fly-wires, power delivery, or the antenna/contact area. The LD2450 UART and radar path are still unverified. Next: as an interim solution, continue on a breadboard with one known-good ESP and the LD2450 before moving to manufactured PCB-02.
DEVLOG #17 I finally verified the complete breadboard mmWave data path with the HLK-LD2450. After flashing the known firmware to a new ESP32-C3, it joined csi-test , received 192.168.4.2 , and exposed /ota/status on port 8032 . The status confirmed the expected UART mapping: GPIO20 RX, GPIO21 TX, and 256000 baud in calibration mode. The important test was a read-only UDP capture: 224 valid LD2450 datagrams in 20 seconds, followed by 222 more while the setup was powered only from the normal power supply. Every packet matched ruview.mmwave.ld2450.v1 and contained a recognized target. This proves that the breadboard wiring, UART parser, ESP Wi-Fi connection, and UDP transport work together. The reported coordinates are still sensor-frame data, not a validated room position. The permanent PCB-02 is still pending. Next I will validate the radar transform with known room marks, connect the CSI receivers, and continue with D6 calibration, training, blind tests, and the quality gates.
DEVLOG #18 Since the LD2450 first worked, I connected TX, RX1–RX4, and Wi-Fi, positioned the sensor, sealed setup-v2 , and added a calibration preparation phase with a countdown and a minimum duration of 60 seconds . The real hardware UI is running on port 8080 ; port 3002 still shows the simulation. I started the workflow, but it currently stops at step 4, the empty-room Wi-Fi baseline , because radar packets are being lost. I improved server-side packet sorting and built a new 10 Hz firmware. The OTA update started, but the device still boots the old firmware from ota_0 at about 20.6 Hz . The sensor is online, but calibration is not ready. 63 UI tests pass; one Rust test mismatch remains. No real D6 calibration or blind validation has been completed yet. Next: activate the 10 Hz firmware, resolve the packet-loss blocker, and rerun the preflight and empty-room baseline.
DEVLOG #19 I activated the new mmWave firmware and got the live 25-second preflight to pass once, but the first empty-room recording did not complete. The main work was hardening the transport: the firmware now sends redundant radar packets, while the server handles reordering, duplicates, short CSI gaps, and recent diagnostics instead of relying on cumulative counters. The UI also gained a controlled empty-room countdown. The remaining failure is intermittent: the sensor stays online and reports no local UDP send errors, but the server still recorded packets_lost=10 and packets_rejected=324 . The empty-room capture lasted only 4.8 s for radar and 5.1 s for CSI, so it is not a valid calibration reference. No calibration, training, or blind position result is claimed yet. Next: expose the exact reject reason and sequence-gap timing, fix the remaining transport problem, and repeat the complete empty-room measurement.
DEVLOG #20 Today I finally found why the four RX streams kept disagreeing: the server was fusing packets from different transmitter moments. The old path had already reached 98,126 engine errors with a timestamp spread of about 710 ms . The first timing fix exposed the deeper problem. The server was simply taking the latest packet from each receiver, even when those packets did not belong to the same event. I replaced that with bounded per-RX queues and approximate-time matching. The existing 60 ms guard stays fail-closed, so an incoherent quartet is discarded instead of becoming a fake D6 input. The new tests cover packet loss, reboots, sequence wrap, clock jumps, queue matching, and host-time fallback. 484/485 tests passed in the sandbox,. Next: restart the server and verify a stable, error-free 25-second preflight. But for now, time to sleep.
DEVLOG #21 The 65-second empty-room calibration failed before it could collect a usable baseline. The UI showed Samples 0 when I returned, so no calibration ID or context hash was created. The failure exposed a design problem in the run itself. A recoverable outside-room radar target could stop the entire measurement. I’m changing the workflow so the run always reaches its configured end and evaluates the evidence afterwards. The final report will mark it valid or invalid with concrete reasons instead of hiding the failure behind an early stop. This behavior change is planned, but not yet implemented or validated. No successful calibration, restored baseline, 10/10 acceptance, position index, guided room walk, or blind-test result is claimed. Next: implement and test the non-interrupting run plus the post-run validity report
DEVLOG #22 I fixed the last browser security gap found in the local security review: a page on one local port can no longer reach an unauthenticated service on another local port by default. The review contained 13 entries. Entries 8 and 11, and entries 12 and 13, were duplicates, leaving 11 unique findings. The old check trusted the hostname alone, so every localhost port was accepted. I separated browser Origin validation from the existing Host /DNS-rebinding protection. WebSockets and state-changing /api/v1/* requests now require an exact scheme, host, and port. By default, only http://localhost:<http_port> , http://127.0.0.1:<http_port> , and http://[::1]:<http_port> are allowed. Repeatable --allowed-origin values or the comma-separated SENSING_ALLOWED_ORIGINS variable explicitly replace these defaults. Host-only values, wildcards, null , paths, userinfo, and invalid ports are rejected. The protection covers /ws/* and /api/v1/stream/pose on both the HTTP and dedicated WebSocket ports. CLI clients without an Origin header remain compatible. The regression test now returns 403 for an unlisted cross-port UI, while an explicitly allowlisted cross-port UI still works. All 24/24 Origin/Host tests, 471 sensing-server tests ( 1 ignored), HomeCore server/API/auth/WebSocket tests ( 18 + 18 + 6 + 5 ), and 7 Python/firmware security-boundary tests passed. Binary checks, targeted rustfmt, and git diff --check also passed. No flash or OTA action was performed. The ESP-IDF v5.4 build matrix is still inconclusive: the native ARM64 image is missing a containerd layer, while the AMD64 fallback crashes in the emulated Xtensa compiler inside MbedTLS. I therefore do not count the three firmware builds as passed. Next: Solder PCB-02 first, then mount the mmWave sensor in the corner.
DEVLOG #23 The issue encountered during initial startup was a design error: the LD2450 had been mounted rotated by 180°. The UART routing itself was correct. After rotating the sensor and reflashing the ESP32-C3, everything worked again, though the physical setup doesn’t look very tidy. I designed PCB-03 based on PCB-02. The LD2450 connector and its wiring have been rotated by 180°. Everything else remains unchanged. I also added ground planes. Until the PCB arrives, the breadboard setup will continue to serve as a temporary mmWave configuration. Next steps: order PCB-03, mount the LD2450 in the marked orientation, and repeat the live radar verification. Continue using the breadboard setup until delivery.
DEVLOG #24 I strengthened security for live-sensor operation and started aligning the Observatory UI with backend functionality that actually exists. Live WebSockets now require Bearer authentication along with strict Origin and Host checks. Browser and Python clients no longer send tokens in the URL. Regression tests cover missing, invalid, and duplicate requests as well as cross-origin access. The complete CAD geometry document is now persisted in SQLite and survives a server restart. Another issue was in the browser catalog: it listed routes that the active Rust server did not provide. I am separating active routes from legacy compatibility routes, adding the missing model-details contract, and returning unavailable or HTTP 501 when browser-triggered training is not available instead of falsely reporting that it started. Next: finish and commit the route extraction, then repeat the live mmWave preflight, including calibration.
DEVLOG #25 I measured and optimized the mmWave UDP transport, but the radar path still fails the lossless-transmission test (image 1) . The new firmware and server path use one UDP copy without artificial delay, disable Wi-Fi power saving on the mains-powered node, persist the collector target and CAD transform, and separate socket reads from processing. Reordering, sequence validation, deduplication, and rolling metrics expose failures instead of hiding them. Across three 60-second runs, unique arrivals improved by 11.2%, sequence loss fell from 20.6% to 13.1%, duplicates dropped to zero, and arrival P95 improved by 27.8%. Two copies did not reduce loss and only added duplicates, so one copy remains the default. The transport is better, but not lossless: 13.1% sequence loss still blocks the radar preflight. The 50 ms interval is not the bottleneck; LD2450 frames arrive in bursts and the bridge emits about 2.64 measurements per second, not 20 independent frames per second. Next I will investigate RSSI and channel conditions, ARP and startup behaviour, Wi-Fi retries and airtime, and packet scheduling. RX/CSI stayed offline, so this is not a full Wi-Fi validation. The server refactor from DEVLOG #24 is now integrated: routes, state, runtime, calibration, recording, model, and system responsibilities moved out of main.rs , with active, legacy, and unavailable-training contracts separated. Desktop-interface removal remains in progress. Hardware-control modules are moving to a standalone control crate, while loopback-only browser server controls with origin checks are being added. Phase 1 calibration is also getting a longer measurement window and persisted evidence. RX3 currently lands roughly two to three metres from its expected fixed point. I will not consider the calibration valid until the transform, profile binding, or target association causing this offset is understood and corrected. Next: resolve the RX3 Phase 1 offset (seen in image 2) , then repeat the full fixed-point calibration and re-verify the radar preflight.
DEVLOG #26 I have completed, soldered, and tested the third and hopefully final PCB revision. Everything works, but the ground plane made soldering significantly more difficult than expected. Even with thermal reliefs around the solder pads, the plane acted like a heat sink, dissipating heat across the entire board. The shift to a browser-centric approach is progressing: the Tauri desktop app and its associated release pipeline are being removed, while hardware control is being moved to a standalone “loopback crate.” This crate handles tasks such as device discovery, serial access, provisioning, flashing, OTA updates, and WASM integration. This work is currently ongoing. The server now protects the /api/field and /ws/field endpoints using Bearer authentication and keeps auto mode offline until real data is available. An explicit simulated source is required for simulation. mmWave transmission has been improved but still exhibits a sequence loss rate of 13.1%, causing the radar preflight to remain blocked. The causes of the remaining loss still need to be investigated, particularly regarding channel conditions, the startup process/ARP, and Wi-Fi airtime and scheduling. The calibration offset for “Phase 1” on RX3 also remains unresolved. Next steps: fixing the RX3 offset, completing the migration to the browser/control setup, and re-running the radar preflight.
DEVLOG #27 I soldered a second PCB from revision 3, making the hardware for two mmWave sensors available. The software now keeps MMWAVE1 and MMWAVE2 separate through stable node identities and independent sequence, transform, and calibration state. The mmWave transport also crossed an important milestone. Because best-effort UDP was not enough, firmware 0.1.6 now uses ACK-based retransmission. In a controlled 60-second comparison, sequence loss reached 0.00% and the radar_sequence_loss_free gate passed, compared with 0.70% loss and 84 full ACK timeouts on firmware 0.1.5. The Tauri desktop shell has been replaced in the active build by a loopback control helper for discovery, provisioning, flashing, OTA, and WASM. I also created a new 3D-print file, which is currently being printed; the mechanical result is not finished yet. Next: validate both sensor paths together, resolve the RX3 Phase 1 offset, and repeat the full radar preflight.
DEVLOG #28 I prepared and locally verified an ESP-IDF replacement candidate for TX1. The firmware builds successfully, and the host-side checks for packet handling, scheduling, boot/OTA variants, and negative compile guards pass. This is still a software-only result. Nothing has been flashed, and TX1 has not been validated on hardware. Before replacing the existing TX1, the old TX1/RX4 baseline and network pre-check must still be completed. I also tightened the RX data path. Incoming frames are now checked for valid input and correct TX binding before passing through one jitter-tolerant 20 ms admission gate. Invalid or foreign frames no longer consume the timing budget. Callback, queue, UDP, and server-side counters are tracked separately, making it possible to see where loss or delay occurs. The deterministic fixtures and local ESP32-S3 build pass, but no live RX measurement has yet shown an actual reduction in frame loss or data age. The new 3D print exposed a mechanical error: it is approximately 1 mm too small and does not fit. It needs to be adjusted and printed again. Next: complete the read-only TX1/RX4 baseline, adjust and reprint the part, then continue with RX3 calibration and validation of both mmWave sensor paths.
DEVLOG #29 The local RX work has expanded, but the two-sensor setup is currently blocked by a connection problem with mmWave2. RX-04 to RX-12 add bounded capture and queue handling, stale-frame rejection, corrected CSI parsing, clearer UDP/server counters, and timing and synchronization metadata. The firmware host tests, standard and raw ESP32-S3 builds, and targeted server checks pass. These are still software and build results. No live RX measurement has yet proven lower frame loss or data age. :( The 3D-printed part now fits. While investigating the mmWave2 connection, I tried to desolder its ESP, but it could not be removed cleanly. Since the connection problem is not resolved, I ordered a replacement ESP, a new mmWave sensor, and an FH/Fenghua 1206X106K160NT SMD component. The exact cause is still open, and the replacement parts have not been installed or tested yet. The existing TX1 replacement also remains locally tested but unflashed. Next: rebuild mmWave2 with the replacement parts, identify the connection fault, validate both sensor paths, and continue with RX3 calibration.
DEVLOG #30 The replacement ESP for mmWave2 is now soldered and mounted on the previously working breadboard setup. The connection problem has not disappeared, however WiFi still fails, so I uploaded a minimal WiFi test script to isolate the radio and network path before testing the radar or UDP transport. The mmWave firmware now distinguishes MMWAVE1 and MMWAVE2 with separate build and upload paths, uses 55010 as the default UDP port, and logs the WiFi disconnect reason. These changes are prepared locally; the test image is not yet a confirmed fix, and the complete mmWave2 path is still unvalidated. In parallel, the TX1 replacement reached a stronger local checkpoint. Reproducible builds from fresh and isolated source copies are byte-identical, and the local test suite passed. The 7A TX1/RX4 baseline still produced no usable measurement data, so the migration remains blocked and 7B is NO-GO . Next: resolve the WiFi connection on the replacement ESP, verify mmWave2 communication, and continue with two-sensor validation and RX3 calibration.
DEVLOG #31 The mmWave2 connection problem is finally understood. It was caused by a reproducible dependency on the WLAN transmit power: at around 19.5 dBm, the ESP kept running and received probe requests, but its test AP could not be found and connections failed. At 10 dBm, the AP worked immediately, csi-test connected again, and 360/360 pings succeeded without a disconnect. Raising the limit reproduced the issue, confirming the dependency. Both mmWave sensors now work reliably. The TX1 migration is also complete. I verified the candidate firmware and baseline, created two identical 16 MiB backups. The new app was written to app1 together with the NVS merge and OTA selection. A complete readback of all 16,777,216 bytes matched the expected flash image exactly. Next: Boot the candidate under the existing safety gates, check that TX1 comes up properly, and run the full comparison.
DEVLOG #32 I still do not really have a final result to show, but it has been another ten hours, so I did not want to skip the devlog. The latest TX1 boot attempt did at least narrow things down. The new firmware now passes the Wi-Fi channel checks: channel 6, HT40 with the secondary channel below, AP-only mode, and the other radio checks all matched the expected profile. It then stops at CHECK_COUNTRY , before reaching BOOT_OK . The TX1 migration is therefore still not accepted, but the failure is much more specific now. The confusing part is that the Wi-Fi power values do not line up cleanly. The country structure reports a different power field than expected, while the separate power API returns the expected value. This may be an SDK representation or comparison issue rather than a real transmit-power problem, but there is not enough evidence to call it fixed yet. I also corrected related checks for the country bytes, SSID representation, and status getters, and prepared another reproducible candidate offline. With the move to Python 3.15, I also added the new lazy-import implementation. The official Python documentation describes the new syntax. Eligible imports now use explicit lazy import and lazy from syntax, with a local verifier to keep the behavior consistent. After the failed candidate boot, I restored the original 16 MiB image and verified the return path. The historical firmware is running again, and RX4 plus both mmWave sensors are sending data. Next: resolve the country/power comparison, then attempt the candidate boot again under the existing safety gates.
DEVLOG #33 The TX1 finally made it all the way to BOOT_OK . After the CHECK_COUNTRY problem from the last update, the new candidate passed the Country20/Power44 and Wi-Fi checks, booted into test mode, and passed the local TX/RX4 checks. I also confirmed the amber LED and both mmWave transport paths. The previous candidate had stopped because one sampling gap grew to 10.2 seconds. I traced that back to the timing bookkeeping and changed the sampler to schedule from the last real sample completion. The corrected run stayed within the sampling limits. That is a real improvement, but it is not the final acceptance yet. The full coverage result is still blocked by the clock-binding requirement, and the radar window only showed no_target , not a position result. I also switched to the new diagnostic server in a controlled run. It stayed ready and a separate 61-second capture passed the coverage gate, but the active CSI position setup is still missing, so this does not count as a complete TX-7B or system pass. The CAD UI got a pretty big upgrade too. MMWAVE1 and MMWAVE2 can now be edited as separate sensors with their own colors, 6 m fields of view, direction arrows, and yaw handles. I added a button to aim them at each other, plus a wall-angle tool that draws the real beam/wall intersection and lets me set the angle directly. Marker labels also move out of the way automatically, and the snap setting survives a refresh. Next: fix the remaining coverage and clock evidence, activate the sealed CAD/CSI setup, and complete the full TX-7B validation.
DEVLOG #34 The TX1 migration is now 100% verified , but the project is still only around ≈ 70% complete. The third and final boot attempt did not give me the clean result I was hoping for. Recovery happened within the allowed time, but UART0 showed two app starts. After the first start, an RTC_SW_CPU_RST appeared and the app started again. It eventually reached BOOT_OK , but because of the duplicate start I still cannot accept the boot trace or move on to server activation and measurements. I am currently documenting the exact restart sequence and trying to figure out what caused it. I also put together a source collection about Wi-Fi sensing and RF-based person detection. GitHub The separate mmWave freshness test did not reproduce the old MMWAVE2 delay problem, but that does not prove it is fixed. Next: get one clean TX1 boot, then activate the server and start collecting real measurements.
DEVLOG #35 I fixed two concrete TX1 firmware bugs. An authentication check that ran too late and an HTTP task with too little stack space. The status endpoint could lose the request headers before checking authorization. I moved that check ahead of the response. I also increased the HTTP task’s stack from 4 KB to 8 KB after confirming that some call paths could exceed the old limit. Two independent builds matched byte for byte. After taking fresh backups, I installed the candidate and verified the complete 16 MiB flash against the expected image. That part passed. The UDP/ENOMEM errors are not yet proven fixed. Next: investigate the reset path, complete a clean controlled boot, then check the matching server setup, authentication, all participants, and the measurement windows.
DEVLOG #36 The first full TX1 acceptance run is done now and it failed, but at least I finally have a much clearer picture of what is still going wrong… The common setup passed: all seven expected participants were visible, and 22 complete snapshots kept the shared basis valid for more than 20 seconds. Then Scope A ran its three 120-second windows. All three failed. There were 14 new TX send errors, and the diagnostic counters placed them in the wifi_handoff ENOMEM stage. That tells me where the error was recorded, but not yet why it happens or whether it is fixed. MMWAVE2 also became stale in parts of the run, and several RX requests were missing, so none of the historical comparisons could count as a valid PASS. Scope B stopped itself at the safety gate when the source binding became inconsistent and RX2 was already 5.044 seconds old. This is frustrating, but the guard did exactly what it was supposed to do, it refused to turn an incomplete 120-second window into a result. Next: decide how to continue the ENOMEM and source-binding issues before starting another acceptance run.
DEVLOG #37 I narrowed down the RX2 and mmWave2 issues from the failed run. Still no hardware fix, but the picture is getting clearer. The surprising part is that RX2 was still sending valid CSI packets during its apparent dropout. They just weren’t the 128-subcarrier frames the current evaluation needs. mmWave2, on the other hand, really did have gaps in packets reaching the host. I’m looking into its send-and-acknowledgement path, but haven’t proven the cause yet. I also found a parser mistake. A supposedly damaged RX packet was actually a valid warning message. That’s corrected in the isolated diagnostic tools, which now also distinguish device timeouts from requests the collector skipped or cancelled. New diagnostic firmware candidates for TX1, RX2 and mmWave2 are built locally to help trace where things stop moving. They aren’t installed yet, and the TX send errors are still unresolved. The UI is less misleading now, too: an ESP being reachable doesn’t mean radar data is arriving, and old readings no longer keep disconnected devices looking active. Next: review the diagnostic candidates, then use a short, controlled hardware run to investigate the remaining errors. The last full acceptance is still a FAIL.
DEVLOG #38 RX2 is finally delivering a lot more matching CSI data. After installing the new firmware, the rate went from about 1.9 to 31.9 frames per second. A longer, half-hour capture averaged around 30. The firmware now fixes Wi-Fi bandwidth at 20 MHz and guards against invalid CSI callbacks. One annoying catch: the long capture only recorded RX2 because some device endpoints were outdated or mixed up. I’ve prepared a stricter preflight so an incomplete group can’t silently become a four-receiver test again. I also corrected the offline window analysis. A valid frame with a different format no longer ruins an entire otherwise usable window. The UI code now separates format exclusions from unexplained sequence gaps instead of calling everything “loss”. The host fixes are tested locally, but aren’t active on the running server yet. Next: complete a proper simultaneous four-RX capture, then implement the RX1 <-> RX4 peer profile for testing. Tracking and full-system acceptance are still open.
DEVLOG #39 All four receivers finally made it through a full 30-minute CSI run together. RX1, RX3 and RX4 are now on C1, while RX2 stays on C. Each delivered around 17–20 matching frames per second, and 99.61% of the shared measurement windows passed the CSI checks. The RX1↔RX4 peer firmware and recording workflow are also implemented and tested offline now. The actual radio comparison hasn’t happened yet, so I still don’t know whether those extra links will improve positioning. One annoying bug kept rejecting good data after a 128→64→128 format change. That’s fixed in the offline analysis, along with separate format rules for TX1 and peer links and a recorder completion check. I also added RX and radar exports that keep raw data, timing and recording boundaries together. That path works in offline tests; it isn’t a new live hardware result. Next: check both mmWave sensors individually and then together at known points. The shared CSI run is a milestone, but tracking and full-system acceptance are still open.
DEVLOG #40 I cut the recording footprint from 4.54 to 2.67 GB in the full synthetic test, about 41% less. The saving comes mainly from removing duplicate exports, not throwing away raw data or evidence. I also corrected timing and CSI rate-limit bugs offline, plus a cleanup issue that could prevent the recorder from stopping its own processes when disk space got tight. The frustrating part is that the peer comparison still hasn’t recorded anything. One attempt stopped on the timing bug, after that was fixed, the next hit a missing signing key during host startup. No peer firmware was uploaded and no capture started in either attempt. Next: fix host startup and prepare a separate 35-minute pilot. The actual peer comparison and tracking acceptance are still open.
DEVLOG #41 RX1 finally passed a full three-minute TX1→RX1 test. 6,407 qualified CSI frames, around 35.6 per second, and all 173 measurement windows passed. The firmware had been rejecting our setup because TX1 is also the Wi-Fi access point. That’s corrected and installed now. SOS is the warning for missing or stale usable CSI from TX1. It doesn’t automatically mean the board is broken. Ironically, the warning itself had a bug, RX1 reported stale data even though a matching frame had arrived just 8.7 milliseconds earlier. A timing race between the LED task and CSI reception caused the false alarm. The fix is built and tested offline, but isn’t installed yet. Host startup and recording also work now. RX2 is still a problem, though: its upload timed out while CSI kept arriving, and the cause isn’t confirmed. Next: install and verify the LED fix on RX1 before continuing with the other receivers. The actual two-way peer comparison and tracking acceptance are still open.
DEVLOG #42 RX3 and RX4 have passed their individual checks on the latest firmware. A complete OTA update, the LED pattern test and ten minutes of stability monitoring each, with no errors recorded. The false SOS warning on RX1 is also fixed and verified on the board now. I corrected concurrent access in the shared UDP sender and transport statistics, too. Those are real software fixes, but I still can’t claim they explain the original RX3 heap corruption or watchdog resets. I also improved CAD profile handling. Profiles can use a separate store, the UI shows which revision is loaded, and refreshing no longer overwrites unsaved edits or brings back an older saved version. The rollout isn’t finished, though. The next RX1 update stopped because its device identity couldn’t be confirmed, so RX2’s update to this latest version hasn’t started either. Next: resolve that binding, finish updating RX1 and RX2, then move on to the actual two-way peer comparison. Tracking acceptance is still open....
|
1792572487.707279
|
1793177287.707279
|
|
136
|
Clientwarden by @CT5 | Stardance
|
CT5
|
0
|
282.93
|
0
|
[]
|
[{"post_id": 80638, "ts": "202 [{"post_id": 80638, "ts": "2026-10-18T11:24:17Z", "hours": 9.7372, "text": "BitWarden Vendor Architecture - Part 5 I kinda hoped that Sync would be easier but its pretty much as hard as Orchestrator, despite looking at the sync logic before hand and having to do less. I also rushed a ton of the stuff, so I need to have another look over the whole codebase and add comments and stuff before I continue again. I also need to handle all the todos and stuff. Tomorrow Im going to work on a lot of the bugs and errors with the runtime, sync and orchestrator because I did rush a lot of it."}, {"post_id": 79747, "ts": "2026-10-15T08:37:16Z", "hours": 9.7283, "text": "BitWarden Vendor Architecture - Part 4 I forgot to devlog today, so consider this 8h and 30mins and add 30mins to the next devlog. I finally finished Orchestrator which took waaaay too much time (almost 5 days) and I had to fix my plan a bit as well because of the roadblocks. Finishing off the rest of it was pretty easy and starting on the Sync class was much easier due to the massive amount of time it took for me to think of a solution to the syncing issue in the midst of the Orchestrator issues. Ill be posting a Sync finished devlog soon, probably tmrw, so stay tuned!"}, {"post_id": 78954, "ts": "2026-10-12T05:37:12Z", "hours": 8.7328, "text": "BitWarden Vendor Architecture - Part 3 Making the orchestrator is pretty difficult because tying everything together is soo difficult, especially with the attachment stuff. BitWarden has some weird concepts on how it works. When creating an item and pushing it to the server, the server generates the id for you and sends the whole cipher back. However, if the network request fails halfway through, then it can create it online, without giving you the id. There are 3 solutions to this. One, is to just re-push, which creates a duplicate. Another way to fix this, is to leave it and fail, which is not a good idea. The best way to combat this situation, is to pull the items from the server, and find the one that was created by comparing the key from the local and remote vaults. The issue, is that sometimes, there is no key, so we have to rely on comparing the fields alone, which isnt the best, but its the only way. This is pretty difficult to think of on the spot and to resolve quickly, so thats why it took me so long. The other issue, is that I’ve faced a roadblock. I didnt think of attachments when designing the runtime class, so I have to add more funcs to help with offline attachments. Another issue, is that the runtime class is getting kinda messy now, since there are like 5 of the same type of funcs so I have to clean that up too. And then, I have the largest issue that I have to fix. Syncing. Syncing is a pretty weird concept on BitWarden. If you update an item offline, you dont change the revision Date, the version changes it. However, if the server’s item was changed as well, then it gets complicated because you need to handle it yourself. The first thing you can do, is to merge the individual fields, like if the name was changed on the server, and the username was changed on the client, then merge both. However if the name was changed on the server and the client, then you can create a new item with (conflict X) and then push that. All this is pretty complicated, and its probably going to get even more complicated soon."}, {"post_id": 77766, "ts": "2026-10-08T06:17:11Z", "hours": 8.2647, "text": "BitWarden Vendor Architecture - Part 2 So I was able to finish off the BitWarden Network part which was somewhat hard, but it was just mainly repetitive stuff. I also got started on the BitWarden Runtime which wasnt too hard, although its sorta difficult to wrap your head around. After I finish off the runtime, I should be able to get started on the orchestrator and sync and versioning parts. For the Bitwarden Network I decided to integrate some stuff from the previous orchestrator that was wouldve been better to have in the Network and the same thing with Runtime as well."}, {"post_id": 76359, "ts": "2026-10-03T09:26:49Z", "hours": 9.3314, "text": "BitWarden Vendor Architecture - Part 1 Now that I’ve completed the Generic Base classes and stuff, I decided to work on the Vendor stuff. The main goal of the Architecturing is to make the architecture loose enough to work with BitWarden and 1Password, since if I focused solely on BitWarden again, it would have ended up being less abstract and I wanted it to be as abstract as possible without complicating things too much. Anyway, so I was able to finish off the crypto class and get started on the network class which pretty good progress. I did think of some additional ways to make it abstract, like making the UI call the Network class to get a list of all the URLs needed. Im hoping to get all the vendor classes finished by the end of next week and then start fixing the UI and UI Bridge in the following week."}, {"post_id": 74276, "ts": "2026-09-27T03:34:58Z", "hours": 9.3614, "text": "Finishing off the New Architecture So I was able to finish off the Architecture Implementations and add a few more classes, like the Thread and Utils files. I also added a ton of comments (one per func & one per class/struct) as per the style guidelines that I wrote. Writing the comments took me waaay too long, since some funcs were pretty generic and I couldnt think of what comment to put for that func. I still have a ton more to do, like the Generic Item Stuff which is really really confusing and I havent even gotten to that part yet. After all that, I need to start on the BitWarden Vendor stuff and then integrate all that into the UI Bridge which shouldnt be too hard."}, {"post_id": 72964, "ts": "2026-09-24T03:54:04Z", "hours": 8.3058, "text": "Vault Re-Architecturing - Part 2 So I started working on the architecture and it was pretty difficult. I was able to add the crypto, netowrk, orchestrator, profile, runtime, settings, sync and versioning. So currently, I’ve decieded to expose only the orchestrator, settings and versioning because those are the only essential features that the UI requires, and exposing any more would re-create a God Class. Essentially, this time I decided to abstract it enough so that it would work with 1Pass and Bitwarden as a guide so that it would be abstract enough, even though I’m probably never going to support another password manager API. One thing I didn’t account for was the fact that BitWarden has an Organisation thing where the Organisation has its own keys and stuff, which pretty much requires me to re-architecture it again. Im probably not going to implement the organisation thing any time soon, so I should be fine for now. I’m hoping to finish with the structure today and start on the implementations tmrw."}, {"post_id": 71612, "ts": "2026-09-21T05:03:56Z", "hours": 8.0961, "text": "Vault Re-Architecturing (again) So I again noticed a few bugs like last time, and had a think about the Vault itself. I noticed that its getting kinda complicated and things are getting intertwined and there are funcs that arent used, and func of which I dont even know what they do. So unlike last time, where I just asked claude how to structure things, I decided to do some proper professional re-archtecturing. I already had an overall plan on how things were going to be structured, but it was pretty hard. The doc format I decided to use was ARC42 which is a guide on how to make a proper software architecture doc. I did skip a few things, but those werent really relevant in my case so thats fine. I also decided to make a style guide since things were getting kinda messy. I havent fully finished the style guide yet, but its a start and I really need to get this new vault finished before Stardance ends. If you want to look at the doc, its on my GitHub Wiki and its pretty straightforward and extensive. It did take me quite a while to think of everything in depth, so I will be spending a ton more time since software architecturing is pretty difficult."}, {"post_id": 69611, "ts": "2026-09-17T12:42:56Z", "hours": 8.3583, "text": "Bug Fixes + Code Cleanup + Documentation Since I didn’t really have much to do, I decided to prepare my app for release. Currently there are quite a few things wrong with Clientwarden. First, it has tons of bugs, and the code is sorta messy, and the architecture is also kinda borked. The whole point of the past revamp was to prevent a God Class like last time where Vault held pretty much everything. Its much better now, but its far from perfect. This time, Im actually going to make a whole style guide and an architecture plan/guide which should be good. After that, I can actually implement the new architecture and then fix the remaining bugs. Tomorrow, ill probably do a more in depth test of the app and then fix them and repeat before actually trying to re-architecture."}, {"post_id": 68022, "ts": "2026-09-14T12:09:27Z", "hours": 8.3717, "text": "New Bitwarden Fields (Passport, Drivers License, Bank Account) So I was just looking at the vault.json in ClientWarden to check something, and I noticed that the data field was missing, which was pretty weird since Bitwarden or VaultWarden will not accept or respond with a json without a data field. When I looked closer, they had also added new fields like passport , bankAccount and driversLicense which means they added new Item Types. These Item Types aren’t supported yet, but I might as well implement them so that Clientwarden supports them early. Right now, you can create and see the new Item Types, but I havent implemented support to view or edit these new types."}, {"post_id": 65866, "ts": "2026-09-11T09:26:44Z", "hours": 8.0503, "text": "Mac OS 27 Support + Tests I recently switched to Mac OS 27 Public Beta, which turned out to a very bad idea, as I hated the new icons and especially the new lighter glass. I was hoping that when MacOS 27 actually releases it would be fixed. Well, it released, and it wasn’t fixed. So I had to fix the UI for MacOS 27 and it was kinda pending anyway since it was sorta against Apple’s UI guidelines, but it looked amazing. The new one doesnt look as good, but its ok. Ill be fixing it in the days to come. I’m also working on more tests, specifically for the network part, since the network part is an important part of the vault."}, {"post_id": 64675, "ts": "2026-09-09T08:18:01Z", "hours": 8.6503, "text": "Finished Android UI So I was able to finally finish off the Android UI, and I was able to finish it off dramatically faster than I spent on the Mac OS UI. Mainly because, with the Mac OS UI, I had to spend a lot more time on the architecture and I had to revamp the Vault itself. My favorite part about making the UI is the About Screen, where I can hide tons of really cool effects and easter egg. If you download the Android App and go to Settings and about, you will see an App Icon which if you click 3 times, will spin around, kinda like the chrome easter egg."}, {"post_id": 62728, "ts": "2026-09-06T07:07:08Z", "hours": 8.6769, "text": "Android UI - Details Screen I was able to implement the Password History Screen as well as the Reprompt UI and the Clientwarden Image class so that I can use an Image, Icon or App Resource. I still need to add a progress bar to the Attachment Item, Add callbacks for the top bar, add multi select support (tbh i dont really know how Im going to implement this) and do the rest of the stuff from the readme. I do want to focus more on the Mac OS side as well, bc I want to support Golden Gate and add a few features. The Main features that need to be implemented are the Sign Up support, Offline Vault support, and a ton more. If you want to help with the project, dm me at @CT5 on slack."}, {"post_id": 60174, "ts": "2026-09-02T12:01:52Z", "hours": 9.1489, "text": "Android Support So I decided to work mainly on Android UI Support for now and then move onto Iced on Linux. I was able to work on the Details Screen as well as finish the Items Screen and fix some main stuff for the Nav Screen like adding Folder support and stuff. I also started work on getting the Android UI to compile on CMake and it looks like its going to be way harder than I thought it would be initially. Tbh it looks like Apple’s XCode Swift UI combo is generally the best, since they have a declarative style UI and things are pretty easy to Implement. With Windows, its XAML which wouldn’t fit in my situation, and for Android its almost perfect, except gradle is a pain and there a hundred types of everything, like the IconButton , Button , FilledTonalButton , TextButton , etc, and those are just the ones I learnt rn. Unlike Android, SwiftUI just has one type of button which can do everything which is pretty good for beginners and advanced ppl. And the best part, Swift UI can have negative padding, which is genuinaly PEAK!"}, {"post_id": 57922, "ts": "2026-08-30T08:01:03Z", "hours": 8.9831, "text": "Linux + Android Support I was able to do a ton of work for the past few days. I was working on Linux Support in Rust using Iced but it was pretty difficult to use to look good since it didn’t have any native nav panel elements and required me to make my own. So I decided to go to the Android side. Working with Android Kotlin was a bit difficult at first, but then it became much much easier. It was kinda annoying that I have to import literally everything, including the conversion things. By the end of the day, my imports were basically half the file. Either way, I decided to work on the Nav Screen first, and then the Items Panel which went pretty well. I think it turned out pretty well, but if you have any feedback, share it in the comments."}, {"post_id": 54965, "ts": "2026-08-26T12:19:21Z", "hours": 6.1822, "text": "Bug Fixes + Linux UI Ok, so I added an easter egg (see if you can find it), and I also switched to the list type Nav Panel which I had implemented but stashed before. I decided to restore it because it looked better and was a bit more organised, code-wise, and I thought it would help remove the shadows to fix light mode. I also had to change the folder button to glass and I also did a bit of work on the wiki. I decided to restart with the Windows UI, and I was planning on having a NavPanel, ItemsPanel and SidePanel with GenericItem’s which could perform the role of the TOTP Field, Text Field, Password Field, etc. However, I couldn’t do that bc WinUI isn’t declaritive like SwiftUI so I had to either create a bunch of xaml files and types, or just hide and show elements. Now that I think of it, I could’ve also populated it via C++, but I already moved on to the Linux side. For Linux, I was thinking of using QT with a catppuccin theme, since I’m very very bad at making color palette’s and stuff and the palette is pretty important. Anyway, after battling with QT with QML to work on MacOS and to even configure, bc it couldn’t find the deps from Conan, I was finally able to get it to work. I’m going to start working on the NavPanel tmrw. For now, Im going to have to develop the Linux UI on Mac, but after I finish the UI, ill move onto linux to finish it off."}, {"post_id": 52140, "ts": "2026-08-22T07:17:36Z", "hours": 5.7122, "text": "Adding Tests Since I wanted to revamp the old crypto stuff to support Argon2ID, I decided to create some tests to know if I’ve implemented it correctly or if I mess smth up. It took me waaay too long to figure this out. I had to fix a lot of stuff like adding a fake Clipboard, Storage and UI Bridge just so that I could link the backend, but in the end it was worth it."}, {"post_id": 50062, "ts": "2026-08-19T03:12:28Z", "hours": 5.2053, "text": "Autofill Support Ok, so it took me a while to figure out how to implement Autofill support. I dont have the Apple Dev License yet, so unfortunatly I couldn’t test it and the only thing I could do is see compiler errors and fix them. So the way it works, is that it has a notification thing, and the extension notifies the vault app, asking for all the logins that match the website, it then puts the website in the keychain so that the app can access it and then the app checks the keychain, writes the result to the same keychain and notifies the extension. I also made this cool screenshots of it infront of a really cool bg and it looks sooo cool."}, {"post_id": 47492, "ts": "2026-08-15T13:17:45Z", "hours": 2.8094, "text": "Drag and Drop Support Usually if I want to implement a new feature, I would ask Claude how I would do it and what APIs I should use, note that Im not just vibe coding everything, Im just asking it how to do smth. This time tho, I decided not to do that and to directly look at Apple Docs, and it was pretty helpful. I was able to figure out how to implement more animations and figure out how to implement drag and drop support which was kinda hard but I was able to implement it. I also fixed a folder bug and did some stuff for the wiki."}, {"post_id": 46202, "ts": "2026-08-13T08:27:22Z", "hours": 4.7533, "text": "Multi Select Support I added a multi-select support thing so that you can press shift and select all the items you want to delete, restore, perm delete, archive or un archive. I also made it so that there would be a biometric button on the autofill unlock window and I also made it shake when the password is incorrect, its kinda fun to just press unlock 100 times to see it shake. Next, Im going to add animation and add support for device unlock."}, {"post_id": 44485, "ts": "2026-08-10T08:48:11Z", "hours": 2.1506, "text": "Archive Support Ok, so Im still waiting for the Apple Developer License so until then I can’t implement a lot of the really good features. Currently I’ve just implemented Archive Support and some fixes like to Check for missing Websocket Events . Im going to be doing a full test soon, once I finish all the features for v1.1.0. I also added a networking page for the wiki."}, {"post_id": 43171, "ts": "2026-08-08T09:09:12Z", "hours": 5.3011, "text": "Passkey + Biometric Support + Security Updates So I was talking to @/Darren and they told me that I shouldn’t store auth keys in plaintext. I didn’t think that storing the keys would be a big issue since you needed a master Password to use them, but I decided to be safe anyway and I stored them in Keychain. Currently I can’t really implement most of the Keychain stuff because I don’t have an Apple Developer License yet. I also implemented broken passkey login support and also broken biometric support. They are broken bc I can’t really use them without a dev license"}, {"post_id": 41214, "ts": "2026-08-05T09:22:47Z", "hours": 7.8433, "text": "AutoFill Unlock Window So while waiting to get the Apple Developer License for the App Group Setup and Code Signing Setup, I decided to work on AutoLock Support for v1.1.0 and the tiny AutoFill unlock window. I also tried to add support for logging in via passkeys, until I realised that I can’t since I need the dev license and I need to add my app bundle name to my vaultwarden instance for it to work. I also implemented support for clientwarden to stay open in the background. The second screenshot is just a cool little failure bc I forgot to give it a liquid glass background."}, {"post_id": 38651, "ts": "2026-08-01T04:51:47Z", "hours": 0.9225, "text": "Crypto Docs Currently Im working on the Wiki, but after that, Ill work on v1.1.0 and the security stuff for v1.0.0. There really isn’t much so say here, bc its mostly just adding more stuff so docs."}, {"post_id": 38617, "ts": "2026-08-01T03:18:13Z", "hours": 8.1911, "text": "First Release Candidate - Functionality So I was able to fix quite a few bugs and implement a bunch of the last features I needed to add for the first release candidate. So I changed the network timeout, fixed the annoying padding on some generic items, fix sync, remove duplicate ciphers, fix race conditions, fix item duplication when offline, login view exceptions, change the title placeholder to value, prevent click to copy when editing, prevent sshKey and note from creating linked field, add delete folder message and make the button red, add a custom item for identity so that there arent 4 different fields for the name, add the remove field button, create the codeql thing and fix some stuff so that clientwarden would work with the official Bitwarden servers."}, {"post_id": 36280, "ts": "2026-07-28T08:52:43Z", "hours": 5.9608, "text": "Icon + Password Generator I fixed the SSH Key Cannot decrypt error and I also finished off a few things for the beta release. I designed an icon in Icon Composer, which is a really great app btw, why can’t windows have a proper UI app like that, and fixed the cmake so that it would show up. I also changed the about page to have a uniform height. The only issue is that there is a ton of blank space, so Im probably going to have to make some art for it myself. I also made a really cool password generator UI for passwords and stuff in the Login Item. I still need to make an ssh key thing, although I might do that on the next release."}, {"post_id": 34497, "ts": "2026-07-25T08:09:36Z", "hours": 7.5661, "text": "Clipboard + Screenshot Support & Settings UI I’ve pretty much fixed most of the larger bugs so I’m currently just working on the essential missing features that ClientWarden needs. I was able to add clipboard support, settings bridge, screenshot option, finish off websocket stuff, a proper versioning system and a much better settings UI, as well as proper folder support and a reprompt window for those sensitive notes. I’m probably going to make a cool graphic for the about window soon, so stay tuned."}, {"post_id": 32232, "ts": "2026-07-21T08:36:22Z", "hours": 3.9908, "text": "Bug Fixes Currently Im just focusing on making bug fixes and then working on new features. Because I’d rather fix it and then work on new features, rather than work on new features and fix a bunch of them later. A bunch of the bugs were caused by the vault rewrite or just me forgetting to finish implementing it. Anyway, so I fixed the Upload, Remove and Download Attachment, as well as the Add Website Button, invalid password vault unlock crash, I also made it to preserve the current tab (Bitwarden or Custom Server), refresh items panel every 5s, remove password after login and unlock, edit when creating an item, show deletion date and show password history date. I also noticed that when I create an empty ssh key and edit it with bitwarden, it fails, making a [cannot decrypt] error."}, {"post_id": 31048, "ts": "2026-07-19T04:02:54Z", "hours": 6.5961, "text": "Bug Fixes So I’ve done a lot of stuff. I just finished porting the Vault UI Bridge to the new Vault API which requires you to get an item from Vault. I also forgot to implement saving support for Card, Identity, Note and SSH Key, so I implemented that too. Also I fixed the favorites issue. I also fixed the TOTP field, bc when it was empty it would just have no code and would still show. The only other bugs I have left to fix are the add website bug, attachment bug and password preservation bug. Then I can get started on the other features like folder support, password gen support, pfp support, folder tree view support and clipboard support."}, {"post_id": 27540, "ts": "2026-07-13T06:03:33Z", "hours": 9.4325, "text": "Vault Rewrite The Vault rewrite is going pretty well so far. I’ve already finished the Vault Rewrite, but the only thing I have left is porting the old GenericItem stuff to the new Vault. At first, I was just fixing stuff that ended up in the error log, which was a bad idea, so I decided to skim through all the files and fix them as I saw them, which went pretty well. @/Dexrn suggested that I should make builders like Generic Item from the Vault and to have all the other Login Item and stuff a derived class from Generic Item using templates so that GenericItem would still output a LoginItem*. So I decided to have the normal Generic Item and then an Impl one based on Generic Item with all the Implementation functions in a protected part in Generic Item. Then Generic Item has its own GenericItem* ones, but the derived ones have their own LoginItem* ones from GenericItem Impl. Its pretty confusing but its easier to understand once you have a look. There is just a bit code that I need to fix, mainly CW Thread and then I should be done"}, {"post_id": 25053, "ts": "2026-07-09T00:31:15Z", "hours": 9.2058, "text": "Vault Rewrite So I’ve faced a couple of vault bugs over the past few days like [error could not decrypt] which is a serious error that could destroy anyone’s Bitwarden vault. The other issue that I’d been delaying for a while was the Vault Revamp, since the vault was incredibly messy and held stuff for networking, crypto and session, so I decided to start from scratch and copy and fix the code as I went. When I started from scratch, my mind went blank, I didn’t even know where to start, since the Network stuff needed session stuff and the crypto stuff, so I was beyond confused. I spent a day or two figuring it out, with no success. Then I asked ChatGPT because my Claude credits had just expired, and the second it gave me an answer, I knew I was cooked. I then asked Gemini, with the same results. Afterward I asked Claude, and the solution it gave me didn’t really work. It did tell me that it was a good idea to separate it into a Network, Session and Crypto class. Then I asked @/dexrn and they helped me figure out how to separate it. Essentially, what I ended up with is Vault does the CreateItem stuff which calls funcs in the Network and Session classes. The crypto class only holds the funcs and so does the Networking class. The session class holds all the vaultData and secret data."}, {"post_id": 22899, "ts": "2026-07-05T15:17:31Z", "hours": 5.5311, "text": "Attachment Support + Bug Fixes I was able to clean up the messy bridge code and add attachment support. I also fixed some bugs, like when you enter an incorrect email or password, it would crash the whole app in the login view, and also I added an error toast for each of the errors. I still need to implement a ton more stuff, like the freezing issue with the vault and the random signouts as well as making the vault faster."}, {"post_id": 21377, "ts": "2026-07-03T08:49:22Z", "hours": 3.5994, "text": "Login Item Support - SidePane I was able to finish the login viewer part of the SidePane which is the hardest part since it needs to show not only the username and password, but the totp code and the websites part. The only other part I need to work on, is the attachments callback and the card, identity, note and sshKey parts. I also fixed the padding for the details on the bottom which were touching the very bottom. I also had to add a few funcs into the backend to get the creation, modification and deletion date."}, {"post_id": 20630, "ts": "2026-07-02T08:35:03Z", "hours": 1.6858, "text": "Bug Fixes I was able to fix a few things in the Nav Panel Bridge, mainly renaming support. I also implemented Items Panel and a bit of the SidePanel. The Sidepanel is the hardest part, especially the part where it needs to save and the part where it needs to be populated. I also made items to automatically open when they are created. The only other things that I need to do are PFP support, make the vault faster, implement the bridge for the settings menu, add an option to allow screenshotting in settings and fix the random signouts in the vault."}, {"post_id": 19834, "ts": "2026-07-01T07:09:40Z", "hours": 2.8203, "text": "Finish up Nav Panel Bridge So I was able to finish building the Nav Panel Bridge. It was a bit difficult since I needed to fix a few things in the UI code, so that it could map the callbacks correctly. For some reason, Objective-C doesn’t have any syntax highlighting and it doesn’t check for errors at compile time, so you just end up with it breaking at runtime. I also forgot to add a UI element to rename the folder and the Vault is kinda slow to open. I also need to highlight the selected Item and add an animation for when the window extends."}, {"post_id": 19089, "ts": "2026-06-30T09:19:54Z", "hours": 4.2778, "text": "Start on the UI Bridge I was able to wire up the Vault and the UI today. I haven’t finished adding callbacks for the NavPanel or the Items Panel or the SidePanel, which is pretty much the whole vault, but I was able to do the Login, Unlock and ClientwardenApp callbacks. I had to make these callbacks in objective c, and it was soo hard, bc there wasn’t any good syntax highlighting and if there was an error, I had to wait for it to build and then look through the messy build logs and figure out what was wrong. I also noticed that the password field was a normal text field so I changed that and I also made it so that you can’t screenshot the vault. The login and unlock buttons also behaved kinda weird, so I fixed that. The only part of the Login Page that I haven’t done yet is the profile picture. I also added a loading screen btw."}, {"post_id": 18212, "ts": "2026-06-29T08:45:08Z", "hours": 2.1806, "text": "Cleaning Up Item Classes I decided to clean up my backend Vault Code since the item management code was pretty much the same copy pasted thing, so I decided to make all item classes, LoginItem, CardItem, IdentityItem, NoteItem, SSHKeyItem, a derived class from GenericItem. This was pretty difficult tho, because GenericItem returns GenericItem, and LoginItem and all the rest need GenericItem to return their class. I asked @dexrn , and they told me about covariant returns, where basically you can return GenericItem but then override it in LoginItem and return a LoginItem by calling the the GenericItem func and then converting it to LoginItem. I also noticed that the attachment code in the individual Item classes were out of date, so this helped organise them. There isn’t really much so show so Ill just post a scrshot of the build."}, {"post_id": 18120, "ts": "2026-06-29T04:02:19Z", "hours": 2.7272, "text": "Settings Page + Lock Support + Attachment Item So I was able to finish off some simple tasks as well as adding a settings page, a lock button on the menu bar under Vault and making the trash tool bar icons. I also added an Attachment Item with a progress bar. I also fixed added a proper roadmap in the readme for Mac OS, Windows and Linux Support. After I get MacOS working, ill probably replace the Windows image with a Mac OS one."}, {"post_id": 17487, "ts": "2026-06-28T09:13:47Z", "hours": 2.6439, "text": "UI States So I was able to finish off the UI by adding a Login and Unlock Page and adding states so that when the app runs, a getState callback func is run to know if the vault should present the Login Page or the Unlock Page. Once the vault is Unlocked or Logged into, the state will be switched to VaultUI. I also made the Unlock page fixed to a small window since it doesn’t really present much info."}, {"post_id": 17336, "ts": "2026-06-28T02:31:50Z", "hours": 1.5056, "text": "Unfortunatly, just as I was going to push my changes after the last devlog, I wanted to remove some files, so I ran git-filter-repo and it removed all my staged files. So basically, pretty much all the work I did for the past 4h yesterday were gone. I tried using reflog and even Disk Drill, but I wasn’t able to get it back. Thankfully, while I was trying to figure out how animations worked yesterday by asking claude, some of my code was there. It wasn’t a lot but I was able to reconstruct the rest from memory. I did remember some things today as well so I fixed those too. There will be another devlog today so stay tuned."}, {"post_id": 16805, "ts": "2026-06-27T09:05:03Z", "hours": 3.9606, "text": "Finish off Item Panel + Bug Fixes I was able to finish off the Items Panel by making the search bar and the new item button. I also fixed the animation issue that was present before. I also added some content things where it says No Items and stuff so that it doesnt look incomplete and blank. I was able to also get it to run in CMake and get it built into an app. There is still much to do, like changing the icon and making a github actions thing, and the UI Bridge. The UI Bridge should be pretty easy, hopefully."}, {"post_id": 16250, "ts": "2026-06-26T12:17:21Z", "hours": 7.1319, "text": "Finish off SidePanel + Nav Panel + Items Panel I spent wayy too long getting animations to work and it still doesnt work. Anyway, so I was able to finish off the SidePanel and the Navigation Panel as well as the Items Panel. The Navigation Panel now has a callback which passes the Items which are then passed to ItemsPanel to display them. The issue is that I can’t create an animation because of Swift States or smth. If I go to another navigation tab and then go back, the animation doesnt apply. I also added a mininum window width and height. I almost forgot, I was also able to add edit support which involved rewriting a bunch of code."}, {"post_id": 15581, "ts": "2026-06-25T10:44:28Z", "hours": 5.0989, "text": "Finished Generic Item + Field Item Ok, so I got a lot done. I was able to finish creating Generic Item and FieldItem. I decided to combine Websites in the Generic Item struct since it was going to be grouped together anyway, but maybe I should make a derived struct or class or smth next time. I might try and clean it up tho, because I’d rather clean it up now rather than never. I also added the TOTP and Websites Editable thing which were the hardest parts to add. Here are a couple of screenshots of all the stuff I’ve added."}, {"post_id": 14310, "ts": "2026-06-23T12:12:27Z", "hours": 3.505, "text": "Sidepane Stuff I was able to get most of the sidepane working. The only thing I have left is the custom fields and the bottom dates and attachment stuff. I used an array of a data struct which is used to store the fields that need to be displayed. This way I can separate the UI from the Vault UI code and the Vault. The VaultUI just bridges the Vault and UI code. I think it looks good so far, and I even added a nice glow effect when you reveal a password or item."}, {"post_id": 13657, "ts": "2026-06-22T12:38:01Z", "hours": 6.0439, "text": "UI Design So I made a lot of progress in designing the UI for the native MacOS version. It was really fun to design a UI with liquid glass. Usually I don’t like liquid glass on phones, but on a computer it really looks good. But when I try and close the nav menu, it has this sliding animation where it goes underneath the other icons with the border which looks kinda off. Im not too sure how to disable the collapse button, but it should be fine for now. Ive implemented an error modal as well to notify the user of errors instead of making them read the log files. The font kinda looks off and the sizing as well, but Im not sure how to fix it. If you know how to improve it, tell me in the comments. Next devlog, Im going to try and get it to work with cmake or ill just keep developing the UI."}, {"post_id": 12945, "ts": "2026-06-21T05:50:19Z", "hours": 1.4514, "text": "Switch to MacOS tbh the WinUI code is insanely messy and needs to be fixed, so I’ll be fixing it later. I think it would be good for me to start on the mac os side of things because it would allow me to work on less messy code. I think it would be much better to work on new code rather than fixing old code. There are still a ton of random bugs where sometimes editing will not work and some things will fail randomly."}, {"post_id": 12353, "ts": "2026-06-20T04:48:39Z", "hours": 2.2797, "text": "Getting ClientWarden Working Again! After almost 2 weeks of setting up my mac, I was finally able to create a windows VM and get Clientwarden to build on ARM64. Although it was a bit difficult. First I needed to get all the vcpkg dependencies, so I did vcpkg install. One of the dependencies was boost which needed to build some python library. For some reason it was giving me a heap error stating that it didn’t have enough heap space. I looked at task manager and it did indeed use up all my 8GB of ram. I tried increasing my windows swap but it didn’t work, so I had to increase the ram on the vm to 64GB, even though I had 16GB of ram. Mac OS was able to speedily transfer and compress all that memory to its swap, and after a while, it finally built the lib taking about ~30GB of memory"}, {"post_id": 3375, "ts": "2026-06-06T08:29:39Z", "hours": 1.6608, "text": "Bug Fixes I finally got the bugs fixed and after a long time of debugging I was able to fix the folder error. I still have a ton of bugs to fix, but the folder one was the hardest one so far."}, {"post_id": 192, "ts": "2026-06-01T07:02:56Z", "hours": 1.2086, "text": "Quality Checks + Documentation I just finished quality checking the whole app and it is kinda buggy in some places so I decided to write it all down. I want to address these bugs before I work on more features, as well as documenting the code and the Bitwarden/Vaultwarden API. Vaultwarden API is a mess of the old and new Bitwarden API. Anyway I caught a ton of bugs that I will address before finishing off WebSockets."}]...
|
Title: Clientwarden by @CT5 | Stardance
Devlogs:
Title: Clientwarden by @CT5 | Stardance
Devlogs:
Quality Checks + Documentation I just finished quality checking the whole app and it is kinda buggy in some places so I decided to write it all down. I want to address these bugs before I work on more features, as well as documenting the code and the Bitwarden/Vaultwarden API. Vaultwarden API is a mess of the old and new Bitwarden API. Anyway I caught a ton of bugs that I will address before finishing off WebSockets.
Bug Fixes I finally got the bugs fixed and after a long time of debugging I was able to fix the folder error. I still have a ton of bugs to fix, but the folder one was the hardest one so far.
Getting ClientWarden Working Again! After almost 2 weeks of setting up my mac, I was finally able to create a windows VM and get Clientwarden to build on ARM64. Although it was a bit difficult. First I needed to get all the vcpkg dependencies, so I did vcpkg install. One of the dependencies was boost which needed to build some python library. For some reason it was giving me a heap error stating that it didn’t have enough heap space. I looked at task manager and it did indeed use up all my 8GB of ram. I tried increasing my windows swap but it didn’t work, so I had to increase the ram on the vm to 64GB, even though I had 16GB of ram. Mac OS was able to speedily transfer and compress all that memory to its swap, and after a while, it finally built the lib taking about ~30GB of memory
Switch to MacOS tbh the WinUI code is insanely messy and needs to be fixed, so I’ll be fixing it later. I think it would be good for me to start on the mac os side of things because it would allow me to work on less messy code. I think it would be much better to work on new code rather than fixing old code. There are still a ton of random bugs where sometimes editing will not work and some things will fail randomly.
UI Design So I made a lot of progress in designing the UI for the native MacOS version. It was really fun to design a UI with liquid glass. Usually I don’t like liquid glass on phones, but on a computer it really looks good. But when I try and close the nav menu, it has this sliding animation where it goes underneath the other icons with the border which looks kinda off. Im not too sure how to disable the collapse button, but it should be fine for now. Ive implemented an error modal as well to notify the user of errors instead of making them read the log files. The font kinda looks off and the sizing as well, but Im not sure how to fix it. If you know how to improve it, tell me in the comments. Next devlog, Im going to try and get it to work with cmake or ill just keep developing the UI.
Sidepane Stuff I was able to get most of the sidepane working. The only thing I have left is the custom fields and the bottom dates and attachment stuff. I used an array of a data struct which is used to store the fields that need to be displayed. This way I can separate the UI from the Vault UI code and the Vault. The VaultUI just bridges the Vault and UI code. I think it looks good so far, and I even added a nice glow effect when you reveal a password or item.
Finished Generic Item + Field Item Ok, so I got a lot done. I was able to finish creating Generic Item and FieldItem. I decided to combine Websites in the Generic Item struct since it was going to be grouped together anyway, but maybe I should make a derived struct or class or smth next time. I might try and clean it up tho, because I’d rather clean it up now rather than never. I also added the TOTP and Websites Editable thing which were the hardest parts to add. Here are a couple of screenshots of all the stuff I’ve added.
Finish off SidePanel + Nav Panel + Items Panel I spent wayy too long getting animations to work and it still doesnt work. Anyway, so I was able to finish off the SidePanel and the Navigation Panel as well as the Items Panel. The Navigation Panel now has a callback which passes the Items which are then passed to ItemsPanel to display them. The issue is that I can’t create an animation because of Swift States or smth. If I go to another navigation tab and then go back, the animation doesnt apply. I also added a mininum window width and height. I almost forgot, I was also able to add edit support which involved rewriting a bunch of code.
Finish off Item Panel + Bug Fixes I was able to finish off the Items Panel by making the search bar and the new item button. I also fixed the animation issue that was present before. I also added some content things where it says No Items and stuff so that it doesnt look incomplete and blank. I was able to also get it to run in CMake and get it built into an app. There is still much to do, like changing the icon and making a github actions thing, and the UI Bridge. The UI Bridge should be pretty easy, hopefully.
Unfortunatly, just as I was going to push my changes after the last devlog, I wanted to remove some files, so I ran git-filter-repo and it removed all my staged files. So basically, pretty much all the work I did for the past 4h yesterday were gone. I tried using reflog and even Disk Drill, but I wasn’t able to get it back. Thankfully, while I was trying to figure out how animations worked yesterday by asking claude, some of my code was there. It wasn’t a lot but I was able to reconstruct the rest from memory. I did remember some things today as well so I fixed those too. There will be another devlog today so stay tuned.
UI States So I was able to finish off the UI by adding a Login and Unlock Page and adding states so that when the app runs, a getState callback func is run to know if the vault should present the Login Page or the Unlock Page. Once the vault is Unlocked or Logged into, the state will be switched to VaultUI. I also made the Unlock page fixed to a small window since it doesn’t really present much info.
Settings Page + Lock Support + Attachment Item So I was able to finish off some simple tasks as well as adding a settings page, a lock button on the menu bar under Vault and making the trash tool bar icons. I also added an Attachment Item with a progress bar. I also fixed added a proper roadmap in the readme for Mac OS, Windows and Linux Support. After I get MacOS working, ill probably replace the Windows image with a Mac OS one.
Cleaning Up Item Classes I decided to clean up my backend Vault Code since the item management code was pretty much the same copy pasted thing, so I decided to make all item classes, LoginItem, CardItem, IdentityItem, NoteItem, SSHKeyItem, a derived class from GenericItem. This was pretty difficult tho, because GenericItem returns GenericItem, and LoginItem and all the rest need GenericItem to return their class. I asked @dexrn , and they told me about covariant returns, where basically you can return GenericItem but then override it in LoginItem and return a LoginItem by calling the the GenericItem func and then converting it to LoginItem. I also noticed that the attachment code in the individual Item classes were out of date, so this helped organise them. There isn’t really much so show so Ill just post a scrshot of the build.
Start on the UI Bridge I was able to wire up the Vault and the UI today. I haven’t finished adding callbacks for the NavPanel or the Items Panel or the SidePanel, which is pretty much the whole vault, but I was able to do the Login, Unlock and ClientwardenApp callbacks. I had to make these callbacks in objective c, and it was soo hard, bc there wasn’t any good syntax highlighting and if there was an error, I had to wait for it to build and then look through the messy build logs and figure out what was wrong. I also noticed that the password field was a normal text field so I changed that and I also made it so that you can’t screenshot the vault. The login and unlock buttons also behaved kinda weird, so I fixed that. The only part of the Login Page that I haven’t done yet is the profile picture. I also added a loading screen btw.
Finish up Nav Panel Bridge So I was able to finish building the Nav Panel Bridge. It was a bit difficult since I needed to fix a few things in the UI code, so that it could map the callbacks correctly. For some reason, Objective-C doesn’t have any syntax highlighting and it doesn’t check for errors at compile time, so you just end up with it breaking at runtime. I also forgot to add a UI element to rename the folder and the Vault is kinda slow to open. I also need to highlight the selected Item and add an animation for when the window extends.
Bug Fixes I was able to fix a few things in the Nav Panel Bridge, mainly renaming support. I also implemented Items Panel and a bit of the SidePanel. The Sidepanel is the hardest part, especially the part where it needs to save and the part where it needs to be populated. I also made items to automatically open when they are created. The only other things that I need to do are PFP support, make the vault faster, implement the bridge for the settings menu, add an option to allow screenshotting in settings and fix the random signouts in the vault.
Login Item Support - SidePane I was able to finish the login viewer part of the SidePane which is the hardest part since it needs to show not only the username and password, but the totp code and the websites part. The only other part I need to work on, is the attachments callback and the card, identity, note and sshKey parts. I also fixed the padding for the details on the bottom which were touching the very bottom. I also had to add a few funcs into the backend to get the creation, modification and deletion date.
Attachment Support + Bug Fixes I was able to clean up the messy bridge code and add attachment support. I also fixed some bugs, like when you enter an incorrect email or password, it would crash the whole app in the login view, and also I added an error toast for each of the errors. I still need to implement a ton more stuff, like the freezing issue with the vault and the random signouts as well as making the vault faster.
Vault Rewrite So I’ve faced a couple of vault bugs over the past few days like [error could not decrypt] which is a serious error that could destroy anyone’s Bitwarden vault. The other issue that I’d been delaying for a while was the Vault Revamp, since the vault was incredibly messy and held stuff for networking, crypto and session, so I decided to start from scratch and copy and fix the code as I went. When I started from scratch, my mind went blank, I didn’t even know where to start, since the Network stuff needed session stuff and the crypto stuff, so I was beyond confused. I spent a day or two figuring it out, with no success. Then I asked ChatGPT because my Claude credits had just expired, and the second it gave me an answer, I knew I was cooked. I then asked Gemini, with the same results. Afterward I asked Claude, and the solution it gave me didn’t really work. It did tell me that it was a good idea to separate it into a Network, Session and Crypto class. Then I asked @/dexrn and they helped me figure out how to separate it. Essentially, what I ended up with is Vault does the CreateItem stuff which calls funcs in the Network and Session classes. The crypto class only holds the funcs and so does the Networking class. The session class holds all the vaultData and secret data.
Vault Rewrite The Vault rewrite is going pretty well so far. I’ve already finished the Vault Rewrite, but the only thing I have left is porting the old GenericItem stuff to the new Vault. At first, I was just fixing stuff that ended up in the error log, which was a bad idea, so I decided to skim through all the files and fix them as I saw them, which went pretty well. @/Dexrn suggested that I should make builders like Generic Item from the Vault and to have all the other Login Item and stuff a derived class from Generic Item using templates so that GenericItem would still output a LoginItem*. So I decided to have the normal Generic Item and then an Impl one based on Generic Item with all the Implementation functions in a protected part in Generic Item. Then Generic Item has its own GenericItem* ones, but the derived ones have their own LoginItem* ones from GenericItem Impl. Its pretty confusing but its easier to understand once you have a look. There is just a bit code that I need to fix, mainly CW Thread and then I should be done
Bug Fixes So I’ve done a lot of stuff. I just finished porting the Vault UI Bridge to the new Vault API which requires you to get an item from Vault. I also forgot to implement saving support for Card, Identity, Note and SSH Key, so I implemented that too. Also I fixed the favorites issue. I also fixed the TOTP field, bc when it was empty it would just have no code and would still show. The only other bugs I have left to fix are the add website bug, attachment bug and password preservation bug. Then I can get started on the other features like folder support, password gen support, pfp support, folder tree view support and clipboard support.
Bug Fixes Currently Im just focusing on making bug fixes and then working on new features. Because I’d rather fix it and then work on new features, rather than work on new features and fix a bunch of them later. A bunch of the bugs were caused by the vault rewrite or just me forgetting to finish implementing it. Anyway, so I fixed the Upload, Remove and Download Attachment, as well as the Add Website Button, invalid password vault unlock crash, I also made it to preserve the current tab (Bitwarden or Custom Server), refresh items panel every 5s, remove password after login and unlock, edit when creating an item, show deletion date and show password history date. I also noticed that when I create an empty ssh key and edit it with bitwarden, it fails, making a [cannot decrypt] error.
Clipboard + Screenshot Support & Settings UI I’ve pretty much fixed most of the larger bugs so I’m currently just working on the essential missing features that ClientWarden needs. I was able to add clipboard support, settings bridge, screenshot option, finish off websocket stuff, a proper versioning system and a much better settings UI, as well as proper folder support and a reprompt window for those sensitive notes. I’m probably going to make a cool graphic for the about window soon, so stay tuned.
Icon + Password Generator I fixed the SSH Key Cannot decrypt error and I also finished off a few things for the beta release. I designed an icon in Icon Composer, which is a really great app btw, why can’t windows have a proper UI app like that, and fixed the cmake so that it would show up. I also changed the about page to have a uniform height. The only issue is that there is a ton of blank space, so Im probably going to have to make some art for it myself. I also made a really cool password generator UI for passwords and stuff in the Login Item. I still need to make an ssh key thing, although I might do that on the next release.
First Release Candidate - Functionality So I was able to fix quite a few bugs and implement a bunch of the last features I needed to add for the first release candidate. So I changed the network timeout, fixed the annoying padding on some generic items, fix sync, remove duplicate ciphers, fix race conditions, fix item duplication when offline, login view exceptions, change the title placeholder to value, prevent click to copy when editing, prevent sshKey and note from creating linked field, add delete folder message and make the button red, add a custom item for identity so that there arent 4 different fields for the name, add the remove field button, create the codeql thing and fix some stuff so that clientwarden would work with the official Bitwarden servers.
Crypto Docs Currently Im working on the Wiki, but after that, Ill work on v1.1.0 and the security stuff for v1.0.0. There really isn’t much so say here, bc its mostly just adding more stuff so docs.
AutoFill Unlock Window So while waiting to get the Apple Developer License for the App Group Setup and Code Signing Setup, I decided to work on AutoLock Support for v1.1.0 and the tiny AutoFill unlock window. I also tried to add support for logging in via passkeys, until I realised that I can’t since I need the dev license and I need to add my app bundle name to my vaultwarden instance for it to work. I also implemented support for clientwarden to stay open in the background. The second screenshot is just a cool little failure bc I forgot to give it a liquid glass background.
Passkey + Biometric Support + Security Updates So I was talking to @/Darren and they told me that I shouldn’t store auth keys in plaintext. I didn’t think that storing the keys would be a big issue since you needed a master Password to use them, but I decided to be safe anyway and I stored them in Keychain. Currently I can’t really implement most of the Keychain stuff because I don’t have an Apple Developer License yet. I also implemented broken passkey login support and also broken biometric support. They are broken bc I can’t really use them without a dev license
Archive Support Ok, so Im still waiting for the Apple Developer License so until then I can’t implement a lot of the really good features. Currently I’ve just implemented Archive Support and some fixes like to Check for missing Websocket Events . Im going to be doing a full test soon, once I finish all the features for v1.1.0. I also added a networking page for the wiki.
Multi Select Support I added a multi-select support thing so that you can press shift and select all the items you want to delete, restore, perm delete, archive or un archive. I also made it so that there would be a biometric button on the autofill unlock window and I also made it shake when the password is incorrect, its kinda fun to just press unlock 100 times to see it shake. Next, Im going to add animation and add support for device unlock.
Drag and Drop Support Usually if I want to implement a new feature, I would ask Claude how I would do it and what APIs I should use, note that Im not just vibe coding everything, Im just asking it how to do smth. This time tho, I decided not to do that and to directly look at Apple Docs, and it was pretty helpful. I was able to figure out how to implement more animations and figure out how to implement drag and drop support which was kinda hard but I was able to implement it. I also fixed a folder bug and did some stuff for the wiki.
Autofill Support Ok, so it took me a while to figure out how to implement Autofill support. I dont have the Apple Dev License yet, so unfortunatly I couldn’t test it and the only thing I could do is see compiler errors and fix them. So the way it works, is that it has a notification thing, and the extension notifies the vault app, asking for all the logins that match the website, it then puts the website in the keychain so that the app can access it and then the app checks the keychain, writes the result to the same keychain and notifies the extension. I also made this cool screenshots of it infront of a really cool bg and it looks sooo cool.
Adding Tests Since I wanted to revamp the old crypto stuff to support Argon2ID, I decided to create some tests to know if I’ve implemented it correctly or if I mess smth up. It took me waaay too long to figure this out. I had to fix a lot of stuff like adding a fake Clipboard, Storage and UI Bridge just so that I could link the backend, but in the end it was worth it.
Bug Fixes + Linux UI Ok, so I added an easter egg (see if you can find it), and I also switched to the list type Nav Panel which I had implemented but stashed before. I decided to restore it because it looked better and was a bit more organised, code-wise, and I thought it would help remove the shadows to fix light mode. I also had to change the folder button to glass and I also did a bit of work on the wiki. I decided to restart with the Windows UI, and I was planning on having a NavPanel, ItemsPanel and SidePanel with GenericItem’s which could perform the role of the TOTP Field, Text Field, Password Field, etc. However, I couldn’t do that bc WinUI isn’t declaritive like SwiftUI so I had to either create a bunch of xaml files and types, or just hide and show elements. Now that I think of it, I could’ve also populated it via C++, but I already moved on to the Linux side. For Linux, I was thinking of using QT with a catppuccin theme, since I’m very very bad at making color palette’s and stuff and the palette is pretty important. Anyway, after battling with QT with QML to work on MacOS and to even configure, bc it couldn’t find the deps from Conan, I was finally able to get it to work. I’m going to start working on the NavPanel tmrw. For now, Im going to have to develop the Linux UI on Mac, but after I finish the UI, ill move onto linux to finish it off.
Linux + Android Support I was able to do a ton of work for the past few days. I was working on Linux Support in Rust using Iced but it was pretty difficult to use to look good since it didn’t have any native nav panel elements and required me to make my own. So I decided to go to the Android side. Working with Android Kotlin was a bit difficult at first, but then it became much much easier. It was kinda annoying that I have to import literally everything, including the conversion things. By the end of the day, my imports were basically half the file. Either way, I decided to work on the Nav Screen first, and then the Items Panel which went pretty well. I think it turned out pretty well, but if you have any feedback, share it in the comments.
Android Support So I decided to work mainly on Android UI Support for now and then move onto Iced on Linux. I was able to work on the Details Screen as well as finish the Items Screen and fix some main stuff for the Nav Screen like adding Folder support and stuff. I also started work on getting the Android UI to compile on CMake and it looks like its going to be way harder than I thought it would be initially. Tbh it looks like Apple’s XCode Swift UI combo is generally the best, since they have a declarative style UI and things are pretty easy to Implement. With Windows, its XAML which wouldn’t fit in my situation, and for Android its almost perfect, except gradle is a pain and there a hundred types of everything, like the IconButton , Button , FilledTonalButton , TextButton , etc, and those are just the ones I learnt rn. Unlike Android, SwiftUI just has one type of button which can do everything which is pretty good for beginners and advanced ppl. And the best part, Swift UI can have negative padding, which is genuinaly PEAK!
Android UI - Details Screen I was able to implement the Password History Screen as well as the Reprompt UI and the Clientwarden Image class so that I can use an Image, Icon or App Resource. I still need to add a progress bar to the Attachment Item, Add callbacks for the top bar, add multi select support (tbh i dont really know how Im going to implement this) and do the rest of the stuff from the readme. I do want to focus more on the Mac OS side as well, bc I want to support Golden Gate and add a few features. The Main features that need to be implemented are the Sign Up support, Offline Vault support, and a ton more. If you want to help with the project, dm me at @CT5 on slack.
Finished Android UI So I was able to finally finish off the Android UI, and I was able to finish it off dramatically faster than I spent on the Mac OS UI. Mainly because, with the Mac OS UI, I had to spend a lot more time on the architecture and I had to revamp the Vault itself. My favorite part about making the UI is the About Screen, where I can hide tons of really cool effects and easter egg. If you download the Android App and go to Settings and about, you will see an App Icon which if you click 3 times, will spin around, kinda like the chrome easter egg.
Mac OS 27 Support + Tests I recently switched to Mac OS 27 Public Beta, which turned out to a very bad idea, as I hated the new icons and especially the new lighter glass. I was hoping that when MacOS 27 actually releases it would be fixed. Well, it released, and it wasn’t fixed. So I had to fix the UI for MacOS 27 and it was kinda pending anyway since it was sorta against Apple’s UI guidelines, but it looked amazing. The new one doesnt look as good, but its ok. Ill be fixing it in the days to come. I’m also working on more tests, specifically for the network part, since the network part is an important part of the vault.
New Bitwarden Fields (Passport, Drivers License, Bank Account) So I was just looking at the vault.json in ClientWarden to check something, and I noticed that the data field was missing, which was pretty weird since Bitwarden or VaultWarden will not accept or respond with a json without a data field. When I looked closer, they had also added new fields like passport , bankAccount and driversLicense which means they added new Item Types. These Item Types aren’t supported yet, but I might as well implement them so that Clientwarden supports them early. Right now, you can create and see the new Item Types, but I havent implemented support to view or edit these new types.
Bug Fixes + Code Cleanup + Documentation Since I didn’t really have much to do, I decided to prepare my app for release. Currently there are quite a few things wrong with Clientwarden. First, it has tons of bugs, and the code is sorta messy, and the architecture is also kinda borked. The whole point of the past revamp was to prevent a God Class like last time where Vault held pretty much everything. Its much better now, but its far from perfect. This time, Im actually going to make a whole style guide and an architecture plan/guide which should be good. After that, I can actually implement the new architecture and then fix the remaining bugs. Tomorrow, ill probably do a more in depth test of the app and then fix them and repeat before actually trying to re-architecture.
Vault Re-Architecturing (again) So I again noticed a few bugs like last time, and had a think about the Vault itself. I noticed that its getting kinda complicated and things are getting intertwined and there are funcs that arent used, and func of which I dont even know what they do. So unlike last time, where I just asked claude how to structure things, I decided to do some proper professional re-archtecturing. I already had an overall plan on how things were going to be structured, but it was pretty hard. The doc format I decided to use was ARC42 which is a guide on how to make a proper software architecture doc. I did skip a few things, but those werent really relevant in my case so thats fine. I also decided to make a style guide since things were getting kinda messy. I havent fully finished the style guide yet, but its a start and I really need to get this new vault finished before Stardance ends. If you want to look at the doc, its on my GitHub Wiki and its pretty straightforward and extensive. It did take me quite a while to think of everything in depth, so I will be spending a ton more time since software architecturing is pretty difficult.
Vault Re-Architecturing - Part 2 So I started working on the architecture and it was pretty difficult. I was able to add the crypto, netowrk, orchestrator, profile, runtime, settings, sync and versioning. So currently, I’ve decieded to expose only the orchestrator, settings and versioning because those are the only essential features that the UI requires, and exposing any more would re-create a God Class. Essentially, this time I decided to abstract it enough so that it would work with 1Pass and Bitwarden as a guide so that it would be abstract enough, even though I’m probably never going to support another password manager API. One thing I didn’t account for was the fact that BitWarden has an Organisation thing where the Organisation has its own keys and stuff, which pretty much requires me to re-architecture it again. Im probably not going to implement the organisation thing any time soon, so I should be fine for now. I’m hoping to finish with the structure today and start on the implementations tmrw.
Finishing off the New Architecture So I was able to finish off the Architecture Implementations and add a few more classes, like the Thread and Utils files. I also added a ton of comments (one per func & one per class/struct) as per the style guidelines that I wrote. Writing the comments took me waaay too long, since some funcs were pretty generic and I couldnt think of what comment to put for that func. I still have a ton more to do, like the Generic Item Stuff which is really really confusing and I havent even gotten to that part yet. After all that, I need to start on the BitWarden Vendor stuff and then integrate all that into the UI Bridge which shouldnt be too hard.
BitWarden Vendor Architecture - Part 1 Now that I’ve completed the Generic Base classes and stuff, I decided to work on the Vendor stuff. The main goal of the Architecturing is to make the architecture loose enough to work with BitWarden and 1Password, since if I focused solely on BitWarden again, it would have ended up being less abstract and I wanted it to be as abstract as possible without complicating things too much. Anyway, so I was able to finish off the crypto class and get started on the network class which pretty good progress. I did think of some additional ways to make it abstract, like making the UI call the Network class to get a list of all the URLs needed. Im hoping to get all the vendor classes finished by the end of next week and then start fixing the UI and UI Bridge in the following week.
BitWarden Vendor Architecture - Part 2 So I was able to finish off the BitWarden Network part which was somewhat hard, but it was just mainly repetitive stuff. I also got started on the BitWarden Runtime which wasnt too hard, although its sorta difficult to wrap your head around. After I finish off the runtime, I should be able to get started on the orchestrator and sync and versioning parts. For the Bitwarden Network I decided to integrate some stuff from the previous orchestrator that was wouldve been better to have in the Network and the same thing with Runtime as well.
BitWarden Vendor Architecture - Part 3 Making the orchestrator is pretty difficult because tying everything together is soo difficult, especially with the attachment stuff. BitWarden has some weird concepts on how it works. When creating an item and pushing it to the server, the server generates the id for you and sends the whole cipher back. However, if the network request fails halfway through, then it can create it online, without giving you the id. There are 3 solutions to this. One, is to just re-push, which creates a duplicate. Another way to fix this, is to leave it and fail, which is not a good idea. The best way to combat this situation, is to pull the items from the server, and find the one that was created by comparing the key from the local and remote vaults. The issue, is that sometimes, there is no key, so we have to rely on comparing the fields alone, which isnt the best, but its the only way. This is pretty difficult to think of on the spot and to resolve quickly, so thats why it took me so long. The other issue, is that I’ve faced a roadblock. I didnt think of attachments when designing the runtime class, so I have to add more funcs to help with offline attachments. Another issue, is that the runtime class is getting kinda messy now, since there are like 5 of the same type of funcs so I have to clean that up too. And then, I have the largest issue that I have to fix. Syncing. Syncing is a pretty weird concept on BitWarden. If you update an item offline, you dont change the revision Date, the version changes it. However, if the server’s item was changed as well, then it gets complicated because you need to handle it yourself. The first thing you can do, is to merge the individual fields, like if the name was changed on the server, and the username was changed on the client, then merge both. However if the name was changed on the server and the client, then you can create a new item with (conflict X) and then push that. All this is pretty complicated, and its probably going to get even more complicated soon.
BitWarden Vendor Architecture - Part 4 I forgot to devlog today, so consider this 8h and 30mins and add 30mins to the next devlog. I finally finished Orchestrator which took waaaay too much time (almost 5 days) and I had to fix my plan a bit as well because of the roadblocks. Finishing off the rest of it was pretty easy and starting on the Sync class was much easier due to the massive amount of time it took for me to think of a solution to the syncing issue in the midst of the Orchestrator issues. Ill be posting a Sync finished devlog soon, probably tmrw, so stay tuned!
BitWarden Vendor Architecture - Part 5 I kinda hoped that Sync would be easier but its pretty much as hard as Orchestrator, despite looking at the sync logic before hand and having to do less. I also rushed a ton of the stuff, so I need to have another look over the whole codebase and add comments and stuff before I continue again. I also need to handle all the todos and stuff. Tomorrow Im going to work on a lot of the bugs and errors with the runtime, sync and orchestrator because I did rush a lot of it....
|
1792504296.8145175
|
1793109096.8145175
|
|
7165
|
Eve by @Light | Stardance
|
Light
|
1
|
294.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T20:53:22Z", "hours": 294.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Eve is a graphics engine written entirely in Vulkan , with the primary goal of learning Vulkan and C++ while simplifying their usage. Originally conceived as a simple, lightweight wrapper around Vulkan , Eve now includes: A Render Graph designed from scratch that leverages technologies such as memory aliasing (where multiple resources share the same memory space) and resource pooling (reusing resources across frames). It performs the core function of a Render Graph: by simply knowing how resources are utilized, it automatically issues the necessary synchronization barriers to the GPU. Developing the Render Graph was a grueling process, but it proved worthwhile in terms of both performance and the educational value of the experience. An ECS (Entity Component System) also designed from scratch, following the model of Unity’s DOTS ECS . Instead of scattering resources across VRAM—which slows down access due to constant memory jumps—game objects are organized into Archetypes. Components are distributed in contiguous memory batches, thereby minimizing cache misses. A rendering system that automates the insertion of transforms into buffers; these are subsequently processed into matrices via a compute shader and sent to the rendering shaders. It also features a material system that analyzes shader composition, looking for a struct named “Properties” that allows fields to be assigned by name from the C++ side. Support for the Slang shading language with a bindless system . Eve provides a file named Eve.slangh that simplifies and automates the retrieval of textures, buffers, and samplers from descriptors. Compute shader support is also included. An integrated, easy-to-use Input system inspired by Unity’s Input System , along with a lightweight UI wrapper that makes using Dear ImGui simpler and more intuitive. Eve also includes a demo featuring a gravitational simulation of thousands of entities orbiting a black hole, allowing various parameters to be adjusted in real-time.", "repo": "https://github.com/SonoUnBot09/Eve", "demo": "https://github.com/SonoUnBot09/Eve/releases/tag/v1.0.0"}]...
|
[{"post_id": 71422, "ts": "202 [{"post_id": 71422, "ts": "2026-09-20T19:52:09Z", "hours": 8.8461, "text": "DEVLOG 36 - Black Hole! Hi Stardance! Intro I’ve been working really hard lately, and I think I’ve reached a milestone with Eve that I honestly never expected to hit. The project is finally complete; now I just need to click that nice button to ship it. I’ve spent this time working on the README, improving the documentation, fixing bugs, and building a demo using Eve. Eve Demo The demo is a gravity simulation featuring hundreds of thousands of entities orbiting a black hole. You can tweak various parameters—such as time, the black hole’s gravitational pull, lighting, colors, meshes, and much more. If you’d like to test it out, you can find it in the GitHub releases; there’s a ready-to-use .exe, or the source code if you’re on Linux—or if you simply want to understand how Eve works or make some modifications yourself. Problems Encountered While building the demo, I ran into—and have since resolved—some very frustrating bugs, such as memory corruption in the ECS caused by the continuous creation and destruction of entities and their components. I also added UI text support and implemented the ability to register “stages” belonging to classes or structs that can be called by the engine."}, {"post_id": 70544, "ts": "2026-09-19T10:27:28Z", "hours": 8.0992, "text": "DEVLOG 35 - Documentation Hi Stardance! Intro I’ve finally finished writing the documentation for Eve—a rather tedious and repetitive process, but a necessary one. How The Docs Is Structured: Every part of the engine is documented; inside the docs folder, you’ll find instructions on how to launch the engine, along with subfolders for each component—graphics, input, window management, and so on. Next Last Steps: I still need to create the README and tidy up a few things in the project, as well as write instructions on how to configure Eve for use on one’s own PC… But after a whole summer, I’m finally close to shipping!"}, {"post_id": 69366, "ts": "2026-09-16T22:11:41Z", "hours": 2.8144, "text": "DEVLOG 34 - Icon, Windows & More Hi Stardance! Intro The release is getting close, so I’m tidying up a few final details; I’ve finally turned my attention to a slightly more relaxed and lighthearted part of the project. Engine Settings I added a method to start the engine that accepts configuration settings for how the app runs. You can also choose whether or not to enable VSync at runtime. Window Class I added a window management class that allows for various operations, such as toggling fullscreen mode and manually changing the resolution, position, title, etc. I also included a method to set the window icon using a PNG image. Eve’s Icon I also spent some time on Canva trying to create an icon—a logo—for Eve. After several attempts, I settled on the one in the attachment."}, {"post_id": 68288, "ts": "2026-09-14T21:13:02Z", "hours": 4.0392, "text": "DEVLOG 33 - Meshes & Fixes Hi Stardance! Intro We’re getting closer to the release build of Eve! I have to say that with this devlog, the engine is practically finished and ready for shipping; I just need to tweak a few final details and we’re all set… Meshes: In this devlog, I worked on the mesh system—fleshing it out and making it functional—and added standard meshes to Eve: a cube, a UV sphere, an icosphere, a plane, and a quad. Some Bugs Fixed While implementing this, the program kept crashing for no apparent reason; after two hours of debugging, I found the error in the Render Graph—caused by the order of Eve’s internal passes—which is now fixed. Internal Shaders Organization I also embedded the engine’s internal shaders directly into the executable, so there’s no need to remember to include them alongside the executable when creating an app. The video shows the same UI as the previous devlog—featuring controls for color, rotation, cube position, and direct light direction—but this time, you can change the meshes of the “thousand-odd” cubes at runtime using the standard Eve meshes listed above, via a simple UI dropdown menu."}, {"post_id": 67640, "ts": "2026-09-13T19:52:38Z", "hours": 7.8861, "text": "DEVLOG 32 - UI Support Hi Stardance, Intro I’ve been working on the UI lately, as I wanted to give the user a way to interact with the engine beyond just mouse and keyboard input. The UI in Eve I opted for Dear ImGui and created a lightweight wrapper that allows it to run within Eve. I stripped away some of the boilerplate code associated with the standard Begin and End calls, making it slightly simpler and safer to use than raw ImGui. I also added support for dockable windows. The video shows a scene with 1,000 cubes; thanks to the UI, you can modify their color, position, and rotation. You can also change the direction of the direct light. The code required by this UI is just five lines."}, {"post_id": 65309, "ts": "2026-09-10T11:36:28Z", "hours": 0.2975, "text": "DEVLOG 31 - It’s not my fault! Hi Stardance! Unlike the other devlogs, this one is very quick and simple. A Little Recap In devlog 29, I encountered some issues with RenderDoc, even though the app kept running fine and caused no problems outside of RenderDoc itself. What I Did After doing some online research, I discovered that RenderDoc has issues with AMD drivers, which can cause the app to crash. So, I decided to try AMD’s Radeon Developer Tools (a profiler similar to RenderDoc, designed specifically for AMD GPUs). No errors were reported and everything works perfectly, so the problem most likely lies in how AMD drivers interface with RenderDoc."}, {"post_id": 64811, "ts": "2026-09-09T14:20:04Z", "hours": 5.6439, "text": "DEVLOG 30 - Compute Shaders Hi Stardance! Intro I’ve finally implemented compute shaders—as the title suggests—alongside conducting some tests and reorganizing the project. Compute Shader Support I’ve added support for compute shaders, meaning they can now be used just like any other type of pass, whether graphics or transfer. Optimizations I’ve also utilized compute shaders internally within the engine to speed up matrix calculations; here are the results: With 100,000 entities using instanced rendering, I’m getting 800 FPS, up from the previous 250. With 1,000,000 entities using instanced rendering, I’m getting around 90 FPS, up from the previous 30. With 100,000 entities using independent draw calls, I’m getting around 90 FPS, up from the previous 30. I’d say the results speak for themselves, and I’m quite happy with these optimizations. As mentioned in the previous devlog, testing was performed on my PC, which is equipped with a Ryzen 5 5600X and an RX 6600. Swapchain & CMake I also made slight modifications to the swapchain recreation code to make it faster and reduce stuttering. Finally, I tidied up the CMakeLists file to make it more organized and prepare for the release. The video shows a scene with 1M entities rendered in real-time using instanced draw call at 90 FPS"}, {"post_id": 63615, "ts": "2026-09-07T15:19:57Z", "hours": 8.0778, "text": "DEVLOG 29 - 1M Entities! Hi Stardance! Intro Since the last day, I’ve been working alone and have run into several issues… Most of them have been resolved. Some Tests So I started running some tests to check the speed of my new rendering system, and with 100,000 entities drawn to the screen with a single draw call, I was getting 30 FPS. After parallelizing the code a bit and reducing the copies, the results are now better: 100,000 entities with single draw calls get 50-60 FPS. 100,000 entities with a single instanced draw call get 230-250 FPS. 1,000,000 entities with a single instanced draw call get 30 FPS. What Need To Be Optimized Actually, I could optimize even more and double these FPS, but the current problem is that I’m calculating the matrices on the CPU side, so I’m doing a lot of calculations that currently take up a good portion of the necessary CPU time, about 50%. The idea would be to move all the work to the GPU in the future with compute shaders, thus significantly reducing the CPU load. I’ll see if I can do this… Maybe in a while, when I add full support for compute shaders. (I have a Ryzen 5 5600 X and an RX 6600) Rendering System Time: Not counting the matrices, the rendering cycle along with the Render Graph takes about 2-2.5 ms, almost all of which is spent on the Render Graph. I have also fixed some problems with Swapchain Recreation when the window is minimized. Problems With RenderDoc Five of these eight hours have been pure frustration, as I don’t understand why, but the app crashes on RenderDoc. Normally, on my PC it starts and works, but on RenderDoc it crashes… I’ve tried every way to understand the problem, but unfortunately I haven’t been able to. I’ll also test on other PCs to better understand the problem. Unfortunately, I don’t have time on my side, so I’ve had to put the issue aside for now…"}, {"post_id": 61817, "ts": "2026-09-04T22:10:27Z", "hours": 10.2261, "text": "DEVLOG 28 - New Render System Hi Stardance! Intro I think this devlog is consistent with the next one I’m working on, since the work I’ve done in the last few hours isn’t quite finished, as there are still some bugs to resolve… Why a new render system? So far, I’ve been working on improving Eve’s rendering system. Instead of having to manually create buffers and the like, Eve has a completely automated system similar to the one used by Unity. For example, when you try to draw an object, you need things like object transformation matrices. If you then need more data, the limited size of push constants is no longer enough. Per Instance Params Eve, therefore, with its new rendering system, revolutionizes the way we write code, reduces bugs, and simplifies it. For each draw call sent to the GPU, the engine sends a buffer called InstanceParams to the GPU, which contains, for each drawing instance, its model matrix and its inverse. These matrices can then be retrieved using simple, custom functions ready for use in the shader. Per Render View Data For camera data, the process is similar. For each RenderView object, Eve allocates these objects on the GPU in a contiguous buffer from which the view, perspective, VP, and other matrices can be accessed. Custom Draw Info Data If you want to send custom data to the shader, each drawing function offers a pointer called DrawInfo that allows you to send data to the shader, which can then be accessed. If set to null, the shader will not send anything. GLM & A Flycam I also created a flycam and deprecated the Eve math package to use the glm one. Honestly, I want to focus on Eve and not the math, which is why I chose this option. Next Step: I still have some bugs to fix regarding making more than one draw call, but I’m working on it."}, {"post_id": 59920, "ts": "2026-09-01T23:02:30Z", "hours": 7.4931, "text": "DEVLOG 27 - Material System Intro After some code rewrites, such as the separation between shaders and materials, the materials system now works. It’s very similar to how it works in Unity. I’ve figured out how to set things like material properties (floats, integers, vectors, etc.) directly from C++ using their names, without manually binding code. How Vulkan Handle All Of This? In Vulkan, you can’t set a shader parameter directly with a name. You need to create a buffer on the GPU, specifically a UBO, typically used for materials, bind it using a descriptor, and then bind it on the CPU. All of this is hidden by Eve, making the code easier and faster to write. What It Does? Basically, once the shader is compiled, it’s analyzed and checked for a struct called Properties. If it exists, this struct will be used for the material properties. Each field within it will be settable directly from the CPU using its name. Eve, now knowing the size of the struct and the field offsets, creates a buffer for the materials (actually, one for each frame in flight) and uses it to write everything a material might need, thus allowing for very simple parameter setting. How To Use It: The material provides an ID via the GetPropertyUBOId function, which must always be retrieved at each frame since it is not the same from frame to frame. This ID can be sent to the shader via push constant, which then allows access to the material’s property UBO, which contains all the values set on the CPU side. A simple cube rotating on itself using the new Material System and simple direct lighting"}, {"post_id": 58517, "ts": "2026-08-30T23:07:29Z", "hours": 4.8986, "text": "DEVLOG 26 - Input System Hi Stardance! The New Input System Since I couldn’t interact much with the graphics engine at the moment, I chose to create an Input System that currently only supports keyboard and mouse. It has methods like IsKeyDown(...) , GetMouseState(...) , IsMouseUp(...) , and similar ones. It’s quite simple, but it allows you to interact with the world, for example by creating a camera or a moving player. The Cube For fun and to test a bit, I tried creating a scene with a slightly rotated cube with direct light, obviously using my Render Graph, which allows you to do all this in about 150 lines of code (CPU side) instead of having to manually write barriers, configure passes, and many other repetitive tasks. I’m still using glm for matrix math, but I’m trying to reach a more stable level with the Eve package."}, {"post_id": 57455, "ts": "2026-08-29T16:33:40Z", "hours": 7.1736, "text": "DEVLOG 25 - Eve is “Multi PC” Hi everyone! What’s changed since last time? More Device Supported As promised, Eve now uses Vulkan 1.2, so it can be used on multiple devices. Obviously, the device requires that, in addition to supporting Vulkan 1.2, it also supports some extensions that became core in Vulkan 1.3. Tests On Other PCs I then tried running the app on the only PC I had at home, but it crashed. I then tried updating the graphics driver, but that didn’t help; unfortunately, that PC is too old. I then asked a friend of mine to test the app. After fixing some issues, it started, but it would crash instantly. After hours of debugging, I found the problem: the problem was in resource allocation within the Render Graph, which only occurred with integrated GPUs (my heap selection algorithm for integrated GPUs was wrong). It’s now fixed. I also added my checks for failed Vulkan or VMA calls in places where they were missing, so now everything should work properly. Math Packet In Eve I also added a small mathematical component to Eve, including Vector2,3,4 ; Vector2Int,3Int,4Int ; Quaternion ; and Matrix4x4 . I must say that quaternions were difficult to understand at first, but once you understand how they work, it’s very easy to visualize them in your head. The first attachment shows Eve running on the PC of this friend of mine, whom I thank so much for his help, and the second image shows Eve running on my PC."}, {"post_id": 55554, "ts": "2026-08-27T14:10:22Z", "hours": 4.5942, "text": "DEVLOG 24 - Error Manager, Copies & More Intro Hi Stardance! Lately, I’ve been focusing mainly on improving error handling returned by Vulkan and fixing some code here and there. New Error Manager System I’ve created a system responsible for error handling so that when an error occurs, such as a failure to allocate memory due to fragmentation or any other critical error, the app places a text file with information about the error in a folder called logs (created on the fly if it doesn’t exist). Immediately afterward, an error message is displayed on the screen explaining what happened. When the user presses the OK button, the app closes in the pop-up by calling std::abort(); . Some Test On Other PCs I tried running Eve outside of my PC on two other PCs, but since they’re a bit older, they don’t have support for Vulkan 1.4, so the app can’t be started. Swapchain Improvements The code for creating the swapchain has been improved somewhat, making it more secure and robust. New Copy Support I’ve added support for buffer and texture copy operations between resources that aren’t the same type (one transient and one persistent). Next Step: I want to make Eve a little more portable, so in the next few hours I’ll try using Vulkan 1.2, trying not to mess with the code. If necessary, I might resort to using Vulkan 1.3; I’ll see…"}, {"post_id": 54816, "ts": "2026-08-25T23:26:03Z", "hours": 3.9353, "text": "DEVLOG 23 - Instanced Draw & Some Fixes Intro Devlog time!! In the last devlog, I had some issues with instanced drawing and reading a position buffer. What Was The Problem? I worked hard, but I managed to figure out where the problem was and fix it. (The problem was due to a for loop responsible for creating the address buffers. I was saving pointers outside the for loop with structs allocated inside the for loop; therefore, the pointers were pointing to corrupted memory or nothing.) Render Graph Fixes I fixed several things in the Render Graph that could cause future problems. I added small guards within the Render Graph so that if the user does something wrong, the application doesn’t crash unexpectedly. For example, previously, if the user set a texture to display that they’d never used (never involved in a transfer operation, never used as a graphic attachment), the program would crash. With these simple guards, everything is solved. Easier Resource Usage Declaration I’ve also added the ability to easily declare textures and buffers usage in the Graphics Pass class with dedicated methods like UseBufferReadOnlyVertex(...) , UseTextureVertex(...) , and others. The image shows a grid of 20x20 quad meshes drawn with a single draw call instead of 400 using instanced draw."}, {"post_id": 54096, "ts": "2026-08-24T21:43:20Z", "hours": 10.5117, "text": "DEVLOG 22 - ECS Bugs Fixed, Graphics Files Reorganized Hi Stardance! What I Did In this dev log, I fixed some of the last bugs the ECS code, so it now works and is very efficient. I ran several tests destroying, creating, and moving entities from one archtype to another, and everything works. I then worked on the project structure of the graphics part by fixing the graphics include files. What Went Wrong These updates mentioned so far have been successful. Two hours ago, I added a method in the graphics pass responsible for instanced drawing, so I took advantage of the opportunity to create a buffer to read the instance positions to see if it worked. I still don’t know why, but it doesn’t work. The application freezes, and sometimes the driver crashes (it scared me a little… :/ ). The Validation Layers don’t report anything wrong… So I need to figure out what’s wrong and fix it. The image shows some of the methods available after fixing the folders. The methods are in the Graphics class in the include folder."}, {"post_id": 51727, "ts": "2026-08-21T15:40:39Z", "hours": 10.1514, "text": "DEVLOG 21 - ECS Refactoring Intro Over the past ten hours, I’ve worked extensively on the ECS , making it more robust, easier to use, more secure, and more efficient. What’s changed: New Way To Record Entity Commands Entity Command Pools are still used, but they’re managed not by the user but by the Entity Manager. The old CreateCommandPool() method no longer exists. Now, to execute a command on entities, you make a request to the EntityManager , which takes the command and places it in an EntityCommandPool of its choosing. The EntityCommandPool is chosen based on the SystemId provided by the engine with methods like Start, Awake, Update, etc. This reduces complexity and allows for systems that can run natively in parallel on multiple threads. Improved Efficiency Internally, the Entity Manager has improved the way to compact batches after command execution, making it simpler and faster. Instead, iterating over all batches only iterates on the entities that are no longer valid, and those slots are refilled with the components of the valid entities at the end of the last batches. Batch creation and destruction is handled automatically by the EntityManager . New Way To Query Tables The way to find tables with certain requirements has improved; the old method required registering a query and then returning a “ticket” used to access the query results. The operation is now simpler and more unified: The EntityManager is asked for all tables that meet the QueryInfo structure requirements, such as the archtype. The EntityManager checks whether the query already exists; if it doesn’t, it calculates it on the fly and returns it. Queries Updated Only When Needed Queries are updated only when tables are created/destroyed; otherwise, they remain - static and aren’t updated, saving calculations . The next step will be to verify if everything works, since I haven’t tested anything yet because I’m forced to do this devlog due to the ten-hour time limit. :/ Sorry about the picture, it’s the same, I didn’t have time to do anything else"}, {"post_id": 48967, "ts": "2026-08-17T15:28:34Z", "hours": 5.8128, "text": "DEVLOG 20 - A Better Triangle Intro Hi Stardance! This triangle was created with Render Graph . The entire process is divided into two steps: the first draws the triangle on a user-selected image, and the second takes that image, samples it, and draws it on the swapchain so the triangle can be seen on screen. Clean and Simple API The beauty of this is evident in the photo (third attachment). You only need to write a few lines of code to achieve all this compared to the complexity and number of lines of code required by Vulkan. Render Graph thus creates all the resources needed for synchronization, such as barriers , and attempts to alias memory whenever possible. It also leverages Resource Pooling , so images aren’t destroyed and recreated at every frame. Instead, if they have identical requirements, they are reused, avoiding unnecessary Vulkan calls. MSAA Deprecated MSAA images have been deprecated because, from a desktop computer perspective, they aren’t worth using because they require a lot of computational resources. To achieve anti-aliasing, it’s best to use post-processing passes that use FXAA (Fast Approximate Anti-Aliasing) or TAA (Temporal Anti-Aliasing). There are probably some bugs still present in the Render Graph despite the many already fixed; I’ll work on them."}, {"post_id": 47136, "ts": "2026-08-14T20:10:25Z", "hours": 9.8778, "text": "DEVLOG 19 - Colors! Hi Stardance! I’ve made some progress and finally drew something on the screen! Improvements on the Swapchain Pass I’ve improved the Render Graph a bit by cleaning up old methods and making all the improvements discussed in the last devlog, such as improving the rendering code for the swapchain. Normally, you would set the 2D texture to display on the screen using the RenderGraph::SetPresentTexture(); In reality, this texture isn’t displayed directly on the screen but is first sampled and copied to the swapchain, so the Render Graph adds a hidden pass for this. When this texture hasn’t been assigned to any texture, the swapchain will be colored with the clear value set to black and sent to the screen. Push Constants Supported I’ve added the ability to use Vulkan Push Constants. Push Constants are data packets that can be sent to the GPU in parallel with the drawing command. Their size is very limited, 128 bytes, but their transfer speed is extremely fast. A hardware limitation is that the offset and size parameters must be multiples of four, so I used a struct called Words32 to dictate the 32-bit size and offset, not the 8-bit one. Furthermore, internally, the engine checks the state of the previous push constant for each push constant update, so as not to make unnecessary updates and to register the push constant command only when necessary, and only partially for the relevant bytes. Shaders Improvements I improved the shader code a bit by reducing the arguments needed to create a shader, and I also unified the layout; all shaders use the same VkPipelineLayout . The Problem and The Solution When I was writing the shaders to get these things on screen, I ran into errors telling me I was assigning a buffer descriptor to Descriptor Set 0 with binding 0, even though they’re actually textures. However, in the shader, I wasn’t requesting any of this, since the vertex data was written directly into the shader. After some research, I discovered that Slang shaders were creating bindings for these arrays outside the shader. To fix this, I simply moved the arrays into the vertex shader function, marking them with const. And note that all these images/videos use the swapchain pass, so this was all just a test. Now I’ll have to try declaring a real pass with Render Graph and try to draw something, hoping everything works correctly :/"}, {"post_id": 44624, "ts": "2026-08-10T14:56:52Z", "hours": 10.0239, "text": "DEVLOG 18 - More Refactoring Hi Stardance! I don’t know what to say about this devlog, since I’ve written a lot of code for my specific implementation… I’ll try to describe what I did without being too boring. Why I refactored again? As discussed in the previous devlog, I felt the code wasn’t “nice” or at least not very tidy, and honestly, I don’t like that very much, so I rewrote the Render Graph (partially) for the third time. Now, the Render Graph only manages single-frame resources, while all multi-frame resources are managed by a separate class called TransientResourcePool, which is therefore responsible for storing the resources. The Render Graph: A single frame responsibility The Render Graph is still responsible for memory aliasing and resource pooling, of course, as well as generating barriers and inserting the draw, copy, and, in the future, compute commands. (I still need to improve the code for compiling commands into the Command Buffers a bit.) Improvement in the searching of pooled resources Now, searching for resources to reuse is even faster, since resources are divided by their composition, for example. For textures, the parameters for this division are height, depth, width, samples, etc. This allows you to immediately find a resource if it’s available. More organization is the TransientResourcePool The TransientResourcePool is also responsible for permanently destroying unused resources for several frames. I had written the destruction code within the TransientResourcePool, but I thought maybe it wasn’t its responsibility, but rather an existing class called MemoryBin. The MemoryBin class was configured to work only for persistent resources, but now it handles the destruction of persistent and transient resources. What I need to fix: There’s a small problem in the code: Normally, when you want to destroy a resource, it’s queued and usually assigned a countdown. This countdown is a number that corresponds to the maximum frames in flight and decreases by one every frame. When this number reaches zero, the resource can be destroyed. This works perfectly, but when, for example, the swapchain needs to be recreated because the window size has changed, the GPU needs to be put into idle mode. This means that all in-flight frames have finished, and therefore all resources queued for destruction can and must be destroyed immediately, otherwise they would pile up. Otherwise, I think everything is perfect. I don’t think it will take me long to implement these little tricks, so I assume and hope :/ to start writing the code to display something on the screen soon. I’ll go back to my old, dear little triangle :)"}, {"post_id": 41971, "ts": "2026-08-06T14:41:01Z", "hours": 11.1292, "text": "DEVLOG 17 - Meshes & New Architecture Into See you again, Stardance. I’ve been implementing several things lately, as the title suggests, and I think we might soon have some geometry on the screen. Mesh System I’ve been working on meshes, creating everything needed to support mesh creation, editing, and destruction. Currently, if you create a mesh, you obviously create all the necessary buffers: one for vertex positions, one for normals, one for UVs, etc. So, for example, if I load position data and the buffer doesn’t exist, a new buffer is created and a CPU-GPU upload operation is performed. However, if the buffer exists and its size is greater than the new vertex size, the buffer isn’t reallocated to a smaller size but remains the same, reducing the number of vertices used for drawing. I’m not sure how useful this option is, but I plan to add an option to specify this in the future. Image Presentation Supported I’ve also been working on how to display an image on the screen. Currently, the Render Graph has a method that, given a texture’s Transient handle, sets that texture as the image to display on the screen. Internally, the Render Graph creates a draw pass at the end of all existing passes and then samples from the presentation texture set to draw on the swapchain. The code for all this might be a little rough at the moment; I’ll improve it later. The New Architecture For a while now, I’ve felt like the code was stepping on its own toes. I had a class called MemoryRegistry that was responsible for assigning slots to resources, allocating them, and managing their lifecycle. I didn’t like this, so I decided to rewrite much of it, splitting everything into multiple classes. Now I have a class called ResourceRegistry that provides resource IDs. A class called ResourceMapper that inserts resources into their respective global descriptors. A class called ResourceTracker that manages the resource lifecycle, their last use, which stage they were in, and similar information. Until recently, the MemoryRegistry managed both persistent and transient resources, which was a mess. I’ve decided that the MemoryRegistry should only manage persistent resources, while transient resources should be managed by a class called TransientResourcePool or something similar, which should be managed by the RenderGraph. That’s exactly what I’m working on. Some Stupid Bugs I overran the timeframe because I was partially testing the new code and encountered a stupid bug that made me lose time. (I was iterating an Array starting from the last element, but I forgot to subtract one from the size of the vector assigned to the for loop index, thus causing an out-of-memory access.) I think I’ll also rewrite a good portion of the RenderGraph first to adapt it to the new architecture. Advantages These changes will make developing new features faster and less cumbersome without having to adapt to an architecture that was poorly designed from the start. I swear that after I’ve done all this, I’ll render something to the screen, assuming there are no unforeseen issues ;)"}, {"post_id": 39763, "ts": "2026-08-02T22:53:53Z", "hours": 9.9536, "text": "DEVLOG 16 - Blank Window, Draw Calls & More The last ten hours have been very productive. As the devlog title suggests, I managed to get the classic black window, completed the code for draw calls, and also accomplished many other things. Draw Calls Commands I then completed the code for making draw calls with a simple mesh, integrating all the logic into the Render Graph. If you want to send any command to the GPU—a draw call, a copy, a dispatch, or anything else—it must necessarily go through the Render Graph. This allows me to have a central entity that can manage barriers and commands in a highly optimized, precise, and secure manner. When you want to draw something, you must declare a graphics pass. This pass has methods to execute the drawing commands, but it also has methods to set things like the texture depth/stencil to use, the target texture to draw on, etc. You can also have multiple color targets, as long as they have the same resolution. Blank Window Since I haven’t seen any tangible results on screen for a while, only code, I tried displaying a black window and then initializing the engine. The new context, window, and swapchain builders all work. The Resource Mapper, the class that manages the global descriptor set, also works. Testing the other classes will require a bit more work until I’ve got all the missing pieces, but it’s almost there. Persistent Resources Support Since creating a mesh also involves creating data and sending it to the GPU via buffers, I need a way to upload data from the CPU to the GPU. Mesh buffers are persistent, not transient. Currently, in the Render Graph code, I only had support for copying and uploading transient resources. From now on, this is also available for Persistent resources, as I’ve written the same code for them as well. I also implemented barrier generation for persistent resources so that synchronization is handled internally by the Render Graph, as with transient resources. New Resource Handles Up until now, each resource has been represented as a handle corresponding to an unsigned 32-bit number. From now on, resources are represented by two unsigned 32-bit numbers: one for the previously existing identification number and a generation number. By combining both numbers, each resource is unique, thus eliminating the possibility that if a resource is destroyed and recreated with the same ID, it could be mistaken for an older resource that no longer exists. Project Cleaning I finally cleaned up the project a bit and made it a bit more organized by dividing the files into more specific subfolders."}, {"post_id": 37211, "ts": "2026-07-29T19:14:02Z", "hours": 10.0533, "text": "DEVLOG 15 - Slang & Render Graph Reorganization So, I’ve been dividing the project into folders, making everything more organized, which wasn’t the case until now. The New Shader Language: Slang I saw that there was a more modern alternative to GLSL I could use, so I chose Slang. I created the code to create it in real time, and then I also changed the architecture of the Pipeline Builder a bit (the class responsible for creating Vulkan’s Pipeline and PipelineLayout objects). Vertex Fetch, Why Did I Choose It? I’ve been thinking for a while about forcing users of the engine to use Vertex Fetch. What is it? Well, normally when using a shader, before the Vertex Shader there’s a phase called Input Assembly that, based on the triangle indices, samples vertices from the vertex buffer, allowing them to be used directly in the Vertex Shader without manual sampling. However, this means that the layout of the vertex buffer must never change; if it were to change, you’d have to create another Pipeline object and bind it. Honestly, I don’t like this limitation very much. That’s why I removed this feature and adopted Vertex Fetch, which allows you to not specify a vertex layout, thus having as few Pipeline objects as possible. Obviously, you have to manually fetch the vertex from the respective buffer in the Vertex Shader, but frankly, it’s not a huge problem. Work In Progress On The Render Graph Another thing I’m implementing is commands that can be sent to the GPU via the Render Graph. So now you can draw, make GPU-GPU copies between buffers, between textures, and even between textures and buffers. Copies currently only support Transient resources; I’ll add the functionality for Persistent resources later. The same goes for using Compute Shaders. I’ve also added the ability to upload data from the CPU to the GPU, again for transient resources. For Persistent resources, I’ll also add this functionality later. I’m still writing the code for this, so I’m not finished yet, but I’m forced to devlog for the usual 10 hours of Stardance…"}, {"post_id": 34710, "ts": "2026-07-25T17:18:03Z", "hours": 9.9128, "text": "DEVLOG 14 - I Rewrote The Memory Aliasing Algorithm Intro Unfortunately, I don’t have anything exciting to say. I’m forced to do this devlog since I’ve reached ten hours since my last devlog, so I have to publish one, otherwise my hours wouldn’t count in full. I’ll try to share what I did, the problems I encountered, and how I solved them. The Problem I might sound crazy, but after working on the Render Graph for twenty hours, I rewrote it entirely from scratch. You might ask, why? The reason I did this was Vulkan itself. I discovered that, since I’d previously relied on VMA (Vulkan Memory Allocator) to manage memory, now that I was managing memory without it, there was something I’d overlooked: a parameter called Memory Type Index. The Memory Type Index indicates where to allocate memory. There could be a Memory Type Index for the GPU’s local memory, one for the Resizable BAR, etc. So, what’s the problem if all the Render Graph resources must live exclusively in the GPU’s local memory anyway? Wouldn’t it be enough to simply add a few lines of code and everything would be solved? Unfortunately, not because this index indicates in which memory to allocate that resource, but there’s also another parameter called Memory Type Bits, which is a bitmask that indicates in which Memory Type Indexes a resource can or cannot be allocated. All resources are allocated in the same Memory Type Index, but they may have different Memory Type Bits. This means, for example, that a texture without multi-samples cannot fit in the same memory space as a texture with multi-samples. This can also happen with the aspect mask, so a color texture and a depth texture might not fit in the same place. It could also happen with the format or tiling. The same goes for buffers, but these are more flexible than textures. The Solution My Memory Aliasing algorithm was designed without taking all this into account, so I chose to rewrite a large part of the Render Graph, trying to recycle some parts. Therefore, the Aliasing algorithm now operates on “Buckets,” which are in-memory containers containing resources that can fit in the same space. Without this distinction, memory aliasing wouldn’t be possible because a resource attempting to reuse memory used by previous resources must only check among resources with the same requirements, not among all resources. Therefore, it checks per bucket, not all existing resources. This has also made the code much cleaner and more organized."}, {"post_id": 32449, "ts": "2026-07-21T17:21:23Z", "hours": 10.0289, "text": "DEVLOG 13 - Memory Aliasing Recap In the last devlog, I explained what I did and why I was creating a Render Graph. I mentioned a concept called Memory Aliasing, but I explained it briefly. I’ve been working extensively on the Render Graph these past few hours to implement the Memory Aliasing algorithm. What is Memory Aliasing? Memory Aliasing involves having two or more resources use the same portions of memory, thus sharing that memory. For example, let’s take a texture we’ll call A. This texture is used as Depth in pass 1 and read in pass 2. Another texture, called B, is used in pass 3 and pass 4 (see photo). We could allocate both resources independently, but you can clearly see that the resources don’t overlap in the passes. Texture A begins its usage cycle in pass 1 and ends in pass 2, and immediately after, in pass 3, texture B is used for the first time. What we could do is have both textures occupy the same memory space to save VRAM. This is the concept of Memory Aliasing. Obviously, since the resources share the same memory space, barriers must be created to synchronize resource access, otherwise there would be a race condition (two threads operating in parallel on the same memory space, not just for read-only operations). Resource Pooling In addition to memory aliasing, I wanted to optimize another aspect that took me some time. In Vulkan, when you want to create resources, you use vkCreateImage and vkCreateBuffer. These functions create a handle without associating physical memory with these objects. Binding occurs later, after executing the memory aliasing algorithm, which determines which memory space to assign to a resource. This means that I have to create and destroy resource handles every frame, which apparently isn’t a light operation to perform on multiple resources. So I thought that if there was a possibility, I could reuse handles from previous frames by simply comparing whether the settings of the requested handle were the same as the one to be reused and then binding the memory. The Problem and the Solution This was the idea I had, but unfortunately it’s not feasible because Vulkan doesn’t allow memory binding to a resource more than once, so this approach wouldn’t have worked. After thinking for a while about how to solve this, I decided to include in the requirements for using old handles, in addition to the texture or buffer settings, the offset and stride of how they were bound in memory. This way, if the pass structure and usage hadn’t changed significantly during the user’s setup phase, the Memory Aliasing algorithm would always produce the same results, given the deterministic nature, making this all feasible. Finally, if the resources aren’t reused for an N number of consecutive frames, they are permanently destroyed."}, {"post_id": 30667, "ts": "2026-07-18T13:14:32Z", "hours": 9.9683, "text": "DEVLOG 12 - Render Graph, Code Refactoring A Little Recap In the last devlog, I mentioned I watched the 2017 GDC conference, where they explained how the Frostbite development team had created a Render Graph. But what is a Render Graph, and what is it used for? To answer this question, we must first understand how the GPU works. The Difference: CPU & GPU First, a GPU, unlike a CPU, performs all its operations in parallel. When we write code for the CPU, we say: do this operation, then this, then that, and so on. The CPU performs its operations synchronously, in sequential order. The GPU, however, doesn’t work that way. If we tell the GPU that we want to draw three objects, we can send it three draw calls, which we’ll call A, B, and C. These draw calls are sent in order, so first A, then B, and then C. The order in which the commands are sent doesn’t correspond to the order in which they are executed, because the GPU could execute the commands in this order: C, B, A, or B, A, C, or A, C, B, and so on. This is because, while operation A might be in progress, operation B might start executing, so both commands will use the same resources and therefore run into a race condition if both operations are not read-only. The Problem From this perspective, the GPU is very powerful because it tries to stay constantly busy, eliminating dead time. However, this greatly complicates things on the synchronization side. Let’s take two operations: operation A that writes an image and operation B that reads the image. How can we be sure that the GPU executes operation A first and not B? Who can assure us that the GPU, while executing A, doesn’t have to execute B? The answer to all these questions is no one. How Graphics APIs Handle All Of This In graphics APIs like OpenGL, all of this is hidden from the programmer, so they don’t have to worry about it. But in graphics APIs like Vulkan and DirectX 12, this is the programmer’s responsibility. The programmer must write a barrier and tell the GPU not to touch the image from operation B before A has finished. For a few barriers, this is feasible, but as soon as you write more complex applications, making the code sufficiently organized, non-repetitive, and fast to develop becomes very challenging. This is why the concept of a Render Graph exists. What A Render Graph Does A Render Graph allows the programmer to specify which steps the GPU should execute, which operations resources like images and textures will perform, and in what order. The Frame Graph looks at this graph constructed by the programmer at each frame and internally understands where barriers and sometimes semaphores are needed (if we’re working with multiple queues, that’s not the case for me). Another responsibility of the Frame Graph is to internally allocate and manage resources that only exist within a single frame, called transient resources. Finally, I’m implementing Memory Aliasing. This reduces the memory used by resources: for example, if resource A is used for the last time in pass 3 and resource B for the first time in pass 4, they can share the same physical memory, thus reducing the overall memory requirement. Bonus I’ve also restructured the texture creation methods, making them simpler and allowing for fewer specifications. The before and after is a good result… The same goes for 1D and 3D textures."}, {"post_id": 28272, "ts": "2026-07-14T12:58:23Z", "hours": 10.2439, "text": "DEVLOG 11 - BDA, Pipeline, Shaders In the last devlog, I explained how I wanted to structure my bindless descriptor set. With that approach, I had a buffer for each data type. This approach works, but it’s a bit cumbersome, so I switched to using Buffer Device Addresses (BDAs). The idea behind it is: Create buffers, around VRAM, placing the buffers within VRAM memory pools. Instead of saving the physical data inside the descriptor buffer, we can only save pointers to the buffers, so I’ll have a buffer of pointers to the buffers scattered across VRAM. Since the pointers take up 8 bytes, managing the buffer is very simple, as it will be very light. So, essentially, I separate the physical data of the buffers from the shader binding logic. Rather than using namespaces to hide the internal implementation, I chose to use Hadles, which are simply numbers that identify that resource. So I could have a BufferHandle, ImageHandle, SamplerHandle, PipelineHandle, and so on. I chose not to call the structure that manages all this with names that might be reminiscent of the Vulkan API, but instead called this system Resource Mapper. At the moment, I think I’ve done something wrong with the code: Since the buffers are simply exposed via a 32-bit index, internally the buffer index corresponds to the index of the vector in which the Vulkan buffer handles and all the allocation information are allocated. I think I’ve erred in saving the buffers in vector indices that don’t match their exposed handle index outside of Eve. This causes access to incorrect buffers or buffers that don’t even exist, causing UBs or crashes. I still need to verify this issue and, if it occurs, I’ll have to fix it. Furthermore, yesterday I added all the code responsible for creating the graphics pipeline and compiling the shaders. This code is still a bit rough and needs improvement. Furthermore, since I don’t want the user to have to manage synchronization outside of the engine, I’ve been thinking about how to structure a Render Graph. I saw Frostbite’s presentation at GDC 2017 where they explained how their Render Graph works and that gave me some insights."}, {"post_id": 25895, "ts": "2026-07-10T11:55:09Z", "hours": 11.2272, "text": "DEVLOG 10 - Working On The Vulkan Wrapper For now, I’m focused on creating a wrapper for Vulkan to make it simpler and less repetitive to use. I don’t want to create a wrapper that abstracts too much, thus losing control; instead, I’m creating a fairly thin wrapper. I’m currently restructured the Application class a bit and divided some of its parts into three “modules.” I’m structuring this using the Factory Pattern. I’ve created three Builders: one for the window and SDL initialization, one for creating a Vulkan context—VulkanInstace, PhysicalDevice, LogicalDevice, and the graphics queue—and the last one for building the swapchain. I chose this approach because I consider it flexible and I don’t want everything to fit into one huge monolith; I prefer having multiple modular classes. In addition to these more or less complete builders, I’m focusing on creating a system that can allow shaders to see and manipulate the data stored in VRAM. This is usually done with DescriptorSets, which have been the standard for years. They’re more or less like pointers to objects in VRAM so shaders can access them. In reality, they’re fat pointers because they contain other information besides the address. However, this approach is good but not optimal because it introduces CPU overhead. Since the draw calls may not share the same materials and therefore require different textures, a new DescriptorSet must be bound before each draw call, which, with many draw calls, incurs CPU overhead. What I’m doing to solve this problem is looking towards a more modern and efficient approach called Bindless. Basically, instead of having multiple small DescriptorSets, you have one huge global DescriptorSet that contains all the resources used by the application. So we could have a sort of array containing all the samplers, then another containing all the textures, another containing all the buffers of a specific type, etc. Then we just need to bind this DescriptorSet at the start of rendering, which will be used for the entire rendering process, and pass indices to the shader that will tell it which resources to use from the DescriptorSet. I’m a little slow in developing all this because I’ve never used Vulkan; in fact, I’m still learning. The second reason is that Vulkan is very complex and there’s a lot of boilerplate code. I still have to finish the ECS system since I don’t yet have a centralized approach for obtaining the IDs and GenerationIds of new entities, which are verified and therefore safely managed internally by the engine. But I think I’ll do it later since I’m a little tired of fiddling with entities and want to do something different for a while."}, {"post_id": 21085, "ts": "2026-07-02T21:28:10Z", "hours": 4.3578, "text": "DEVLOG 9 - 100K Entities After the last devlog, in which I rendered 1K entities, I tried increasing the number of entities to a 15x15x15 cube, or 3375 entities, and I saw the frame rate drop unexpectedly, 25 FPS. I was wondering if this was normal or not… Apparently, it wasn’t… I tried to figure out the problem, but it wasn’t easy. I tried using a tool called RenderDoc that lets you see what’s happening on the GPU, so all the calls, data passed to the GPU, buffers, textures, etc. That information also included the time, and the GPU indicated it was taking about 16 ms, which was quite strange. I started to suspect Vulkan’s validation layers. By disabling them, I got to 30 FPS or a little higher, I don’t remember exactly. Then I disabled ASan and set the swapchain to Immediate Mode so as not to be constrained by the screen refresh rate, and I got to about 100 FPS. Then I made several CPU-level optimizations at the code level by changing the way components are obtained from batches in my ECS system, specifically limiting those operations that can be avoided in the internal component iteration loop, and I got up to 140 fps. Finally, the thing that made me open my eyes and say WOW was compiling in Release and not Debug, the fps skyrocketed to around 2300… I couldn’t believe it either… After doing all this, I rendered 100,000 entities and my fps were stable at 90… Incredible! Finally, just for the sake of curiosity, I tested 1,000,000 entities and got 9 fps, which is good because it means the system scales linearly. This is what I’ve been doing for the last two hours. Before that, I spent some time revisiting my ECS code to make it more secure. For example, many of the Table and EntityManager methods now return references and not pointers. I’ve also made the ComponentRegistry class much more efficient by storing component information in contiguous arrays instead of lists, which therefore contain non-contiguous data. Next Steps: I need to implement a way to get verified IDs from the EntityManager, since currently the IDs are only manual and non-unique. And then I’ll need to refactor the rendering code again, making it more modular, since it’s currently all in a single class."}, {"post_id": 20319, "ts": "2026-07-01T21:44:13Z", "hours": 9.6286, "text": "DEVLOG 8 - 1K Entities I implemented several things: One of these is a manager that allows systems to register their functions so they can be called, for example, when Update, Start, LateUpdate, etc. I implemented Address Sanitizer in the project to detect leaks, overflows, or out-of-bounds reads, thus uncovering some bugs. I didn’t understand why, but ASan was having trouble integrating with the project; apparently, the shaderc library was causing problems because it had a different connotation than the project. I finally solved the problem by telling CMake to use the Release version of shaderc, not Debug. I created a test system called S_Test, which I used to verify that I could create and manage multiple entities (apparently, yes). After having several memory issues, which I resolved with the help of ASan, I also started creating a camera component so I could move freely in 3D space. I’ve improved the security of the code; Entity Command Pools now no longer need to be created by the programmer, but by the Entity Manager itself, which manages them. This minimizes the risk of freeing memory too early, resulting in cleaner code for the game. Furthermore, the EntityCommandInfo and QueryInfo classes can now be allocated on the stack rather than the heap, resulting in a more secure program. Finally, for fun, I wanted to try creating a thousand entities, also to see if the system was capable of it and if there were any problems. I have to say, I’m quite happy with the result. Next Step: I still have to improve several parts of the code to make it more secure and faster, such as the Component Registry."}, {"post_id": 18339, "ts": "2026-06-29T13:31:38Z", "hours": 6.0772, "text": "DEVLOG 7 - Code Reorganization I tried to reorganize the project so that the headers needed by users of the engine are visible, while the internal, and therefore unnecessary, ones are not. What do I mean? Let’s say we have a class called A. This class is used by the engine itself, but it can also be used by the developer, for example, to record commands or something similar. So the developer will include class A in their header or source files so it can be used. But there’s a problem: Header A could include other headers that aren’t necessarily needed by the developer using the engine, thus polluting the headers. How do I solve this problem? Since I haven’t used C++ for years, I’ve been researching the problem online for months and found the following solutions: Forward Declaration - This consists of declaring the required class in the header, in this case A, without using the include directive, which literally copies the headers included in the file containing the directive. This seems like a good method, but unfortunately the data can’t be variable by value, only by reference or pointer, since the compiler must know at compile time how much memory that specific object occupies. Pimpl Idiom - This involves enclosing or encapsulating the information needed for the internal functioning of A in a class or struct that is hidden from the developer using the engine. This method could work and is almost standard, but personally, I don’t really like the idea of having to create another structure to achieve this goal. It’s more of a workaround, since the language has significant limitations in this regard. C++20 Modules - Modules are a new way of programming in C++ because, among other things, they solve this problem. They also reduce compilation times and avoid separating the code into two separate files (.hpp and .cpp). I tried using them, and from a compiler perspective, they work great (I’m using Clang), but from a Clangd perspective, the situation is quite different: While the compiler support is fairly mature, Clangd still has several issues; in fact, it reported errors everywhere. I even tried modifying the .clangd file by adding various flags, but the situation didn’t improve. There are other methods, such as Fast Pimpl, but they aren’t as flexible. What I’m looking for is something flexible that generally works in all conditions and doesn’t introduce overhead, which Pimpl Idiom doesn’t. The final solution was to use namespaces . All the public headers that must be used by the developer using the engine are in the Eve/ namespace, while the internal headers that shouldn’t be used by the developer are in a namespace called Eve/Internal. If the developer uses these files, it’s their fault; they’re marked as internal to the engine and therefore shouldn’t be used. I also changed build system and switched to CMake as it is more widespread in the C++ community and this can also give an advantage in the engine configuration section for other users"}, {"post_id": 15067, "ts": "2026-06-24T14:08:55Z", "hours": 28.5411, "text": "DEVLOG 6 - Crash, Crash, Crash and…. Crash What I did After spending several hours designing my ECS architecture, I realized I could do better, so I basically started from scratch and, as I mentioned in the previous devlog, I chose to use Archtypes so everything would be extremely efficient. Maybe I’m a bit too obsessed with performance… The Problem Anyway, after finishing the entire system, I started the app and it crashed. After several hours of debugging with simple print(); I thought the problem was in the memory, but I couldn’t figure out where… I finally decided to use Address Sanitizer, a tool that alerts you to out-of-bounds writes or reads, which allowed me to pinpoint the problem. I had performed a nonsensical multiplication, so the memory pointer was pointing to the wrong place, specifically to the end of the allocated memory portion, causing the metadata to be overwritten. (Apparently, when allocating memory, the program itself allocates additional memory slices that store information about the allocated memory portion.) The problem was that the app didn’t always crash, only sometimes, and I didn’t understand why. But I finally managed to get it working… The Result At the moment, this is a single entity, and since I haven’t tested the rest of the code, such as the destruction logic and entity transitions from one archtype to another, there are likely other bugs waiting for me."}, {"post_id": 9873, "ts": "2026-06-16T10:28:19Z", "hours": 4.6411, "text": "DEVLOG 5 - The ECS Architecture Since I can now draw something on the screen, I’d say it’s time to start building the actual graphics engine. The first system I need to create for Eve is the management of game objects. There are two options: the first is to use the OOP programming paradigm and therefore manage game objects just like Unity does; the other, which is the one I chose, is to use the ECS (Entity, Component, System) architecture. To understand why I chose ECS, you need to understand how this architecture works. As I mentioned, the word ECS is an acronym for Entity, Component, and System, which represent the three pillars on which this architecture is based. In short, entities represent objects, the essence of the object; that object simply exists, and they are usually represented by a simple numeric ID. Components, on the other hand, represent pure data; therefore, each entity can have its own components and therefore its own data. Systems, on the other hand, are the part of the code that executes the logic. Let’s take the rendering system as an example. This will iterate over all entities that have mesh components, and a transform will take their data and send it to the GPU for rendering. This division of responsibilities ensures incredible efficiency, given how the CPU works, since the component data is stored contiguously in memory. This facilitates the work of a CPU component called the Hardware Prefetcher, which tries to predict which portion of RAM the CPU will use next, thus reducing cache misses. There are many ready-to-use libraries for this architecture, such as Flecs, EnTT, and others. I chose to try and create my own so I could learn and understand more. Currently, I’m using, broadly speaking, the same approach Unity uses with their ECS architecture, which is part of their Unity DOTS ecosystem. All entities in the game can be classified based on an ID called an Archtype, which identifies the type of entity being viewed based on its components. This way, you can have contiguous arrays and minimize cache misses, thus maximizing CPU efficiency. I’m still working on it, but I have to say it’s extremely interesting…"}, {"post_id": 8166, "ts": "2026-06-13T16:39:12Z", "hours": 4.5819, "text": "DEVLOG 4 - Textures! I finally managed to use textures; Vulkan has a bit of boilerplate in their configuration, especially with the descriptor sets. This was the part that slowed me down a bit. The code isn’t very tidy at the moment… For now, I’ve focused more on learning, so I haven’t written anything extremely tidy and readable. As I said, I’ve only learned the basics so far. Now that I feel more confident about the subject, I think I’ll start writing something. I’m thinking of a framework or something simple that allows you to draw geometry on the screen without having to write hundreds of lines of code directly with Vulkan. So, more generally, I think I’ll create a layer of abstraction while still trying to maintain excellent flexibility."}, {"post_id": 7178, "ts": "2026-06-11T23:53:28Z", "hours": 2.3814, "text": "DEVLOG 3 - First Cube!!! How satisfying, my first 3D object! Since previously all vertices were written manually in the shader, I opted to learn how to create buffers to load more complex 3D geometry onto the screen. I’m loading the resources directly into a specific portion of memory called Host Visible, where the CPU can also write, and the GPU’s reading isn’t as fast as it could be. If I instead allocate the memory in a portion of VRAM called Device Local, the GPU will be very fast at accessing the data, but the CPU, on the other hand, won’t be able to do anything with that memory. To modify it, you need to first allocate the data in an intermediate buffer called Staging Buffer, and then from there the data can go to Device Local memory (the GPU’s fast memory). I also added some transformations and rotations with GLM to rotate the cube, and this is the result, which is nice. I think I’ll try using Device Local memory by loading data to it, as discussed before, with a Staging Buffer and after that I think I’ll start experimenting with textures."}, {"post_id": 6502, "ts": "2026-06-10T22:34:52Z", "hours": 9.0367, "text": "DEVLOG 2 - Consolidation of things learned Well, What’s new? Just a square? It might not seem like much, but yes. I spent all these hours rewriting the entire code from scratch so I could understand where I had the most doubts and therefore review some concepts. Synchronization was and still is the most difficult concept to grasp; understanding how the semaphores and barriers are linked together wasn’t easy for me, and I must admit I still have some doubts about it, but certainly much less than before. Given the asynchronous nature of the graphics card, you can’t program operations that will be executed in order, unlike the CPU, and this is one of the graphics card’s strengths and weaknesses. You can parallelize many operations, but you have to be careful how they are linked together and synchronize them as correctly as possible. My next step, I think, will be to use buffers to give more complex geometry to the shaders, primarily for drawing 3D geometry. I also think I still have to delve deeper and better understand things like semaphores, timeline semaphores, and barriers, which are topics I feel I haven’t internalized as well as others."}, {"post_id": 5182, "ts": "2026-06-08T21:32:27Z", "hours": 11.6153, "text": "DEVLOG 1 - Hello Triangle!!! Finally, after several hours trying to understand how Vulkan works, watching and reading several tutorials, I got it, my first triangle, isn’t it cute?🫠🫠 I’ve figured out most of the things, but I think I need to delve a little deeper into the process of creating a pipeline with dynamic rendering and synchronization. These are the two topics that have been giving me the most trouble. I think the next step will be to re-explore the code and try to create something on my own, without a guided tutorial, to see if I’ve really understood the concepts."}]...
|
Title: Eve by @Light | Stardance
Devlogs:
DEVLOG Title: Eve by @Light | Stardance
Devlogs:
DEVLOG 1 - Hello Triangle!!! Finally, after several hours trying to understand how Vulkan works, watching and reading several tutorials, I got it, my first triangle, isn’t it cute?🫠🫠 I’ve figured out most of the things, but I think I need to delve a little deeper into the process of creating a pipeline with dynamic rendering and synchronization. These are the two topics that have been giving me the most trouble. I think the next step will be to re-explore the code and try to create something on my own, without a guided tutorial, to see if I’ve really understood the concepts.
DEVLOG 2 - Consolidation of things learned Well, What’s new? Just a square? It might not seem like much, but yes. I spent all these hours rewriting the entire code from scratch so I could understand where I had the most doubts and therefore review some concepts. Synchronization was and still is the most difficult concept to grasp; understanding how the semaphores and barriers are linked together wasn’t easy for me, and I must admit I still have some doubts about it, but certainly much less than before. Given the asynchronous nature of the graphics card, you can’t program operations that will be executed in order, unlike the CPU, and this is one of the graphics card’s strengths and weaknesses. You can parallelize many operations, but you have to be careful how they are linked together and synchronize them as correctly as possible. My next step, I think, will be to use buffers to give more complex geometry to the shaders, primarily for drawing 3D geometry. I also think I still have to delve deeper and better understand things like semaphores, timeline semaphores, and barriers, which are topics I feel I haven’t internalized as well as others.
DEVLOG 3 - First Cube!!! How satisfying, my first 3D object! Since previously all vertices were written manually in the shader, I opted to learn how to create buffers to load more complex 3D geometry onto the screen. I’m loading the resources directly into a specific portion of memory called Host Visible, where the CPU can also write, and the GPU’s reading isn’t as fast as it could be. If I instead allocate the memory in a portion of VRAM called Device Local, the GPU will be very fast at accessing the data, but the CPU, on the other hand, won’t be able to do anything with that memory. To modify it, you need to first allocate the data in an intermediate buffer called Staging Buffer, and then from there the data can go to Device Local memory (the GPU’s fast memory). I also added some transformations and rotations with GLM to rotate the cube, and this is the result, which is nice. I think I’ll try using Device Local memory by loading data to it, as discussed before, with a Staging Buffer and after that I think I’ll start experimenting with textures.
DEVLOG 4 - Textures! I finally managed to use textures; Vulkan has a bit of boilerplate in their configuration, especially with the descriptor sets. This was the part that slowed me down a bit. The code isn’t very tidy at the moment… For now, I’ve focused more on learning, so I haven’t written anything extremely tidy and readable. As I said, I’ve only learned the basics so far. Now that I feel more confident about the subject, I think I’ll start writing something. I’m thinking of a framework or something simple that allows you to draw geometry on the screen without having to write hundreds of lines of code directly with Vulkan. So, more generally, I think I’ll create a layer of abstraction while still trying to maintain excellent flexibility.
DEVLOG 5 - The ECS Architecture Since I can now draw something on the screen, I’d say it’s time to start building the actual graphics engine. The first system I need to create for Eve is the management of game objects. There are two options: the first is to use the OOP programming paradigm and therefore manage game objects just like Unity does; the other, which is the one I chose, is to use the ECS (Entity, Component, System) architecture. To understand why I chose ECS, you need to understand how this architecture works. As I mentioned, the word ECS is an acronym for Entity, Component, and System, which represent the three pillars on which this architecture is based. In short, entities represent objects, the essence of the object; that object simply exists, and they are usually represented by a simple numeric ID. Components, on the other hand, represent pure data; therefore, each entity can have its own components and therefore its own data. Systems, on the other hand, are the part of the code that executes the logic. Let’s take the rendering system as an example. This will iterate over all entities that have mesh components, and a transform will take their data and send it to the GPU for rendering. This division of responsibilities ensures incredible efficiency, given how the CPU works, since the component data is stored contiguously in memory. This facilitates the work of a CPU component called the Hardware Prefetcher, which tries to predict which portion of RAM the CPU will use next, thus reducing cache misses. There are many ready-to-use libraries for this architecture, such as Flecs, EnTT, and others. I chose to try and create my own so I could learn and understand more. Currently, I’m using, broadly speaking, the same approach Unity uses with their ECS architecture, which is part of their Unity DOTS ecosystem. All entities in the game can be classified based on an ID called an Archtype, which identifies the type of entity being viewed based on its components. This way, you can have contiguous arrays and minimize cache misses, thus maximizing CPU efficiency. I’m still working on it, but I have to say it’s extremely interesting…
DEVLOG 6 - Crash, Crash, Crash and…. Crash What I did After spending several hours designing my ECS architecture, I realized I could do better, so I basically started from scratch and, as I mentioned in the previous devlog, I chose to use Archtypes so everything would be extremely efficient. Maybe I’m a bit too obsessed with performance… The Problem Anyway, after finishing the entire system, I started the app and it crashed. After several hours of debugging with simple print(); I thought the problem was in the memory, but I couldn’t figure out where… I finally decided to use Address Sanitizer, a tool that alerts you to out-of-bounds writes or reads, which allowed me to pinpoint the problem. I had performed a nonsensical multiplication, so the memory pointer was pointing to the wrong place, specifically to the end of the allocated memory portion, causing the metadata to be overwritten. (Apparently, when allocating memory, the program itself allocates additional memory slices that store information about the allocated memory portion.) The problem was that the app didn’t always crash, only sometimes, and I didn’t understand why. But I finally managed to get it working… The Result At the moment, this is a single entity, and since I haven’t tested the rest of the code, such as the destruction logic and entity transitions from one archtype to another, there are likely other bugs waiting for me.
DEVLOG 7 - Code Reorganization I tried to reorganize the project so that the headers needed by users of the engine are visible, while the internal, and therefore unnecessary, ones are not. What do I mean? Let’s say we have a class called A. This class is used by the engine itself, but it can also be used by the developer, for example, to record commands or something similar. So the developer will include class A in their header or source files so it can be used. But there’s a problem: Header A could include other headers that aren’t necessarily needed by the developer using the engine, thus polluting the headers. How do I solve this problem? Since I haven’t used C++ for years, I’ve been researching the problem online for months and found the following solutions: Forward Declaration - This consists of declaring the required class in the header, in this case A, without using the include directive, which literally copies the headers included in the file containing the directive. This seems like a good method, but unfortunately the data can’t be variable by value, only by reference or pointer, since the compiler must know at compile time how much memory that specific object occupies. Pimpl Idiom - This involves enclosing or encapsulating the information needed for the internal functioning of A in a class or struct that is hidden from the developer using the engine. This method could work and is almost standard, but personally, I don’t really like the idea of having to create another structure to achieve this goal. It’s more of a workaround, since the language has significant limitations in this regard. C++20 Modules - Modules are a new way of programming in C++ because, among other things, they solve this problem. They also reduce compilation times and avoid separating the code into two separate files (.hpp and .cpp). I tried using them, and from a compiler perspective, they work great (I’m using Clang), but from a Clangd perspective, the situation is quite different: While the compiler support is fairly mature, Clangd still has several issues; in fact, it reported errors everywhere. I even tried modifying the .clangd file by adding various flags, but the situation didn’t improve. There are other methods, such as Fast Pimpl, but they aren’t as flexible. What I’m looking for is something flexible that generally works in all conditions and doesn’t introduce overhead, which Pimpl Idiom doesn’t. The final solution was to use namespaces . All the public headers that must be used by the developer using the engine are in the Eve/ namespace, while the internal headers that shouldn’t be used by the developer are in a namespace called Eve/Internal. If the developer uses these files, it’s their fault; they’re marked as internal to the engine and therefore shouldn’t be used. I also changed build system and switched to CMake as it is more widespread in the C++ community and this can also give an advantage in the engine configuration section for other users
DEVLOG 8 - 1K Entities I implemented several things: One of these is a manager that allows systems to register their functions so they can be called, for example, when Update, Start, LateUpdate, etc. I implemented Address Sanitizer in the project to detect leaks, overflows, or out-of-bounds reads, thus uncovering some bugs. I didn’t understand why, but ASan was having trouble integrating with the project; apparently, the shaderc library was causing problems because it had a different connotation than the project. I finally solved the problem by telling CMake to use the Release version of shaderc, not Debug. I created a test system called S_Test, which I used to verify that I could create and manage multiple entities (apparently, yes). After having several memory issues, which I resolved with the help of ASan, I also started creating a camera component so I could move freely in 3D space. I’ve improved the security of the code; Entity Command Pools now no longer need to be created by the programmer, but by the Entity Manager itself, which manages them. This minimizes the risk of freeing memory too early, resulting in cleaner code for the game. Furthermore, the EntityCommandInfo and QueryInfo classes can now be allocated on the stack rather than the heap, resulting in a more secure program. Finally, for fun, I wanted to try creating a thousand entities, also to see if the system was capable of it and if there were any problems. I have to say, I’m quite happy with the result. Next Step: I still have to improve several parts of the code to make it more secure and faster, such as the Component Registry.
DEVLOG 9 - 100K Entities After the last devlog, in which I rendered 1K entities, I tried increasing the number of entities to a 15x15x15 cube, or 3375 entities, and I saw the frame rate drop unexpectedly, 25 FPS. I was wondering if this was normal or not… Apparently, it wasn’t… I tried to figure out the problem, but it wasn’t easy. I tried using a tool called RenderDoc that lets you see what’s happening on the GPU, so all the calls, data passed to the GPU, buffers, textures, etc. That information also included the time, and the GPU indicated it was taking about 16 ms, which was quite strange. I started to suspect Vulkan’s validation layers. By disabling them, I got to 30 FPS or a little higher, I don’t remember exactly. Then I disabled ASan and set the swapchain to Immediate Mode so as not to be constrained by the screen refresh rate, and I got to about 100 FPS. Then I made several CPU-level optimizations at the code level by changing the way components are obtained from batches in my ECS system, specifically limiting those operations that can be avoided in the internal component iteration loop, and I got up to 140 fps. Finally, the thing that made me open my eyes and say WOW was compiling in Release and not Debug, the fps skyrocketed to around 2300… I couldn’t believe it either… After doing all this, I rendered 100,000 entities and my fps were stable at 90… Incredible! Finally, just for the sake of curiosity, I tested 1,000,000 entities and got 9 fps, which is good because it means the system scales linearly. This is what I’ve been doing for the last two hours. Before that, I spent some time revisiting my ECS code to make it more secure. For example, many of the Table and EntityManager methods now return references and not pointers. I’ve also made the ComponentRegistry class much more efficient by storing component information in contiguous arrays instead of lists, which therefore contain non-contiguous data. Next Steps: I need to implement a way to get verified IDs from the EntityManager, since currently the IDs are only manual and non-unique. And then I’ll need to refactor the rendering code again, making it more modular, since it’s currently all in a single class.
DEVLOG 10 - Working On The Vulkan Wrapper For now, I’m focused on creating a wrapper for Vulkan to make it simpler and less repetitive to use. I don’t want to create a wrapper that abstracts too much, thus losing control; instead, I’m creating a fairly thin wrapper. I’m currently restructured the Application class a bit and divided some of its parts into three “modules.” I’m structuring this using the Factory Pattern. I’ve created three Builders: one for the window and SDL initialization, one for creating a Vulkan context—VulkanInstace, PhysicalDevice, LogicalDevice, and the graphics queue—and the last one for building the swapchain. I chose this approach because I consider it flexible and I don’t want everything to fit into one huge monolith; I prefer having multiple modular classes. In addition to these more or less complete builders, I’m focusing on creating a system that can allow shaders to see and manipulate the data stored in VRAM. This is usually done with DescriptorSets, which have been the standard for years. They’re more or less like pointers to objects in VRAM so shaders can access them. In reality, they’re fat pointers because they contain other information besides the address. However, this approach is good but not optimal because it introduces CPU overhead. Since the draw calls may not share the same materials and therefore require different textures, a new DescriptorSet must be bound before each draw call, which, with many draw calls, incurs CPU overhead. What I’m doing to solve this problem is looking towards a more modern and efficient approach called Bindless. Basically, instead of having multiple small DescriptorSets, you have one huge global DescriptorSet that contains all the resources used by the application. So we could have a sort of array containing all the samplers, then another containing all the textures, another containing all the buffers of a specific type, etc. Then we just need to bind this DescriptorSet at the start of rendering, which will be used for the entire rendering process, and pass indices to the shader that will tell it which resources to use from the DescriptorSet. I’m a little slow in developing all this because I’ve never used Vulkan; in fact, I’m still learning. The second reason is that Vulkan is very complex and there’s a lot of boilerplate code. I still have to finish the ECS system since I don’t yet have a centralized approach for obtaining the IDs and GenerationIds of new entities, which are verified and therefore safely managed internally by the engine. But I think I’ll do it later since I’m a little tired of fiddling with entities and want to do something different for a while.
DEVLOG 11 - BDA, Pipeline, Shaders In the last devlog, I explained how I wanted to structure my bindless descriptor set. With that approach, I had a buffer for each data type. This approach works, but it’s a bit cumbersome, so I switched to using Buffer Device Addresses (BDAs). The idea behind it is: Create buffers, around VRAM, placing the buffers within VRAM memory pools. Instead of saving the physical data inside the descriptor buffer, we can only save pointers to the buffers, so I’ll have a buffer of pointers to the buffers scattered across VRAM. Since the pointers take up 8 bytes, managing the buffer is very simple, as it will be very light. So, essentially, I separate the physical data of the buffers from the shader binding logic. Rather than using namespaces to hide the internal implementation, I chose to use Hadles, which are simply numbers that identify that resource. So I could have a BufferHandle, ImageHandle, SamplerHandle, PipelineHandle, and so on. I chose not to call the structure that manages all this with names that might be reminiscent of the Vulkan API, but instead called this system Resource Mapper. At the moment, I think I’ve done something wrong with the code: Since the buffers are simply exposed via a 32-bit index, internally the buffer index corresponds to the index of the vector in which the Vulkan buffer handles and all the allocation information are allocated. I think I’ve erred in saving the buffers in vector indices that don’t match their exposed handle index outside of Eve. This causes access to incorrect buffers or buffers that don’t even exist, causing UBs or crashes. I still need to verify this issue and, if it occurs, I’ll have to fix it. Furthermore, yesterday I added all the code responsible for creating the graphics pipeline and compiling the shaders. This code is still a bit rough and needs improvement. Furthermore, since I don’t want the user to have to manage synchronization outside of the engine, I’ve been thinking about how to structure a Render Graph. I saw Frostbite’s presentation at GDC 2017 where they explained how their Render Graph works and that gave me some insights.
DEVLOG 12 - Render Graph, Code Refactoring A Little Recap In the last devlog, I mentioned I watched the 2017 GDC conference, where they explained how the Frostbite development team had created a Render Graph. But what is a Render Graph, and what is it used for? To answer this question, we must first understand how the GPU works. The Difference: CPU & GPU First, a GPU, unlike a CPU, performs all its operations in parallel. When we write code for the CPU, we say: do this operation, then this, then that, and so on. The CPU performs its operations synchronously, in sequential order. The GPU, however, doesn’t work that way. If we tell the GPU that we want to draw three objects, we can send it three draw calls, which we’ll call A, B, and C. These draw calls are sent in order, so first A, then B, and then C. The order in which the commands are sent doesn’t correspond to the order in which they are executed, because the GPU could execute the commands in this order: C, B, A, or B, A, C, or A, C, B, and so on. This is because, while operation A might be in progress, operation B might start executing, so both commands will use the same resources and therefore run into a race condition if both operations are not read-only. The Problem From this perspective, the GPU is very powerful because it tries to stay constantly busy, eliminating dead time. However, this greatly complicates things on the synchronization side. Let’s take two operations: operation A that writes an image and operation B that reads the image. How can we be sure that the GPU executes operation A first and not B? Who can assure us that the GPU, while executing A, doesn’t have to execute B? The answer to all these questions is no one. How Graphics APIs Handle All Of This In graphics APIs like OpenGL, all of this is hidden from the programmer, so they don’t have to worry about it. But in graphics APIs like Vulkan and DirectX 12, this is the programmer’s responsibility. The programmer must write a barrier and tell the GPU not to touch the image from operation B before A has finished. For a few barriers, this is feasible, but as soon as you write more complex applications, making the code sufficiently organized, non-repetitive, and fast to develop becomes very challenging. This is why the concept of a Render Graph exists. What A Render Graph Does A Render Graph allows the programmer to specify which steps the GPU should execute, which operations resources like images and textures will perform, and in what order. The Frame Graph looks at this graph constructed by the programmer at each frame and internally understands where barriers and sometimes semaphores are needed (if we’re working with multiple queues, that’s not the case for me). Another responsibility of the Frame Graph is to internally allocate and manage resources that only exist within a single frame, called transient resources. Finally, I’m implementing Memory Aliasing. This reduces the memory used by resources: for example, if resource A is used for the last time in pass 3 and resource B for the first time in pass 4, they can share the same physical memory, thus reducing the overall memory requirement. Bonus I’ve also restructured the texture creation methods, making them simpler and allowing for fewer specifications. The before and after is a good result… The same goes for 1D and 3D textures.
DEVLOG 13 - Memory Aliasing Recap In the last devlog, I explained what I did and why I was creating a Render Graph. I mentioned a concept called Memory Aliasing, but I explained it briefly. I’ve been working extensively on the Render Graph these past few hours to implement the Memory Aliasing algorithm. What is Memory Aliasing? Memory Aliasing involves having two or more resources use the same portions of memory, thus sharing that memory. For example, let’s take a texture we’ll call A. This texture is used as Depth in pass 1 and read in pass 2. Another texture, called B, is used in pass 3 and pass 4 (see photo). We could allocate both resources independently, but you can clearly see that the resources don’t overlap in the passes. Texture A begins its usage cycle in pass 1 and ends in pass 2, and immediately after, in pass 3, texture B is used for the first time. What we could do is have both textures occupy the same memory space to save VRAM. This is the concept of Memory Aliasing. Obviously, since the resources share the same memory space, barriers must be created to synchronize resource access, otherwise there would be a race condition (two threads operating in parallel on the same memory space, not just for read-only operations). Resource Pooling In addition to memory aliasing, I wanted to optimize another aspect that took me some time. In Vulkan, when you want to create resources, you use vkCreateImage and vkCreateBuffer. These functions create a handle without associating physical memory with these objects. Binding occurs later, after executing the memory aliasing algorithm, which determines which memory space to assign to a resource. This means that I have to create and destroy resource handles every frame, which apparently isn’t a light operation to perform on multiple resources. So I thought that if there was a possibility, I could reuse handles from previous frames by simply comparing whether the settings of the requested handle were the same as the one to be reused and then binding the memory. The Problem and the Solution This was the idea I had, but unfortunately it’s not feasible because Vulkan doesn’t allow memory binding to a resource more than once, so this approach wouldn’t have worked. After thinking for a while about how to solve this, I decided to include in the requirements for using old handles, in addition to the texture or buffer settings, the offset and stride of how they were bound in memory. This way, if the pass structure and usage hadn’t changed significantly during the user’s setup phase, the Memory Aliasing algorithm would always produce the same results, given the deterministic nature, making this all feasible. Finally, if the resources aren’t reused for an N number of consecutive frames, they are permanently destroyed.
DEVLOG 14 - I Rewrote The Memory Aliasing Algorithm Intro Unfortunately, I don’t have anything exciting to say. I’m forced to do this devlog since I’ve reached ten hours since my last devlog, so I have to publish one, otherwise my hours wouldn’t count in full. I’ll try to share what I did, the problems I encountered, and how I solved them. The Problem I might sound crazy, but after working on the Render Graph for twenty hours, I rewrote it entirely from scratch. You might ask, why? The reason I did this was Vulkan itself. I discovered that, since I’d previously relied on VMA (Vulkan Memory Allocator) to manage memory, now that I was managing memory without it, there was something I’d overlooked: a parameter called Memory Type Index. The Memory Type Index indicates where to allocate memory. There could be a Memory Type Index for the GPU’s local memory, one for the Resizable BAR, etc. So, what’s the problem if all the Render Graph resources must live exclusively in the GPU’s local memory anyway? Wouldn’t it be enough to simply add a few lines of code and everything would be solved? Unfortunately, not because this index indicates in which memory to allocate that resource, but there’s also another parameter called Memory Type Bits, which is a bitmask that indicates in which Memory Type Indexes a resource can or cannot be allocated. All resources are allocated in the same Memory Type Index, but they may have different Memory Type Bits. This means, for example, that a texture without multi-samples cannot fit in the same memory space as a texture with multi-samples. This can also happen with the aspect mask, so a color texture and a depth texture might not fit in the same place. It could also happen with the format or tiling. The same goes for buffers, but these are more flexible than textures. The Solution My Memory Aliasing algorithm was designed without taking all this into account, so I chose to rewrite a large part of the Render Graph, trying to recycle some parts. Therefore, the Aliasing algorithm now operates on “Buckets,” which are in-memory containers containing resources that can fit in the same space. Without this distinction, memory aliasing wouldn’t be possible because a resource attempting to reuse memory used by previous resources must only check among resources with the same requirements, not among all resources. Therefore, it checks per bucket, not all existing resources. This has also made the code much cleaner and more organized.
DEVLOG 15 - Slang & Render Graph Reorganization So, I’ve been dividing the project into folders, making everything more organized, which wasn’t the case until now. The New Shader Language: Slang I saw that there was a more modern alternative to GLSL I could use, so I chose Slang. I created the code to create it in real time, and then I also changed the architecture of the Pipeline Builder a bit (the class responsible for creating Vulkan’s Pipeline and PipelineLayout objects). Vertex Fetch, Why Did I Choose It? I’ve been thinking for a while about forcing users of the engine to use Vertex Fetch. What is it? Well, normally when using a shader, before the Vertex Shader there’s a phase called Input Assembly that, based on the triangle indices, samples vertices from the vertex buffer, allowing them to be used directly in the Vertex Shader without manual sampling. However, this means that the layout of the vertex buffer must never change; if it were to change, you’d have to create another Pipeline object and bind it. Honestly, I don’t like this limitation very much. That’s why I removed this feature and adopted Vertex Fetch, which allows you to not specify a vertex layout, thus having as few Pipeline objects as possible. Obviously, you have to manually fetch the vertex from the respective buffer in the Vertex Shader, but frankly, it’s not a huge problem. Work In Progress On The Render Graph Another thing I’m implementing is commands that can be sent to the GPU via the Render Graph. So now you can draw, make GPU-GPU copies between buffers, between textures, and even between textures and buffers. Copies currently only support Transient resources; I’ll add the functionality for Persistent resources later. The same goes for using Compute Shaders. I’ve also added the ability to upload data from the CPU to the GPU, again for transient resources. For Persistent resources, I’ll also add this functionality later. I’m still writing the code for this, so I’m not finished yet, but I’m forced to devlog for the usual 10 hours of Stardance…
DEVLOG 16 - Blank Window, Draw Calls & More The last ten hours have been very productive. As the devlog title suggests, I managed to get the classic black window, completed the code for draw calls, and also accomplished many other things. Draw Calls Commands I then completed the code for making draw calls with a simple mesh, integrating all the logic into the Render Graph. If you want to send any command to the GPU—a draw call, a copy, a dispatch, or anything else—it must necessarily go through the Render Graph. This allows me to have a central entity that can manage barriers and commands in a highly optimized, precise, and secure manner. When you want to draw something, you must declare a graphics pass. This pass has methods to execute the drawing commands, but it also has methods to set things like the texture depth/stencil to use, the target texture to draw on, etc. You can also have multiple color targets, as long as they have the same resolution. Blank Window Since I haven’t seen any tangible results on screen for a while, only code, I tried displaying a black window and then initializing the engine. The new context, window, and swapchain builders all work. The Resource Mapper, the class that manages the global descriptor set, also works. Testing the other classes will require a bit more work until I’ve got all the missing pieces, but it’s almost there. Persistent Resources Support Since creating a mesh also involves creating data and sending it to the GPU via buffers, I need a way to upload data from the CPU to the GPU. Mesh buffers are persistent, not transient. Currently, in the Render Graph code, I only had support for copying and uploading transient resources. From now on, this is also available for Persistent resources, as I’ve written the same code for them as well. I also implemented barrier generation for persistent resources so that synchronization is handled internally by the Render Graph, as with transient resources. New Resource Handles Up until now, each resource has been represented as a handle corresponding to an unsigned 32-bit number. From now on, resources are represented by two unsigned 32-bit numbers: one for the previously existing identification number and a generation number. By combining both numbers, each resource is unique, thus eliminating the possibility that if a resource is destroyed and recreated with the same ID, it could be mistaken for an older resource that no longer exists. Project Cleaning I finally cleaned up the project a bit and made it a bit more organized by dividing the files into more specific subfolders.
DEVLOG 17 - Meshes & New Architecture Into See you again, Stardance. I’ve been implementing several things lately, as the title suggests, and I think we might soon have some geometry on the screen. Mesh System I’ve been working on meshes, creating everything needed to support mesh creation, editing, and destruction. Currently, if you create a mesh, you obviously create all the necessary buffers: one for vertex positions, one for normals, one for UVs, etc. So, for example, if I load position data and the buffer doesn’t exist, a new buffer is created and a CPU-GPU upload operation is performed. However, if the buffer exists and its size is greater than the new vertex size, the buffer isn’t reallocated to a smaller size but remains the same, reducing the number of vertices used for drawing. I’m not sure how useful this option is, but I plan to add an option to specify this in the future. Image Presentation Supported I’ve also been working on how to display an image on the screen. Currently, the Render Graph has a method that, given a texture’s Transient handle, sets that texture as the image to display on the screen. Internally, the Render Graph creates a draw pass at the end of all existing passes and then samples from the presentation texture set to draw on the swapchain. The code for all this might be a little rough at the moment; I’ll improve it later. The New Architecture For a while now, I’ve felt like the code was stepping on its own toes. I had a class called MemoryRegistry that was responsible for assigning slots to resources, allocating them, and managing their lifecycle. I didn’t like this, so I decided to rewrite much of it, splitting everything into multiple classes. Now I have a class called ResourceRegistry that provides resource IDs. A class called ResourceMapper that inserts resources into their respective global descriptors. A class called ResourceTracker that manages the resource lifecycle, their last use, which stage they were in, and similar information. Until recently, the MemoryRegistry managed both persistent and transient resources, which was a mess. I’ve decided that the MemoryRegistry should only manage persistent resources, while transient resources should be managed by a class called TransientResourcePool or something similar, which should be managed by the RenderGraph. That’s exactly what I’m working on. Some Stupid Bugs I overran the timeframe because I was partially testing the new code and encountered a stupid bug that made me lose time. (I was iterating an Array starting from the last element, but I forgot to subtract one from the size of the vector assigned to the for loop index, thus causing an out-of-memory access.) I think I’ll also rewrite a good portion of the RenderGraph first to adapt it to the new architecture. Advantages These changes will make developing new features faster and less cumbersome without having to adapt to an architecture that was poorly designed from the start. I swear that after I’ve done all this, I’ll render something to the screen, assuming there are no unforeseen issues ;)
DEVLOG 18 - More Refactoring Hi Stardance! I don’t know what to say about this devlog, since I’ve written a lot of code for my specific implementation… I’ll try to describe what I did without being too boring. Why I refactored again? As discussed in the previous devlog, I felt the code wasn’t “nice” or at least not very tidy, and honestly, I don’t like that very much, so I rewrote the Render Graph (partially) for the third time. Now, the Render Graph only manages single-frame resources, while all multi-frame resources are managed by a separate class called TransientResourcePool, which is therefore responsible for storing the resources. The Render Graph: A single frame responsibility The Render Graph is still responsible for memory aliasing and resource pooling, of course, as well as generating barriers and inserting the draw, copy, and, in the future, compute commands. (I still need to improve the code for compiling commands into the Command Buffers a bit.) Improvement in the searching of pooled resources Now, searching for resources to reuse is even faster, since resources are divided by their composition, for example. For textures, the parameters for this division are height, depth, width, samples, etc. This allows you to immediately find a resource if it’s available. More organization is the TransientResourcePool The TransientResourcePool is also responsible for permanently destroying unused resources for several frames. I had written the destruction code within the TransientResourcePool, but I thought maybe it wasn’t its responsibility, but rather an existing class called MemoryBin. The MemoryBin class was configured to work only for persistent resources, but now it handles the destruction of persistent and transient resources. What I need to fix: There’s a small problem in the code: Normally, when you want to destroy a resource, it’s queued and usually assigned a countdown. This countdown is a number that corresponds to the maximum frames in flight and decreases by one every frame. When this number reaches zero, the resource can be destroyed. This works perfectly, but when, for example, the swapchain needs to be recreated because the window size has changed, the GPU needs to be put into idle mode. This means that all in-flight frames have finished, and therefore all resources queued for destruction can and must be destroyed immediately, otherwise they would pile up. Otherwise, I think everything is perfect. I don’t think it will take me long to implement these little tricks, so I assume and hope :/ to start writing the code to display something on the screen soon. I’ll go back to my old, dear little triangle :)
DEVLOG 19 - Colors! Hi Stardance! I’ve made some progress and finally drew something on the screen! Improvements on the Swapchain Pass I’ve improved the Render Graph a bit by cleaning up old methods and making all the improvements discussed in the last devlog, such as improving the rendering code for the swapchain. Normally, you would set the 2D texture to display on the screen using the RenderGraph::SetPresentTexture(); In reality, this texture isn’t displayed directly on the screen but is first sampled and copied to the swapchain, so the Render Graph adds a hidden pass for this. When this texture hasn’t been assigned to any texture, the swapchain will be colored with the clear value set to black and sent to the screen. Push Constants Supported I’ve added the ability to use Vulkan Push Constants. Push Constants are data packets that can be sent to the GPU in parallel with the drawing command. Their size is very limited, 128 bytes, but their transfer speed is extremely fast. A hardware limitation is that the offset and size parameters must be multiples of four, so I used a struct called Words32 to dictate the 32-bit size and offset, not the 8-bit one. Furthermore, internally, the engine checks the state of the previous push constant for each push constant update, so as not to make unnecessary updates and to register the push constant command only when necessary, and only partially for the relevant bytes. Shaders Improvements I improved the shader code a bit by reducing the arguments needed to create a shader, and I also unified the layout; all shaders use the same VkPipelineLayout . The Problem and The Solution When I was writing the shaders to get these things on screen, I ran into errors telling me I was assigning a buffer descriptor to Descriptor Set 0 with binding 0, even though they’re actually textures. However, in the shader, I wasn’t requesting any of this, since the vertex data was written directly into the shader. After some research, I discovered that Slang shaders were creating bindings for these arrays outside the shader. To fix this, I simply moved the arrays into the vertex shader function, marking them with const. And note that all these images/videos use the swapchain pass, so this was all just a test. Now I’ll have to try declaring a real pass with Render Graph and try to draw something, hoping everything works correctly :/
DEVLOG 20 - A Better Triangle Intro Hi Stardance! This triangle was created with Render Graph . The entire process is divided into two steps: the first draws the triangle on a user-selected image, and the second takes that image, samples it, and draws it on the swapchain so the triangle can be seen on screen. Clean and Simple API The beauty of this is evident in the photo (third attachment). You only need to write a few lines of code to achieve all this compared to the complexity and number of lines of code required by Vulkan. Render Graph thus creates all the resources needed for synchronization, such as barriers , and attempts to alias memory whenever possible. It also leverages Resource Pooling , so images aren’t destroyed and recreated at every frame. Instead, if they have identical requirements, they are reused, avoiding unnecessary Vulkan calls. MSAA Deprecated MSAA images have been deprecated because, from a desktop computer perspective, they aren’t worth using because they require a lot of computational resources. To achieve anti-aliasing, it’s best to use post-processing passes that use FXAA (Fast Approximate Anti-Aliasing) or TAA (Temporal Anti-Aliasing). There are probably some bugs still present in the Render Graph despite the many already fixed; I’ll work on them.
DEVLOG 21 - ECS Refactoring Intro Over the past ten hours, I’ve worked extensively on the ECS , making it more robust, easier to use, more secure, and more efficient. What’s changed: New Way To Record Entity Commands Entity Command Pools are still used, but they’re managed not by the user but by the Entity Manager. The old CreateCommandPool() method no longer exists. Now, to execute a command on entities, you make a request to the EntityManager , which takes the command and places it in an EntityCommandPool of its choosing. The EntityCommandPool is chosen based on the SystemId provided by the engine with methods like Start, Awake, Update, etc. This reduces complexity and allows for systems that can run natively in parallel on multiple threads. Improved Efficiency Internally, the Entity Manager has improved the way to compact batches after command execution, making it simpler and faster. Instead, iterating over all batches only iterates on the entities that are no longer valid, and those slots are refilled with the components of the valid entities at the end of the last batches. Batch creation and destruction is handled automatically by the EntityManager . New Way To Query Tables The way to find tables with certain requirements has improved; the old method required registering a query and then returning a “ticket” used to access the query results. The operation is now simpler and more unified: The EntityManager is asked for all tables that meet the QueryInfo structure requirements, such as the archtype. The EntityManager checks whether the query already exists; if it doesn’t, it calculates it on the fly and returns it. Queries Updated Only When Needed Queries are updated only when tables are created/destroyed; otherwise, they remain - static and aren’t updated, saving calculations . The next step will be to verify if everything works, since I haven’t tested anything yet because I’m forced to do this devlog due to the ten-hour time limit. :/ Sorry about the picture, it’s the same, I didn’t have time to do anything else
DEVLOG 22 - ECS Bugs Fixed, Graphics Files Reorganized Hi Stardance! What I Did In this dev log, I fixed some of the last bugs the ECS code, so it now works and is very efficient. I ran several tests destroying, creating, and moving entities from one archtype to another, and everything works. I then worked on the project structure of the graphics part by fixing the graphics include files. What Went Wrong These updates mentioned so far have been successful. Two hours ago, I added a method in the graphics pass responsible for instanced drawing, so I took advantage of the opportunity to create a buffer to read the instance positions to see if it worked. I still don’t know why, but it doesn’t work. The application freezes, and sometimes the driver crashes (it scared me a little… :/ ). The Validation Layers don’t report anything wrong… So I need to figure out what’s wrong and fix it. The image shows some of the methods available after fixing the folders. The methods are in the Graphics class in the include folder.
DEVLOG 23 - Instanced Draw & Some Fixes Intro Devlog time!! In the last devlog, I had some issues with instanced drawing and reading a position buffer. What Was The Problem? I worked hard, but I managed to figure out where the problem was and fix it. (The problem was due to a for loop responsible for creating the address buffers. I was saving pointers outside the for loop with structs allocated inside the for loop; therefore, the pointers were pointing to corrupted memory or nothing.) Render Graph Fixes I fixed several things in the Render Graph that could cause future problems. I added small guards within the Render Graph so that if the user does something wrong, the application doesn’t crash unexpectedly. For example, previously, if the user set a texture to display that they’d never used (never involved in a transfer operation, never used as a graphic attachment), the program would crash. With these simple guards, everything is solved. Easier Resource Usage Declaration I’ve also added the ability to easily declare textures and buffers usage in the Graphics Pass class with dedicated methods like UseBufferReadOnlyVertex(...) , UseTextureVertex(...) , and others. The image shows a grid of 20x20 quad meshes drawn with a single draw call instead of 400 using instanced draw.
DEVLOG 24 - Error Manager, Copies & More Intro Hi Stardance! Lately, I’ve been focusing mainly on improving error handling returned by Vulkan and fixing some code here and there. New Error Manager System I’ve created a system responsible for error handling so that when an error occurs, such as a failure to allocate memory due to fragmentation or any other critical error, the app places a text file with information about the error in a folder called logs (created on the fly if it doesn’t exist). Immediately afterward, an error message is displayed on the screen explaining what happened. When the user presses the OK button, the app closes in the pop-up by calling std::abort(); . Some Test On Other PCs I tried running Eve outside of my PC on two other PCs, but since they’re a bit older, they don’t have support for Vulkan 1.4, so the app can’t be started. Swapchain Improvements The code for creating the swapchain has been improved somewhat, making it more secure and robust. New Copy Support I’ve added support for buffer and texture copy operations between resources that aren’t the same type (one transient and one persistent). Next Step: I want to make Eve a little more portable, so in the next few hours I’ll try using Vulkan 1.2, trying not to mess with the code. If necessary, I might resort to using Vulkan 1.3; I’ll see…
DEVLOG 25 - Eve is “Multi PC” Hi everyone! What’s changed since last time? More Device Supported As promised, Eve now uses Vulkan 1.2, so it can be used on multiple devices. Obviously, the device requires that, in addition to supporting Vulkan 1.2, it also supports some extensions that became core in Vulkan 1.3. Tests On Other PCs I then tried running the app on the only PC I had at home, but it crashed. I then tried updating the graphics driver, but that didn’t help; unfortunately, that PC is too old. I then asked a friend of mine to test the app. After fixing some issues, it started, but it would crash instantly. After hours of debugging, I found the problem: the problem was in resource allocation within the Render Graph, which only occurred with integrated GPUs (my heap selection algorithm for integrated GPUs was wrong). It’s now fixed. I also added my checks for failed Vulkan or VMA calls in places where they were missing, so now everything should work properly. Math Packet In Eve I also added a small mathematical component to Eve, including Vector2,3,4 ; Vector2Int,3Int,4Int ; Quaternion ; and Matrix4x4 . I must say that quaternions were difficult to understand at first, but once you understand how they work, it’s very easy to visualize them in your head. The first attachment shows Eve running on the PC of this friend of mine, whom I thank so much for his help, and the second image shows Eve running on my PC.
DEVLOG 26 - Input System Hi Stardance! The New Input System Since I couldn’t interact much with the graphics engine at the moment, I chose to create an Input System that currently only supports keyboard and mouse. It has methods like IsKeyDown(...) , GetMouseState(...) , IsMouseUp(...) , and similar ones. It’s quite simple, but it allows you to interact with the world, for example by creating a camera or a moving player. The Cube For fun and to test a bit, I tried creating a scene with a slightly rotated cube with direct light, obviously using my Render Graph, which allows you to do all this in about 150 lines of code (CPU side) instead of having to manually write barriers, configure passes, and many other repetitive tasks. I’m still using glm for matrix math, but I’m trying to reach a more stable level with the Eve package.
DEVLOG 27 - Material System Intro After some code rewrites, such as the separation between shaders and materials, the materials system now works. It’s very similar to how it works in Unity. I’ve figured out how to set things like material properties (floats, integers, vectors, etc.) directly from C++ using their names, without manually binding code. How Vulkan Handle All Of This? In Vulkan, you can’t set a shader parameter directly with a name. You need to create a buffer on the GPU, specifically a UBO, typically used for materials, bind it using a descriptor, and then bind it on the CPU. All of this is hidden by Eve, making the code easier and faster to write. What It Does? Basically, once the shader is compiled, it’s analyzed and checked for a struct called Properties. If it exists, this struct will be used for the material properties. Each field within it will be settable directly from the CPU using its name. Eve, now knowing the size of the struct and the field offsets, creates a buffer for the materials (actually, one for each frame in flight) and uses it to write everything a material might need, thus allowing for very simple parameter setting. How To Use It: The material provides an ID via the GetPropertyUBOId function, which must always be retrieved at each frame since it is not the same from frame to frame. This ID can be sent to the shader via push constant, which then allows access to the material’s property UBO, which contains all the values set on the CPU side. A simple cube rotating on itself using the new Material System and simple direct lighting
DEVLOG 28 - New Render System Hi Stardance! Intro I think this devlog is consistent with the next one I’m working on, since the work I’ve done in the last few hours isn’t quite finished, as there are still some bugs to resolve… Why a new render system? So far, I’ve been working on improving Eve’s rendering system. Instead of having to manually create buffers and the like, Eve has a completely automated system similar to the one used by Unity. For example, when you try to draw an object, you need things like object transformation matrices. If you then need more data, the limited size of push constants is no longer enough. Per Instance Params Eve, therefore, with its new rendering system, revolutionizes the way we write code, reduces bugs, and simplifies it. For each draw call sent to the GPU, the engine sends a buffer called InstanceParams to the GPU, which contains, for each drawing instance, its model matrix and its inverse. These matrices can then be retrieved using simple, custom functions ready for use in the shader. Per Render View Data For camera data, the process is similar. For each RenderView object, Eve allocates these objects on the GPU in a contiguous buffer from which the view, perspective, VP, and other matrices can be accessed. Custom Draw Info Data If you want to send custom data to the shader, each drawing function offers a pointer called DrawInfo that allows you to send data to the shader, which can then be accessed. If set to null, the shader will not send anything. GLM & A Flycam I also created a flycam and deprecated the Eve math package to use the glm one. Honestly, I want to focus on Eve and not the math, which is why I chose this option. Next Step: I still have some bugs to fix regarding making more than one draw call, but I’m working on it.
DEVLOG 29 - 1M Entities! Hi Stardance! Intro Since the last day, I’ve been working alone and have run into several issues… Most of them have been resolved. Some Tests So I started running some tests to check the speed of my new rendering system, and with 100,000 entities drawn to the screen with a single draw call, I was getting 30 FPS. After parallelizing the code a bit and reducing the copies, the results are now better: 100,000 entities with single draw calls get 50-60 FPS. 100,000 entities with a single instanced draw call get 230-250 FPS. 1,000,000 entities with a single instanced draw call get 30 FPS. What Need To Be Optimized Actually, I could optimize even more and double these FPS, but the current problem is that I’m calculating the matrices on the CPU side, so I’m doing a lot of calculations that currently take up a good portion of the necessary CPU time, about 50%. The idea would be to move all the work to the GPU in the future with compute shaders, thus significantly reducing the CPU load. I’ll see if I can do this… Maybe in a while, when I add full support for compute shaders. (I have a Ryzen 5 5600 X and an RX 6600) Rendering System Time: Not counting the matrices, the rendering cycle along with the Render Graph takes about 2-2.5 ms, almost all of which is spent on the Render Graph. I have also fixed some problems with Swapchain Recreation when the window is minimized. Problems With RenderDoc Five of these eight hours have been pure frustration, as I don’t understand why, but the app crashes on RenderDoc. Normally, on my PC it starts and works, but on RenderDoc it crashes… I’ve tried every way to understand the problem, but unfortunately I haven’t been able to. I’ll also test on other PCs to better understand the problem. Unfortunately, I don’t have time on my side, so I’ve had to put the issue aside for now…
DEVLOG 30 - Compute Shaders Hi Stardance! Intro I’ve finally implemented compute shaders—as the title suggests—alongside conducting some tests and reorganizing the project. Compute Shader Support I’ve added support for compute shaders, meaning they can now be used just like any other type of pass, whether graphics or transfer. Optimizations I’ve also utilized compute shaders internally within the engine to speed up matrix calculations; here are the results: With 100,000 entities using instanced rendering, I’m getting 800 FPS, up from the previous 250. With 1,000,000 entities using instanced rendering, I’m getting around 90 FPS, up from the previous 30. With 100,000 entities using independent draw calls, I’m getting around 90 FPS, up from the previous 30. I’d say the results speak for themselves, and I’m quite happy with these optimizations. As mentioned in the previous devlog, testing was performed on my PC, which is equipped with a Ryzen 5 5600X and an RX 6600. Swapchain & CMake I also made slight modifications to the swapchain recreation code to make it faster and reduce stuttering. Finally, I tidied up the CMakeLists file to make it more organized and prepare for the release. The video shows a scene with 1M entities rendered in real-time using instanced draw call at 90 FPS
DEVLOG 31 - It’s not my fault! Hi Stardance! Unlike the other devlogs, this one is very quick and simple. A Little Recap In devlog 29, I encountered some issues with RenderDoc, even though the app kept running fine and caused no problems outside of RenderDoc itself. What I Did After doing some online research, I discovered that RenderDoc has issues with AMD drivers, which can cause the app to crash. So, I decided to try AMD’s Radeon Developer Tools (a profiler similar to RenderDoc, designed specifically for AMD GPUs). No errors were reported and everything works perfectly, so the problem most likely lies in how AMD drivers interface with RenderDoc.
DEVLOG 32 - UI Support Hi Stardance, Intro I’ve been working on the UI lately, as I wanted to give the user a way to interact with the engine beyond just mouse and keyboard input. The UI in Eve I opted for Dear ImGui and created a lightweight wrapper that allows it to run within Eve. I stripped away some of the boilerplate code associated with the standard Begin and End calls, making it slightly simpler and safer to use than raw ImGui. I also added support for dockable windows. The video shows a scene with 1,000 cubes; thanks to the UI, you can modify their color, position, and rotation. You can also change the direction of the direct light. The code required by this UI is just five lines.
DEVLOG 33 - Meshes & Fixes Hi Stardance! Intro We’re getting closer to the release build of Eve! I have to say that with this devlog, the engine is practically finished and ready for shipping; I just need to tweak a few final details and we’re all set… Meshes: In this devlog, I worked on the mesh system—fleshing it out and making it functional—and added standard meshes to Eve: a cube, a UV sphere, an icosphere, a plane, and a quad. Some Bugs Fixed While implementing this, the program kept crashing for no apparent reason; after two hours of debugging, I found the error in the Render Graph—caused by the order of Eve’s internal passes—which is now fixed. Internal Shaders Organization I also embedded the engine’s internal shaders directly into the executable, so there’s no need to remember to include them alongside the executable when creating an app. The video shows the same UI as the previous devlog—featuring controls for color, rotation, cube position, and direct light direction—but this time, you can change the meshes of the “thousand-odd” cubes at runtime using the standard Eve meshes listed above, via a simple UI dropdown menu.
DEVLOG 34 - Icon, Windows & More Hi Stardance! Intro The release is getting close, so I’m tidying up a few final details; I’ve finally turned my attention to a slightly more relaxed and lighthearted part of the project. Engine Settings I added a method to start the engine that accepts configuration settings for how the app runs. You can also choose whether or not to enable VSync at runtime. Window Class I added a window management class that allows for various operations, such as toggling fullscreen mode and manually changing the resolution, position, title, etc. I also included a method to set the window icon using a PNG image. Eve’s Icon I also spent some time on Canva trying to create an icon—a logo—for Eve. After several attempts, I settled on the one in the attachment.
DEVLOG 35 - Documentation Hi Stardance! Intro I’ve finally finished writing the documentation for Eve—a rather tedious and repetitive process, but a necessary one. How The Docs Is Structured: Every part of the engine is documented; inside the docs folder, you’ll find instructions on how to launch the engine, along with subfolders for each component—graphics, input, window management, and so on. Next Last Steps: I still need to create the README and tidy up a few things in the project, as well as write instructions on how to configure Eve for use on one’s own PC… But after a whole summer, I’m finally close to shipping!
DEVLOG 36 - Black Hole! Hi Stardance! Intro I’ve been working really hard lately, and I think I’ve reached a milestone with Eve that I honestly never expected to hit. The project is finally complete; now I just need to click that nice button to ship it. I’ve spent this time working on the README, improving the documentation, fixing bugs, and building a demo using Eve. Eve Demo The demo is a gravity simulation featuring hundreds of thousands of entities orbiting a black hole. You can tweak various parameters—such as time, the black hole’s gravitational pull, lighting, colors, meshes, and much more. If you’d like to test it out, you can find it in the GitHub releases; there’s a ready-to-use .exe, or the source code if you’re on Linux—or if you simply want to understand how Eve works or make some modifications yourself. Problems Encountered While building the demo, I ran into—and have since resolved—some very frustrating bugs, such as memory corruption in the ECS caused by the continuous creation and destruction of entities and their components. I also added UI text support and implemented the ability to register “stages” belonging to classes or structs that can be called by the engine.
Ships:
Eve is a graphics engine written entirely in Vulkan , with the primary goal of learning Vulkan and C++ while simplifying their usage. Originally conceived as a simple, lightweight wrapper around Vulkan , Eve now includes: A Render Graph designed from scratch that leverages technologies such as memory aliasing (where multiple resources share the same memory space) and resource pooling (reusing resources across frames). It performs the core function of a Render Graph: by simply knowing how resources are utilized, it automatically issues the necessary synchronization barriers to the GPU. Developing the Render Graph was a grueling process, but it proved worthwhile in terms of both performance and the educational value of the experience. An ECS (Entity Component System) also designed from scratch, following the model of Unity’s DOTS ECS . Instead of scattering resources across VRAM—which slows down access due to constant memory jumps—game objects are organized into Archetypes. Components are distributed in contiguous memory batches, thereby minimizing cache misses. A rendering system that automates the insertion of transforms into buffers; these are subsequently processed into matrices via a compute shader and sent to the rendering shaders. It also features a material system that analyzes shader composition, looking for a struct named “Properties” that allows fields to be assigned by name from the C++ side. Support for the Slang shading language with a bindless system . Eve provides a file named Eve.slangh that simplifies and automates the retrieval of textures, buffers, and samplers from descriptors. Compute shader support is also included. An integrated, easy-to-use Input system inspired by Unity’s Input System , along with a lightweight UI wrapper that makes using Dear ImGui simpler and more intuitive. Eve also includes a demo featuring a gravitational simulation of thousands of entities orbiting a black hole, allowing various parameters to be adjusted in real-time....
|
1792856920.7067
|
1792943320.7067
|
|
12513
|
Papertrail - Receipt manager by @Andy | Stardance
|
Andy
|
0
|
303.6
|
0
|
[]
|
[{"post_id": 47238, "ts": "202 [{"post_id": 47238, "ts": "2026-08-15T00:59:45Z", "hours": 13.5511, "text": "Just getting ready to deploy. All 800 tests passing. CI workflow passing. Next, gotta buy a vps, or server or smt, and launch."}, {"post_id": 44267, "ts": "2026-08-09T22:08:19Z", "hours": 3.2869, "text": "Big change! Im allowing external recipeints (no accounts) to pay reimbursements, after verifying their emails"}, {"post_id": 43682, "ts": "2026-08-09T02:46:24Z", "hours": 1.9833, "text": "Added more recents to the dashboard. Added infinite scroll. and colaborative records."}, {"post_id": 43525, "ts": "2026-08-08T20:58:46Z", "hours": 4.9936, "text": "Fully redesigned the search pages. I felt that the search pages were too monolithic so I introduced infinite scroll, with a new, Stripe inspired design."}, {"post_id": 43030, "ts": "2026-08-08T02:31:00Z", "hours": 3.4111, "text": "Completely redesigned the record detail viewer AND added shareable records, for collaboration."}, {"post_id": 42537, "ts": "2026-08-07T10:35:08Z", "hours": 15.1425, "text": "fully migrated to dramatiq with rabbit mq"}, {"post_id": 40603, "ts": "2026-08-04T08:09:38Z", "hours": 5.8611, "text": "I finallyyyyyyy got billing working, with storage plans! this took forever, and had soooo many hiccups, but its finally working, and is so satisfying!"}, {"post_id": 40312, "ts": "2026-08-03T19:00:19Z", "hours": 9.5583, "text": "I added my accent color over my dashbaord. Im also trying to get biling working, but its such a pain. Pretty close tho:"}, {"post_id": 39228, "ts": "2026-08-02T01:55:27Z", "hours": 1.5169, "text": "Added gated features. Also considering switching to dramatiq, for better performance and reliability, before production. Though, i might do that via ci/cd."}, {"post_id": 39203, "ts": "2026-08-02T00:14:24Z", "hours": 12.1572, "text": "Yet again, new dashboard designs."}, {"post_id": 37370, "ts": "2026-07-30T01:14:47Z", "hours": 16.1444, "text": "Improved reimbursment views templates - and fixed edge cases."}, {"post_id": 34913, "ts": "2026-07-26T00:38:31Z", "hours": 3.8969, "text": "Finalized and styled the reimbursements system."}, {"post_id": 34450, "ts": "2026-07-25T05:31:27Z", "hours": 6.5217, "text": "Created the peer to peer reimbusrements system that is evidence backed and MOVES REAL MONEY! At this point, Ive also had the website penetration tested. The website at this stage also has IRS/IRD audit compliancy."}, {"post_id": 33820, "ts": "2026-07-24T01:56:22Z", "hours": 10.5292, "text": "New dashboard designs."}, {"post_id": 32719, "ts": "2026-07-22T01:28:36Z", "hours": 9.2058, "text": "Added IRS compliance - ie, 7 year mandatory retention period, plus entire change log. Its basically git for your expenses now."}, {"post_id": 31631, "ts": "2026-07-20T05:58:10Z", "hours": 4.8464, "text": "Added merging support. Now, records pulled from plaid can be matched with a scanned record if one is availble, increasing security for the future reimbursement system."}, {"post_id": 31027, "ts": "2026-07-19T02:37:56Z", "hours": 5.0464, "text": "Big update - I added plaid for automatic transaction intake - and made the App automatically create folders, and organize records into them."}, {"post_id": 30477, "ts": "2026-07-18T02:37:37Z", "hours": 7.8897, "text": "Created folder system, that OCR can autocategorize in."}, {"post_id": 29859, "ts": "2026-07-17T00:40:39Z", "hours": 1.665, "text": "Allow users to choose to receive notifications."}, {"post_id": 29795, "ts": "2026-07-16T22:24:39Z", "hours": 4.41, "text": "Added push notifications to the app"}, {"post_id": 29315, "ts": "2026-07-16T05:09:42Z", "hours": 16.1822, "text": "Added email reminders for expiring records, that match my styling of the auth emails."}, {"post_id": 27432, "ts": "2026-07-13T00:06:31Z", "hours": 12.3369, "text": "Added orphaned file cleanup cycle and pagination. Also cache more data so faster experience for the user."}, {"post_id": 26356, "ts": "2026-07-11T03:11:00Z", "hours": 2.1206, "text": "Today, I did a lot of work in the background. Now - document processing occurs in a background process - users immediately are redirected to a skeleton loader, and then the add_record form when the data is ready. Furthermore, ocr results are cached for 15 mins so any page reloads, or tab closes prevent api rate limits being prematurely hit. The logs show this. the consistent get requests are the same add_record form being loaded with prepopulated data, after multiple reloads and tab reopens."}, {"post_id": 26220, "ts": "2026-07-10T21:41:23Z", "hours": 1.0217, "text": "I optimized the dashboard and records list view. I realized cards were good for only a few records, but the moment they start piling up - it gets claustrophobic. So, i made the results appear as rows, like search results from google, or firefox."}, {"post_id": 25840, "ts": "2026-07-10T10:00:22Z", "hours": 10.8506, "text": "I just did some small optimizations today. I realized that anybody could just “url-hop” to get to a password view and create a password - so I fully locked down all password views securely."}, {"post_id": 23985, "ts": "2026-07-07T07:52:44Z", "hours": 13.2497, "text": "Over the past few days - i worked a bit more on micro interactions. I fixed a few bugs and added persistance for things like the sidebar and accordian state. I also added loading states for most other things as well (like the active search, auth pages…)"}, {"post_id": 22610, "ts": "2026-07-05T05:01:08Z", "hours": 3.8322, "text": "Today, I implemented HTMX in my records home view to create an active search, with the dateparser library for natural language date support. I also added it in the sidebar so no reloads are required for filtering records, changing pages…"}, {"post_id": 22105, "ts": "2026-07-04T11:50:11Z", "hours": 9.7197, "text": "Today, I created the system to upload multiple supporting files to a single record. So currently, the record creation process is a multi step process. Upload file –> OCR –> record validation and creation –> supporting files addition"}, {"post_id": 20679, "ts": "2026-07-02T10:30:32Z", "hours": 8.0081, "text": "Further improved the user dashboard, and added some more links."}, {"post_id": 19846, "ts": "2026-07-01T07:44:16Z", "hours": 4.1394, "text": "Made a nice looking user interface dashboard that shows recent documents and usefull stats, with quick links. as features are added, they will populate this."}, {"post_id": 19059, "ts": "2026-06-30T07:46:04Z", "hours": 4.0472, "text": "I created a simple user dashboard. Its still far from complete, but better than the generic list view I was using before. Also added more document types for greater coverage."}, {"post_id": 18257, "ts": "2026-06-29T10:38:49Z", "hours": 6.0269, "text": "Styled the form upload pages."}, {"post_id": 17461, "ts": "2026-06-28T07:48:49Z", "hours": 6.7481, "text": "Today, I created a system where (in one step) - a document can be scanned, uploaded to cloudflare storage, and used to pre-populate a form. the pipline so far looks like: Scan doc –> OCR + llm –> prepopulate form –> user validation –> create record. Or you can create a record manually. The entire process is extremely secure. Documents are only interacted with via signed urls, all authentications are passwordless, and all uploads occur client side for fastest speed possible."}, {"post_id": 16667, "ts": "2026-06-27T03:01:36Z", "hours": 7.4625, "text": "Today, I created the document storage system. Users can securely add, delete and read documents from cloudflare using temporary signed urls. The next step is to create a record system, that can be related to many documents."}, {"post_id": 15988, "ts": "2026-06-25T23:22:42Z", "hours": 13.2717, "text": "Polished up user interface"}, {"post_id": 13990, "ts": "2026-06-22T23:15:19Z", "hours": 6.4078, "text": "Storing files now saves to google cloud storage."}, {"post_id": 12452, "ts": "2026-06-20T09:50:47Z", "hours": 4.1767, "text": "I decided to ditch the colourfull theme for a monochromatic one."}, {"post_id": 12222, "ts": "2026-06-19T23:02:02Z", "hours": 4.5556, "text": "Added dark and light mode support for all the other auth and account related pages (like email changing…). This was lots of fun (and quick) because much of the base work was completed because of django templating inheritance."}, {"post_id": 11786, "ts": "2026-06-19T05:39:53Z", "hours": 5.3311, "text": "Today, I completed styling the auth pages. Now all match the light and dark theme of the landing page. This was wayy more time consuming than it ought to be, but, its finished now."}, {"post_id": 11156, "ts": "2026-06-18T07:34:04Z", "hours": 9.0336, "text": "Styling the authentication forms. Django allauth makes this quite difficult, but its a work in progress."}, {"post_id": 8575, "ts": "2026-06-14T08:11:36Z", "hours": 6.5511, "text": "Made dark mode for the landing page. I created a simple user interface design on figma (light and dark mode), to move away from notions image."}, {"post_id": 7940, "ts": "2026-06-13T07:51:24Z", "hours": 3.8217, "text": "Today, I created a basic landing page for the project with tailwind and alpine js. It uses the notion interface as the hero image (since my interface isn’t even built yet!) but that will change soon…"}, {"post_id": 7802, "ts": "2026-06-13T00:51:06Z", "hours": 2.1431, "text": "I finally added Tailwind CSS and Alpine js to the project. For the longest time, Tailwind has always caused issues, but I finally got it working and it feels like magic - not having long css files. Here is a simple h1 element that changes from blue to red on hover."}, {"post_id": 5470, "ts": "2026-06-09T08:19:19Z", "hours": 0.4386, "text": "Integrated Authentication (Local and OAuth). Authentication is probably my favouite part of making a website - but also the most sensitive. Today, I integrated Django Allauth with Google and Github OAuth (and local sign in/up). The process was A LOT easier, quicker, and more secure than my previous “default” (default django auth), simply due its level of sophistication. I’m really excited about the progress today! Next step - styling."}, {"post_id": 4818, "ts": "2026-06-08T10:05:28Z", "hours": 0.5072, "text": "Initialized Django project."}]...
|
Title: Papertrail - Receipt manager by @Andy | Sta Title: Papertrail - Receipt manager by @Andy | Stardance
Devlogs:
Initialized Django project.
Integrated Authentication (Local and OAuth). Authentication is probably my favouite part of making a website - but also the most sensitive. Today, I integrated Django Allauth with Google and Github OAuth (and local sign in/up). The process was A LOT easier, quicker, and more secure than my previous “default” (default django auth), simply due its level of sophistication. I’m really excited about the progress today! Next step - styling.
I finally added Tailwind CSS and Alpine js to the project. For the longest time, Tailwind has always caused issues, but I finally got it working and it feels like magic - not having long css files. Here is a simple h1 element that changes from blue to red on hover.
Today, I created a basic landing page for the project with tailwind and alpine js. It uses the notion interface as the hero image (since my interface isn’t even built yet!) but that will change soon…
Made dark mode for the landing page. I created a simple user interface design on figma (light and dark mode), to move away from notions image.
Styling the authentication forms. Django allauth makes this quite difficult, but its a work in progress.
Today, I completed styling the auth pages. Now all match the light and dark theme of the landing page. This was wayy more time consuming than it ought to be, but, its finished now.
Added dark and light mode support for all the other auth and account related pages (like email changing…). This was lots of fun (and quick) because much of the base work was completed because of django templating inheritance.
I decided to ditch the colourfull theme for a monochromatic one.
Storing files now saves to google cloud storage.
Polished up user interface
Today, I created the document storage system. Users can securely add, delete and read documents from cloudflare using temporary signed urls. The next step is to create a record system, that can be related to many documents.
Today, I created a system where (in one step) - a document can be scanned, uploaded to cloudflare storage, and used to pre-populate a form. the pipline so far looks like: Scan doc –> OCR + llm –> prepopulate form –> user validation –> create record. Or you can create a record manually. The entire process is extremely secure. Documents are only interacted with via signed urls, all authentications are passwordless, and all uploads occur client side for fastest speed possible.
Styled the form upload pages.
I created a simple user dashboard. Its still far from complete, but better than the generic list view I was using before. Also added more document types for greater coverage.
Made a nice looking user interface dashboard that shows recent documents and usefull stats, with quick links. as features are added, they will populate this.
Further improved the user dashboard, and added some more links.
Today, I created the system to upload multiple supporting files to a single record. So currently, the record creation process is a multi step process. Upload file –> OCR –> record validation and creation –> supporting files addition
Today, I implemented HTMX in my records home view to create an active search, with the dateparser library for natural language date support. I also added it in the sidebar so no reloads are required for filtering records, changing pages…
Over the past few days - i worked a bit more on micro interactions. I fixed a few bugs and added persistance for things like the sidebar and accordian state. I also added loading states for most other things as well (like the active search, auth pages…)
I just did some small optimizations today. I realized that anybody could just “url-hop” to get to a password view and create a password - so I fully locked down all password views securely.
I optimized the dashboard and records list view. I realized cards were good for only a few records, but the moment they start piling up - it gets claustrophobic. So, i made the results appear as rows, like search results from google, or firefox.
Today, I did a lot of work in the background. Now - document processing occurs in a background process - users immediately are redirected to a skeleton loader, and then the add_record form when the data is ready. Furthermore, ocr results are cached for 15 mins so any page reloads, or tab closes prevent api rate limits being prematurely hit. The logs show this. the consistent get requests are the same add_record form being loaded with prepopulated data, after multiple reloads and tab reopens.
Added orphaned file cleanup cycle and pagination. Also cache more data so faster experience for the user.
Added email reminders for expiring records, that match my styling of the auth emails.
Added push notifications to the app
Allow users to choose to receive notifications.
Created folder system, that OCR can autocategorize in.
Big update - I added plaid for automatic transaction intake - and made the App automatically create folders, and organize records into them.
Added merging support. Now, records pulled from plaid can be matched with a scanned record if one is availble, increasing security for the future reimbursement system.
Added IRS compliance - ie, 7 year mandatory retention period, plus entire change log. Its basically git for your expenses now.
New dashboard designs.
Created the peer to peer reimbusrements system that is evidence backed and MOVES REAL MONEY! At this point, Ive also had the website penetration tested. The website at this stage also has IRS/IRD audit compliancy.
Finalized and styled the reimbursements system.
Improved reimbursment views templates - and fixed edge cases.
Yet again, new dashboard designs.
Added gated features. Also considering switching to dramatiq, for better performance and reliability, before production. Though, i might do that via ci/cd.
I added my accent color over my dashbaord. Im also trying to get biling working, but its such a pain. Pretty close tho:
I finallyyyyyyy got billing working, with storage plans! this took forever, and had soooo many hiccups, but its finally working, and is so satisfying!
fully migrated to dramatiq with rabbit mq
Completely redesigned the record detail viewer AND added shareable records, for collaboration.
Fully redesigned the search pages. I felt that the search pages were too monolithic so I introduced infinite scroll, with a new, Stripe inspired design.
Added more recents to the dashboard. Added infinite scroll. and colaborative records.
Big change! Im allowing external recipeints (no accounts) to pay reimbursements, after verifying their emails
Just getting ready to deploy. All 800 tests passing. CI workflow passing. Next, gotta buy a vps, or server or smt, and launch....
|
1792705968.9037504
|
1793310768.9037504
|
|
32703
|
ASTRA by @AustinB | Stardance
|
AustinB
|
0
|
304.57
|
0
|
[]
|
[{"post_id": 80388, "ts": "202 [{"post_id": 80388, "ts": "2026-10-17T14:09:45Z", "hours": 1.2028, "text": "Devlog 29 Made mission planner UI. Starting to get pretty fast at these(although they still look questionable sometimes)"}, {"post_id": 80193, "ts": "2026-10-16T17:22:07Z", "hours": 11.0283, "text": "Devlog 28 OK ive fixed/implemented three major things. 1: camera finally logarithmically zooms and moves in a way that i am happy with. There is only one problem left now, and that is that it cant follow a moving point yet, however this shouldn’t be too bad i hope 2: ive changed my data so that the planets are now aligned with the XY plane(this is not a hardcoded fix so it it still possible to import your own data and it work completely fine) 3: ive made the grid follow the camera(as the camera stays at 0,0 and moves objects around it) and scale logorymetrly too which looks very professional im my opinion Now onto finishing up the misson planning side of this. ive got a ‘working’ state of it atm but it is quite tempramental so we shall seee"}, {"post_id": 79163, "ts": "2026-10-12T20:57:29Z", "hours": 8.3697, "text": "Devlog 27 Yooo Im back. Thank god the deadline has been extended broo. Done mostly boring stuff tbh. Ive begun on working on adding a grid that scales with the camera and im like 60% there. Shaders haven’t really clicked for me yet so im still kinda joining random things to other random things and hoping it looks correct tbh. Also begun work on making the mission planner automatically sort and setup lambart test cases for my solver to solve(ive actually done this already, however its really hard to validate if my resluts are anywhere near correct, they look correct but i have no numerical way of knowing, so ima go with the ignore it untill something else goes wrong and hope its fine idk) devlogs will prolly be focused on fixing the camera movement(zooming is a massive pain as its really hard to know when you want to zoom massivly or small - like you want to be zooming out fast if you want to go between planets, but if you want to go between moons or something its hard:( ) and misson planner aspects of this project for this week or so. So boring devlogs. cant wait till i can finially ship this and you can all have a go."}, {"post_id": 73265, "ts": "2026-09-24T18:18:17Z", "hours": 6.7578, "text": "Devlog 26 yo guys horrible news 😭 ive gone and done it, boken my finger(if for the dumbest reason every too bro). Which means that i generally cannot type anywhere near as fast as usahll. Dw your still gonna get your ushall yap sesh tho. Im hoping that this dosent afect the timeline or anything of my project, but i have been busy. First ive started adding sound effects which are generrally a bigger pain than i thought. But now every button/ui action has an effect. however there is not music/ambiant noise. IDk weather im going to add any music but i think a low rocket engine would be cool(lets pretend you can hear sound in space). Done a bit on the code side, but really most of it has been UI. ive cahnged the hitboxes of the buttons to fit them, which was a pain as i have like 50 at this point. Ive made them hilight when you hover over them and things like that. But one thing im really confused on is when the deadline for this is? Like i got an emial saying oct 31 as they extened it but now theres this think with bukubuks or something and im not sure what that means? if you know can you leave a comment or something pelasee."}, {"post_id": 72384, "ts": "2026-09-22T20:02:52Z", "hours": 3.6989, "text": "Devlog 25 Added a main menu. This was actually a massive pain as i had no like localised start function. So this meant that scripts and objects were doing things they weren’t meant to. So had a minor architectural overhaul. but now it works. Also ive added a way to quit the game too, in both the sim and the main menu. Also yes that it the orion capsule thing, why? Its the only textured model i could find for free. (Kinda, i had to download a 3d print 3mf or something, and i wish i was kidding but spend a few hours a few weeks ago literally assembling the model in unity, so this may just beat garten of banban for the most optimised topology of the year) Only 8 days left and i am so screwed, this entire menu was a massive procrastination from fixing the physics(it keeps slowing down the timestep to like 1e-9 seconds and i cannot figure out why, i have literally almost rewritten my physics at this point and i have had minimal difference - also the cameras bugged as hell when its following a moving object)"}, {"post_id": 71920, "ts": "2026-09-21T19:34:47Z", "hours": 3.3044, "text": "Devlog 24 Ok one section has been finished. Its a small one but its done. This was m first time working with files and making documents so icl the code is like 85% spaghetti unassisted mess, but it works. It allows you to export data for planets/moons that you want in either JSON or CSV format. Also the ui is fully wokring with this one for once. Sorry for the most boring devlog of the year here but their prolly gonna get worse as i start doing more boring things to finish off this project. I promise you tho the final project is gonna so cool so follow me if you want to see it. Omg im tired bro, ive caught whatever is going around at sixth form and i am generally on teh brink of death, generally json/csv files may be the most boring thing possible to do this felt like so much more than 3h. Anyway see you next devlog. (sorry for boring picture, this is pretty much all code tbh)"}, {"post_id": 71473, "ts": "2026-09-20T21:51:20Z", "hours": 7.6158, "text": "Devlog 23 Yo short one today as its 10 45 atm and i have homework for tmorro 😭. This had been a bit of everything today so im just gonna list it out. 1: fleshoed out the help menues 2: made the info chip work(bottom right), im really porud of this one as it usesa que system so you can just keep on adding notifications/warnings and it will show them all (fun fact this is the only thign so far that has worked first try so thats why i love it so much) 3: started adding a way to export the data (so far ive only gone as far as making ui and auto generating teh directory) 4: almost fixed the camera controller(this is so close to working, but ive spend like 3h on it already so im not touching it for a bit) 5: a few other code things only 10 days left now 😬, so i need to be finishes up features pretty soon (im hoping to get the mission planning element of this findied by the weekend/sunday, and then spend the rest of the time making it presentable and usable)"}, {"post_id": 70632, "ts": "2026-09-19T14:16:58Z", "hours": 12.4422, "text": "Devlog 22 Yooo. Things are looking up. Ive implemented the lambert solver fully so you can do a controlled burn to jump orbits (shown in the vid below). And ive managed to add in accurate date/time tracking at the bottom of the screen (however there are a few bugs that you will defiantly be able to spot). Only 11 days till this needs to be done and i have much more than 11 worth of things i need to do(and im already skipping out on alot of stuff for my A-levels for this so once i finished this ive got about 3 weeks of stuff to relearn 😭). I think im going to get the physics and spacecraft stuff done within like 4 days i hope and just do quality stuff from then. One thing though, optimisation has not gone as well as i had hoped (topping out at about 20 fps on my laptop, so if you have a decent pc that has a gpu with more than like 5 cores you would prolly be fine but idk yet), but i am hoping to get this running on my laptop at a usable rate. but we shall see. Also like the post 🙏🙏. Last thing, in the vid the sim speed up and down, it wont do that in the build i just got impatient and manually forced it to go faster 😭. Last last thing, you can move the camera, i just didn’t in this vid."}, {"post_id": 66565, "ts": "2026-09-12T12:25:21Z", "hours": 6.6917, "text": "Devlog 21 Its been a while (18 days), but its been a pretty busy two weeks tbh (A-Levels started on the 4th and ive got 4 to worry about 😬😭). But i have done a bit of progress. Ive managed to implement a fully working lambert solver into the project, you can pick two objects and a time of flight and boom you get a start/end velocity . If you depart from your body at the specific velocity that you can calculated then after your set time you will be at your target destination - kinda. This is a very simple algorithm that only accounts for the sun’s mass(sometimes) and the two points you want to reach, so there can be ‘noise’ from other planets and gravitational fields that can cause drift. How am i gonana fix this? Idk this is only the first layer of the misson planner so maybe it will go away once i add course correction using my already implemented IAS15 solver 🙏🙏. Also i have added in the orion crew modle as my first spacecraft (this is going to be theoretical misson planneing so the modle is really only for looks, as there i no way i can get anything remotly close to something like ksp, nor do i want to, this is more of a ‘is this possible and if ti is what path should i take’ kina misson planner yk?) idk. Delogs may speedup or slow down depending on how school goes tbh, i really want to get this done by sep 30th so i may have to sacifice some ui deicision and posilse to get it working. so be nice when u guys take a look at it please 🙏🙏🙏🙏🙏🙏🙏."}, {"post_id": 54383, "ts": "2026-08-25T11:20:56Z", "hours": 7.5542, "text": "Devlog 20 OK added a new feature. So atm my code on startup was taking the current date and finding the closeted date that i have provided data for(pos/vel). This was working fine but if you wanted to jump from now to next year you would have to have waited ages. So ive fixed that. This is also the fist ui i’ve made entirely in unity instead o figma, and i wont lie i really like how it looks. But as you can see the ui took 7h to get fully working (i hate ui so much dude 😭) there was like a bajillion edge cases and flags and things i needed to setup, not fun tbh. But im really proud of how it works and looks. Up next is not optimisation😭, im gonna start looking into implementing a lambert solver and a bacis spacecraft controller as this project is going to turn into a mission planner hopefully very soon (i hope, sep 30th is too close bro)"}, {"post_id": 52255, "ts": "2026-08-22T11:00:52Z", "hours": 11.1983, "text": "Devlog 19 Optimise❌. Add and fix features ✅. Yup more procrasonation, but i have a massive list of changes. The planet Preview in the UI no longer shows missing textures when there is no texture for the object, this is done with a deterministic shader i made using the moons id to color it in game and in the UI. I’ve added a taskbar at the top that i’m really proud of tbh, its easily expandable and easy to use now Fixed the labelling issue with the moons, as unused labels were not being dealt with correctly and would just stay on screen(this was actually a massive pain to do 😭) +50 other small anoying fixes What i still need to do tho is fix the fittery nature of the orbits, its because the orbits update their position before the camera updates its world position(the cameras stays at 0, 0 and a script updates the positions of everything within range accordingly, however this code runs at the start of the frame and the camera updates at the end, this shouldn’t be a difficult fix but i remember coding the camera to update late in the frame for a reason so this may be harder than i think)"}, {"post_id": 49827, "ts": "2026-08-18T19:36:16Z", "hours": 10.0983, "text": "Devlog 18 ITS WOKRING. Ive attached a vid below(sorry for quality idk why its like that) and i will admit there are a few issues. Main one rn is optimisation, however that should be fine this is all being run on one thread and there are like 5 separate opportunities for parrailation, im not too worried about that. However, ive encountered one issue, in this i have forced the simulation to run faster than it wants to. The integrator i am using has a dynamic time step, so if two objects get close or get to fast the simulation slows down to more accurately simulate this. For the last few days my timestep ahs been stuck at 10^-9 of a second 😭, i have manged to fix this a small amount but i think the problem is in my data. Atm i have ~100 objs and i only just realise that i have two asteroids in a binary orbit within 2500km of each other, which is almost certainly causing the issue. idk what to do tbh, i think my only option woul be to delete one fo them from the data(not too hard if im being honest), but ima do a final check tomorro. but apart from that im so happy i finally got a semi working project now."}, {"post_id": 48808, "ts": "2026-08-17T10:53:59Z", "hours": 10.0875, "text": "Devlog 17 Major update, physics is working. However it is 100% wrong atm, marse flyes out of the system at supersonic speeds and neputne starts to fall towards the sun(pic below😭). I have no idea what could be causing this as i have spend so long looking at the code. I was hoping i would have this finished much faster than this tbh but yeah. My best guess is a div by zero or a verry small number causeing problems, but that can only happen if there are two bodys extreemly close together so idk. Anyways I hopw to get this fixed within the week so i can finnaly start working on what i want to work on(like this was meant to be the easy first step of waht i want)."}, {"post_id": 47055, "ts": "2026-08-14T17:38:50Z", "hours": 10.5603, "text": "Devlog 16 Ok, physics is fully implemented, kinda. Ive got the logic down, but i haven’t managed to simulate even one step yet 😬. Theres like 20 reasons why, but the majority of them are NaNs so far which suprised me tbh. After a while i gave up and began working on the UI a bit more, it only took me a hour or two to setup but i think it looks good, you are able to input the wanted speed of the sim, and eventually it will show you the speed its running at (as the integrator i am implementing does not take uniform steps and adapts its step size the simulation speed will fluctuate like 100%). But i think tomorrow or atleast in the next few days the physics will be working, as i can feel that it is so close. but once this is done i can finally move onto the thing that im much more well researched in, mission planning(more in the projects bio if you want to see what i mean)"}, {"post_id": 45958, "ts": "2026-08-12T19:39:33Z", "hours": 6.8783, "text": "Devlog 15 Did it, i’ve managed to get the labels to work. There are still a few visual things i want to fix (like they look horrible atm). And they dont resent properly yet, however ik why its just gonna be a pain to fix. I think ima decrease the font size a bit and add some deterministic colors? But one thing is that you can click on these labels like you can with the much eaiser to code planet ones and it will show you a popup of the object/calc its kep data and allow you to fly to it automatically which im pretty proud of."}, {"post_id": 45142, "ts": "2026-08-11T13:21:08Z", "hours": 6.0072, "text": "Devlog 14 Ok still putting off physics atm, butttt ive done some stuff. Ive done a bit of optimisation, like ive split up the rendering into layers, so there a camera that renders the background, there a cam that renders the planets and a cam that renders the orbits. Because of this i can have separate scales for each camera, so whist the planets/moons are scaled down by 10000x, the orbits are done by 10000000x. meaning i can reader eve pluto in a single frame with a semi useable clipping plane. Ive also made it so you can click on a planet and it will automatically update everything, which i have been wanting to do for ages as i now do not need to use the inspector anymore to update what planet we are looking at. However there is still one issue, this only works for the 9 objects that have a dedicated label, the other 100 moons/asteroids are innecesable. I want to make it so once you zoom far in enough to a moon its label will show, however for planets like jupiter they will all overlap and look bad, but i dont really want to add anymore overhead to the UI rn and idk what to do, like if you have two that overlap which one do you hide? But hopefully once i finally decide to finish the IAS15 ill move onto phase 2 which is implementing mission planning(this is what im better at so it should hopefully pick up soon). Also one thing do the orbits look better when their full or when they taper off? I prefer full but idk"}, {"post_id": 43976, "ts": "2026-08-09T13:33:24Z", "hours": 9.6619, "text": "Devlog 13 Ok major update. I have managed to implement thee and a half things rn. 1: the UI is fully working and scales and moves with the window if you resize it. 2: the Ui calculates the keplarna elements of any body using no hardcoaded info. 3: i am able to use these elements to do a crude simulation of one orbit allowing me to visulise the orbits. 3.5: I half implemented IAS15 got stuck and decided to do steps 1-3. However as you can see its running at 39 fps which is just not going to happen. Annoyngly my code only takes up like 2ms however the way i have set it up means the camera is incredibly resource intetive(i had an issue with not being able to see the orbits so i just made the clipping plane of the camera a stupidly large number. I think theres a way to make a Ui shader or smthin to visulise the orbits, however i aint that smart and i hate hlsl so much bro 😭) If i made the clipping plane smaller and optimised my end a bit i could prolly push this to like 100 as thats where i was at before idk tho."}, {"post_id": 41347, "ts": "2026-08-05T14:36:01Z", "hours": 11.8044, "text": "Devlog 12 Ok, tbh physics hasn’t been too bad so far. Ive spent a few days on it and its almost there, not much to add on that - next devlog or two will be finishing it up and making it multithreaded. In the meantime ive been working on some UI and im pretty proud of it. Like it could be better but its the first Ui ive ever made and it took like 2h to setup so its staying. (whats really cool is that you can change the size of the game window and it will automatically resize itself). However ive run into a weird issue. So for the UI im rendering a preview of the planet. And i have done everything that i can think of to optimise this but this camera is tanking the entire project by about 20-30fps(its worse rn as i have deep profiling on atm) and i have no clue why. Like if you can think of a optimisation ive prolly already done it. But anyways its prolly something simple that i keep on missing. A preview of the porject is below - ignore the numbers about earth they are wrong."}, {"post_id": 39435, "ts": "2026-08-02T11:59:14Z", "hours": 18.6333, "text": "Devlog 11 Ok major update. I’ve rewritten the core code from the base up as I had so many unnecessary lists/arrays/variables etc. Also ive rewritten the camera controller to be smoother and easier to use. Yes this is still procrastination before implementing physics. I promise that in the next devlog I will have the physics working. (or atlest partially)"}, {"post_id": 37901, "ts": "2026-07-30T21:50:46Z", "hours": 9.7206, "text": "Devlog 10 Before I implement physics i decided to procrastonate with optimisations. Good news: its now running at 200fps(used to be like 150ish). Bad news: Ive got to athually implent the physics. Ive been reading up on it and i understand a two body 2d form of IAS15, but ~100 ish body and 3D not so much. So the next few days may just be devlogs of planets moving hopefully where they should. Oh i also started to implent a trail that follows the planets, but its proving diffucult as ‘planet-space’ and ‘world space’ are complete diffrent local tranforms and for some reason i just cant figue out a fast way of converting between them (I have one solution but it does an unnesasay amount of divs per frame, which is eating up processing power that should go to physics). But so far this is it, oh i also added a ring that goes around the planet but ive not got a screenshot of it and im not waiting 5m for unity to open so js imagine rings next to the labels in the same color as the label"}, {"post_id": 37091, "ts": "2026-07-29T15:57:52Z", "hours": 9.5636, "text": "Devlog 9 I finally did it!!! So ive spend the last like week trying to use SPICE data (a fancy way of getting data avout planets like pos, vel ect - and like so much more) in my unity project. Ive managed to write a python script (as there is no good wrapper for C#) that converts the ~10gb of data i have into about 25mb of data i need in my own format(spanning from 2000-2030, i want to update this to 2100, however data for some asteroids only go to 2030). This is absolutely overkill, but so far its the only option i have, but the good news is i can ship the porject with this data and avoid the trouble with trying to compress 10gb of data as there is no way im shipping a project that is 90% useless data. Ive prolly explained what ive done really badly but idk its finally done. (attached below is proof that ive got the data - ignore the horrible color choices and lack of visible planets plz). Next up: implementing IAS15."}, {"post_id": 36017, "ts": "2026-07-27T20:45:28Z", "hours": 11.5667, "text": "Devlog 8 Been working on implementing IAS15(a physics solver for space sims, its not as bad as it sounds although the paper is soo confusing bro). So far its going ok. But i think im going to have to do an entire overhaul of my architecture, as i think i have redundant arrays and variables taking up memory (IAS15 calls on variables like thousands of times per frame and i want to minimise cache misses). Also I still havent managed to get SPICE to work in C# yet either. I think over the next few days i will focus on refining the architexture insted of logic. So far this has taken me much longer than i thought it would 😭. I think my scope may be a tad ambitios to put it lightly as this is meant to be the core of the final project. (also yes this is the same image as last time, all the updates have been code, idk what to put)"}, {"post_id": 35056, "ts": "2026-07-26T07:24:15Z", "hours": 18.5667, "text": "BIg things comming"}, {"post_id": 33752, "ts": "2026-07-23T22:19:35Z", "hours": 9.1667, "text": "Not really a devlog, js messing aroind wih optimasations n other stuff tbh (its like 11:30pm for me rn i just wanna get the time logef fir the last two days)"}, {"post_id": 32962, "ts": "2026-07-22T13:35:40Z", "hours": 10.0647, "text": "Devlog 7 Massive change from last time. So for context atm I am building a solar system sim as a core for this project. And ive been trying to create some sort of method to simulate the moons without any heavy computation, as I assumed physically simulating ~500 objects would not be feasible. To put it lightly, ive wasted my time. Ive done a bit more research into the integrator i am planning to implement (IAS15), and turns out it can handle 1000 ish object just fine (even on a laptop) at only a few milliseconds per loop. So Now the next few days I will probably be spending on research on IAS15 and optimisation tricks for it. Something i need to decide soon is if this is going to be c# or hslsl as its alot of computation (so good for gpu) but its lots of complex computation (better for CPU). IDK tbh im larping CS atm, i have no idea what’s slow for a computer to run."}, {"post_id": 30812, "ts": "2026-07-18T18:51:57Z", "hours": 10.5664, "text": "Short one today. Ive sorta got about 5 diff things om activity workig on for this project atm, so i thought ill finally explain what this is. So the bameof this projct is Astra Labs (Still a work in progress rn) and its a mission planer. What im working on atm is the soalr system simulation and accurate inital data. But at the end of this you will be able to select a start/end pos and (this ive not figures out yet) be able to test oit hypothetical spacecrafts/routes. Im not selling it well tbh. Tryst me tho in like 3 months this is finna be 👌"}, {"post_id": 28861, "ts": "2026-07-15T12:49:38Z", "hours": 8.0831, "text": "Devlog 6 The past few days I’ve been looking into NASA’s spice database, which is an incredibly powerful tool to get data about the solar system. I’m not sure if I’ve mentioned yet but the core of this project is a solar system sim, which I’m hoping to be accurate to about 100yrs or so (probably less in the end, but I will push it as far as my computer can handle). To do this I’m using the RKF54 integrator(sounds scary but it’s just a glorified mean (kinda)), which is incredibly powerful and can be incredibly precise. But it still requires initial precise data, which I will use spice to generate. Now, spice is an incredibly well documented program, but from what i can find, its strength is python and C; neither of which unity supports (tbh i havent tried yet, but i assume). So at the moment ive tried like 50 different wrappers and plugins, and so far no luck. But its almost 100% on my end as I do not follow the website very well 😅. I’ve done a few other things in the meantime though, like ive finished my object shader(and my earth one too) and finally imported all the planet/dwarf planet textures. Once ive got spice to work, progress should hopefully start to take off."}, {"post_id": 27956, "ts": "2026-07-13T21:59:36Z", "hours": 10.3636, "text": "Devlog 5 Today I managed to finally get the camera working. Its not fully there yet, like I want to add logarithmic zooming and other minor things, but the core is working. The camera stays contently at the orgin, with objects moving around it. This gives me two main benefits, 1: i can store the cameras ‘real’ position as a double3, which removes all jittering due to floating point errors. and 2: culling objects is much easier as as part of the update loop on moving the objects involves calculating the distance between the objects, allowing us to cull all objects at a certain distance with virulently no more expense. Ive also began working on the UI, but its more of a ‘just making it work’ UI than a ‘looking nice’ UI atm and graphic design will come much later."}, {"post_id": 26784, "ts": "2026-07-11T19:39:04Z", "hours": 8.3925, "text": "Devlog 4 OK stepped back from shaders. I’ve spent the last 3 days working on my camera movement script. I got the initial movement down on the first day. However, this project is using massive scales, so a float vector three isn’t enough precision. So (and im not fully done yet) but i’ve spent the last few days doing two things: 1: updating everything to doubles, 2:keeping the camera at the origin, and moving the scene around it (this way means we only work with objects around the origin) There is still lots to do tho but ill be back once ive managed to make the camera script to work."}, {"post_id": 25246, "ts": "2026-07-09T11:46:22Z", "hours": 0.6378, "text": "Devlog 3 Shaders are the best bro I went into this thinking that i would hate learning hlsl and all of that. But to my surprise unity has a visual scripting system that works similar to scratch. I just wrote my first lighting shader ever in like 20m. 20 minutes is crazy, it took me 30m to make a hlsl shader that turns an object orange. ve attached what it looks like down below"}, {"post_id": 25213, "ts": "2026-07-09T10:20:29Z", "hours": 0.7314, "text": "Devlog 2 Short Devlog today. But I made my first shader!! Its extremely simple right now literally creating a coloured material, but tis something. But I think i’m going to stick to C# for the while being"}, {"post_id": 25181, "ts": "2026-07-09T07:38:19Z", "hours": 33.5492, "text": "Devlog 1 Ok this is my first devlog of Astra. I wish i had more to show for 30h of work but sadly I corrupted my entire project about 20h in 😭 loosing about 2-3 days of progress. Luckily Most of this time was spent on building the architecture and importing/creating textures. I still have the google docs that I’m writing my notes down and thats got most of my ideas for the architecture. (by architecture i mean setting up scripts and gameobjects like ‘physicsSolver’ or ‘simManager’, this is probably not what architecture is but idk). However I had spent so long on my cameraColtroller script which was lowkey really cool. Like it had complete freedom in the scene and could move anywhere, you could select an object and the camera would smoothly ‘fly’ to the object and you could orbit around it. And this is the one thing i haven’t rebuilt yet. But ill see you in the next one when it should hopefully be rebuilt?"}]...
|
Title: ASTRA by @AustinB | Stardance
Devlogs:
Dev Title: ASTRA by @AustinB | Stardance
Devlogs:
Devlog 1 Ok this is my first devlog of Astra. I wish i had more to show for 30h of work but sadly I corrupted my entire project about 20h in 😭 loosing about 2-3 days of progress. Luckily Most of this time was spent on building the architecture and importing/creating textures. I still have the google docs that I’m writing my notes down and thats got most of my ideas for the architecture. (by architecture i mean setting up scripts and gameobjects like ‘physicsSolver’ or ‘simManager’, this is probably not what architecture is but idk). However I had spent so long on my cameraColtroller script which was lowkey really cool. Like it had complete freedom in the scene and could move anywhere, you could select an object and the camera would smoothly ‘fly’ to the object and you could orbit around it. And this is the one thing i haven’t rebuilt yet. But ill see you in the next one when it should hopefully be rebuilt?
Devlog 2 Short Devlog today. But I made my first shader!! Its extremely simple right now literally creating a coloured material, but tis something. But I think i’m going to stick to C# for the while being
Devlog 3 Shaders are the best bro I went into this thinking that i would hate learning hlsl and all of that. But to my surprise unity has a visual scripting system that works similar to scratch. I just wrote my first lighting shader ever in like 20m. 20 minutes is crazy, it took me 30m to make a hlsl shader that turns an object orange. ve attached what it looks like down below
Devlog 4 OK stepped back from shaders. I’ve spent the last 3 days working on my camera movement script. I got the initial movement down on the first day. However, this project is using massive scales, so a float vector three isn’t enough precision. So (and im not fully done yet) but i’ve spent the last few days doing two things: 1: updating everything to doubles, 2:keeping the camera at the origin, and moving the scene around it (this way means we only work with objects around the origin) There is still lots to do tho but ill be back once ive managed to make the camera script to work.
Devlog 5 Today I managed to finally get the camera working. Its not fully there yet, like I want to add logarithmic zooming and other minor things, but the core is working. The camera stays contently at the orgin, with objects moving around it. This gives me two main benefits, 1: i can store the cameras ‘real’ position as a double3, which removes all jittering due to floating point errors. and 2: culling objects is much easier as as part of the update loop on moving the objects involves calculating the distance between the objects, allowing us to cull all objects at a certain distance with virulently no more expense. Ive also began working on the UI, but its more of a ‘just making it work’ UI than a ‘looking nice’ UI atm and graphic design will come much later.
Devlog 6 The past few days I’ve been looking into NASA’s spice database, which is an incredibly powerful tool to get data about the solar system. I’m not sure if I’ve mentioned yet but the core of this project is a solar system sim, which I’m hoping to be accurate to about 100yrs or so (probably less in the end, but I will push it as far as my computer can handle). To do this I’m using the RKF54 integrator(sounds scary but it’s just a glorified mean (kinda)), which is incredibly powerful and can be incredibly precise. But it still requires initial precise data, which I will use spice to generate. Now, spice is an incredibly well documented program, but from what i can find, its strength is python and C; neither of which unity supports (tbh i havent tried yet, but i assume). So at the moment ive tried like 50 different wrappers and plugins, and so far no luck. But its almost 100% on my end as I do not follow the website very well 😅. I’ve done a few other things in the meantime though, like ive finished my object shader(and my earth one too) and finally imported all the planet/dwarf planet textures. Once ive got spice to work, progress should hopefully start to take off.
Short one today. Ive sorta got about 5 diff things om activity workig on for this project atm, so i thought ill finally explain what this is. So the bameof this projct is Astra Labs (Still a work in progress rn) and its a mission planer. What im working on atm is the soalr system simulation and accurate inital data. But at the end of this you will be able to select a start/end pos and (this ive not figures out yet) be able to test oit hypothetical spacecrafts/routes. Im not selling it well tbh. Tryst me tho in like 3 months this is finna be 👌
Devlog 7 Massive change from last time. So for context atm I am building a solar system sim as a core for this project. And ive been trying to create some sort of method to simulate the moons without any heavy computation, as I assumed physically simulating ~500 objects would not be feasible. To put it lightly, ive wasted my time. Ive done a bit more research into the integrator i am planning to implement (IAS15), and turns out it can handle 1000 ish object just fine (even on a laptop) at only a few milliseconds per loop. So Now the next few days I will probably be spending on research on IAS15 and optimisation tricks for it. Something i need to decide soon is if this is going to be c# or hslsl as its alot of computation (so good for gpu) but its lots of complex computation (better for CPU). IDK tbh im larping CS atm, i have no idea what’s slow for a computer to run.
Not really a devlog, js messing aroind wih optimasations n other stuff tbh (its like 11:30pm for me rn i just wanna get the time logef fir the last two days)
BIg things comming
Devlog 8 Been working on implementing IAS15(a physics solver for space sims, its not as bad as it sounds although the paper is soo confusing bro). So far its going ok. But i think im going to have to do an entire overhaul of my architecture, as i think i have redundant arrays and variables taking up memory (IAS15 calls on variables like thousands of times per frame and i want to minimise cache misses). Also I still havent managed to get SPICE to work in C# yet either. I think over the next few days i will focus on refining the architexture insted of logic. So far this has taken me much longer than i thought it would 😭. I think my scope may be a tad ambitios to put it lightly as this is meant to be the core of the final project. (also yes this is the same image as last time, all the updates have been code, idk what to put)
Devlog 9 I finally did it!!! So ive spend the last like week trying to use SPICE data (a fancy way of getting data avout planets like pos, vel ect - and like so much more) in my unity project. Ive managed to write a python script (as there is no good wrapper for C#) that converts the ~10gb of data i have into about 25mb of data i need in my own format(spanning from 2000-2030, i want to update this to 2100, however data for some asteroids only go to 2030). This is absolutely overkill, but so far its the only option i have, but the good news is i can ship the porject with this data and avoid the trouble with trying to compress 10gb of data as there is no way im shipping a project that is 90% useless data. Ive prolly explained what ive done really badly but idk its finally done. (attached below is proof that ive got the data - ignore the horrible color choices and lack of visible planets plz). Next up: implementing IAS15.
Devlog 10 Before I implement physics i decided to procrastonate with optimisations. Good news: its now running at 200fps(used to be like 150ish). Bad news: Ive got to athually implent the physics. Ive been reading up on it and i understand a two body 2d form of IAS15, but ~100 ish body and 3D not so much. So the next few days may just be devlogs of planets moving hopefully where they should. Oh i also started to implent a trail that follows the planets, but its proving diffucult as ‘planet-space’ and ‘world space’ are complete diffrent local tranforms and for some reason i just cant figue out a fast way of converting between them (I have one solution but it does an unnesasay amount of divs per frame, which is eating up processing power that should go to physics). But so far this is it, oh i also added a ring that goes around the planet but ive not got a screenshot of it and im not waiting 5m for unity to open so js imagine rings next to the labels in the same color as the label
Devlog 11 Ok major update. I’ve rewritten the core code from the base up as I had so many unnecessary lists/arrays/variables etc. Also ive rewritten the camera controller to be smoother and easier to use. Yes this is still procrastination before implementing physics. I promise that in the next devlog I will have the physics working. (or atlest partially)
Devlog 12 Ok, tbh physics hasn’t been too bad so far. Ive spent a few days on it and its almost there, not much to add on that - next devlog or two will be finishing it up and making it multithreaded. In the meantime ive been working on some UI and im pretty proud of it. Like it could be better but its the first Ui ive ever made and it took like 2h to setup so its staying. (whats really cool is that you can change the size of the game window and it will automatically resize itself). However ive run into a weird issue. So for the UI im rendering a preview of the planet. And i have done everything that i can think of to optimise this but this camera is tanking the entire project by about 20-30fps(its worse rn as i have deep profiling on atm) and i have no clue why. Like if you can think of a optimisation ive prolly already done it. But anyways its prolly something simple that i keep on missing. A preview of the porject is below - ignore the numbers about earth they are wrong.
Devlog 13 Ok major update. I have managed to implement thee and a half things rn. 1: the UI is fully working and scales and moves with the window if you resize it. 2: the Ui calculates the keplarna elements of any body using no hardcoaded info. 3: i am able to use these elements to do a crude simulation of one orbit allowing me to visulise the orbits. 3.5: I half implemented IAS15 got stuck and decided to do steps 1-3. However as you can see its running at 39 fps which is just not going to happen. Annoyngly my code only takes up like 2ms however the way i have set it up means the camera is incredibly resource intetive(i had an issue with not being able to see the orbits so i just made the clipping plane of the camera a stupidly large number. I think theres a way to make a Ui shader or smthin to visulise the orbits, however i aint that smart and i hate hlsl so much bro 😭) If i made the clipping plane smaller and optimised my end a bit i could prolly push this to like 100 as thats where i was at before idk tho.
Devlog 14 Ok still putting off physics atm, butttt ive done some stuff. Ive done a bit of optimisation, like ive split up the rendering into layers, so there a camera that renders the background, there a cam that renders the planets and a cam that renders the orbits. Because of this i can have separate scales for each camera, so whist the planets/moons are scaled down by 10000x, the orbits are done by 10000000x. meaning i can reader eve pluto in a single frame with a semi useable clipping plane. Ive also made it so you can click on a planet and it will automatically update everything, which i have been wanting to do for ages as i now do not need to use the inspector anymore to update what planet we are looking at. However there is still one issue, this only works for the 9 objects that have a dedicated label, the other 100 moons/asteroids are innecesable. I want to make it so once you zoom far in enough to a moon its label will show, however for planets like jupiter they will all overlap and look bad, but i dont really want to add anymore overhead to the UI rn and idk what to do, like if you have two that overlap which one do you hide? But hopefully once i finally decide to finish the IAS15 ill move onto phase 2 which is implementing mission planning(this is what im better at so it should hopefully pick up soon). Also one thing do the orbits look better when their full or when they taper off? I prefer full but idk
Devlog 15 Did it, i’ve managed to get the labels to work. There are still a few visual things i want to fix (like they look horrible atm). And they dont resent properly yet, however ik why its just gonna be a pain to fix. I think ima decrease the font size a bit and add some deterministic colors? But one thing is that you can click on these labels like you can with the much eaiser to code planet ones and it will show you a popup of the object/calc its kep data and allow you to fly to it automatically which im pretty proud of.
Devlog 16 Ok, physics is fully implemented, kinda. Ive got the logic down, but i haven’t managed to simulate even one step yet 😬. Theres like 20 reasons why, but the majority of them are NaNs so far which suprised me tbh. After a while i gave up and began working on the UI a bit more, it only took me a hour or two to setup but i think it looks good, you are able to input the wanted speed of the sim, and eventually it will show you the speed its running at (as the integrator i am implementing does not take uniform steps and adapts its step size the simulation speed will fluctuate like 100%). But i think tomorrow or atleast in the next few days the physics will be working, as i can feel that it is so close. but once this is done i can finally move onto the thing that im much more well researched in, mission planning(more in the projects bio if you want to see what i mean)
Devlog 17 Major update, physics is working. However it is 100% wrong atm, marse flyes out of the system at supersonic speeds and neputne starts to fall towards the sun(pic below😭). I have no idea what could be causing this as i have spend so long looking at the code. I was hoping i would have this finished much faster than this tbh but yeah. My best guess is a div by zero or a verry small number causeing problems, but that can only happen if there are two bodys extreemly close together so idk. Anyways I hopw to get this fixed within the week so i can finnaly start working on what i want to work on(like this was meant to be the easy first step of waht i want).
Devlog 18 ITS WOKRING. Ive attached a vid below(sorry for quality idk why its like that) and i will admit there are a few issues. Main one rn is optimisation, however that should be fine this is all being run on one thread and there are like 5 separate opportunities for parrailation, im not too worried about that. However, ive encountered one issue, in this i have forced the simulation to run faster than it wants to. The integrator i am using has a dynamic time step, so if two objects get close or get to fast the simulation slows down to more accurately simulate this. For the last few days my timestep ahs been stuck at 10^-9 of a second 😭, i have manged to fix this a small amount but i think the problem is in my data. Atm i have ~100 objs and i only just realise that i have two asteroids in a binary orbit within 2500km of each other, which is almost certainly causing the issue. idk what to do tbh, i think my only option woul be to delete one fo them from the data(not too hard if im being honest), but ima do a final check tomorro. but apart from that im so happy i finally got a semi working project now.
Devlog 19 Optimise❌. Add and fix features ✅. Yup more procrasonation, but i have a massive list of changes. The planet Preview in the UI no longer shows missing textures when there is no texture for the object, this is done with a deterministic shader i made using the moons id to color it in game and in the UI. I’ve added a taskbar at the top that i’m really proud of tbh, its easily expandable and easy to use now Fixed the labelling issue with the moons, as unused labels were not being dealt with correctly and would just stay on screen(this was actually a massive pain to do 😭) +50 other small anoying fixes What i still need to do tho is fix the fittery nature of the orbits, its because the orbits update their position before the camera updates its world position(the cameras stays at 0, 0 and a script updates the positions of everything within range accordingly, however this code runs at the start of the frame and the camera updates at the end, this shouldn’t be a difficult fix but i remember coding the camera to update late in the frame for a reason so this may be harder than i think)
Devlog 20 OK added a new feature. So atm my code on startup was taking the current date and finding the closeted date that i have provided data for(pos/vel). This was working fine but if you wanted to jump from now to next year you would have to have waited ages. So ive fixed that. This is also the fist ui i’ve made entirely in unity instead o figma, and i wont lie i really like how it looks. But as you can see the ui took 7h to get fully working (i hate ui so much dude 😭) there was like a bajillion edge cases and flags and things i needed to setup, not fun tbh. But im really proud of how it works and looks. Up next is not optimisation😭, im gonna start looking into implementing a lambert solver and a bacis spacecraft controller as this project is going to turn into a mission planner hopefully very soon (i hope, sep 30th is too close bro)
Devlog 21 Its been a while (18 days), but its been a pretty busy two weeks tbh (A-Levels started on the 4th and ive got 4 to worry about 😬😭). But i have done a bit of progress. Ive managed to implement a fully working lambert solver into the project, you can pick two objects and a time of flight and boom you get a start/end velocity . If you depart from your body at the specific velocity that you can calculated then after your set time you will be at your target destination - kinda. This is a very simple algorithm that only accounts for the sun’s mass(sometimes) and the two points you want to reach, so there can be ‘noise’ from other planets and gravitational fields that can cause drift. How am i gonana fix this? Idk this is only the first layer of the misson planner so maybe it will go away once i add course correction using my already implemented IAS15 solver 🙏🙏. Also i have added in the orion crew modle as my first spacecraft (this is going to be theoretical misson planneing so the modle is really only for looks, as there i no way i can get anything remotly close to something like ksp, nor do i want to, this is more of a ‘is this possible and if ti is what path should i take’ kina misson planner yk?) idk. Delogs may speedup or slow down depending on how school goes tbh, i really want to get this done by sep 30th so i may have to sacifice some ui deicision and posilse to get it working. so be nice when u guys take a look at it please 🙏🙏🙏🙏🙏🙏🙏.
Devlog 22 Yooo. Things are looking up. Ive implemented the lambert solver fully so you can do a controlled burn to jump orbits (shown in the vid below). And ive managed to add in accurate date/time tracking at the bottom of the screen (however there are a few bugs that you will defiantly be able to spot). Only 11 days till this needs to be done and i have much more than 11 worth of things i need to do(and im already skipping out on alot of stuff for my A-levels for this so once i finished this ive got about 3 weeks of stuff to relearn 😭). I think im going to get the physics and spacecraft stuff done within like 4 days i hope and just do quality stuff from then. One thing though, optimisation has not gone as well as i had hoped (topping out at about 20 fps on my laptop, so if you have a decent pc that has a gpu with more than like 5 cores you would prolly be fine but idk yet), but i am hoping to get this running on my laptop at a usable rate. but we shall see. Also like the post 🙏🙏. Last thing, in the vid the sim speed up and down, it wont do that in the build i just got impatient and manually forced it to go faster 😭. Last last thing, you can move the camera, i just didn’t in this vid.
Devlog 23 Yo short one today as its 10 45 atm and i have homework for tmorro 😭. This had been a bit of everything today so im just gonna list it out. 1: fleshoed out the help menues 2: made the info chip work(bottom right), im really porud of this one as it usesa que system so you can just keep on adding notifications/warnings and it will show them all (fun fact this is the only thign so far that has worked first try so thats why i love it so much) 3: started adding a way to export the data (so far ive only gone as far as making ui and auto generating teh directory) 4: almost fixed the camera controller(this is so close to working, but ive spend like 3h on it already so im not touching it for a bit) 5: a few other code things only 10 days left now 😬, so i need to be finishes up features pretty soon (im hoping to get the mission planning element of this findied by the weekend/sunday, and then spend the rest of the time making it presentable and usable)
Devlog 24 Ok one section has been finished. Its a small one but its done. This was m first time working with files and making documents so icl the code is like 85% spaghetti unassisted mess, but it works. It allows you to export data for planets/moons that you want in either JSON or CSV format. Also the ui is fully wokring with this one for once. Sorry for the most boring devlog of the year here but their prolly gonna get worse as i start doing more boring things to finish off this project. I promise you tho the final project is gonna so cool so follow me if you want to see it. Omg im tired bro, ive caught whatever is going around at sixth form and i am generally on teh brink of death, generally json/csv files may be the most boring thing possible to do this felt like so much more than 3h. Anyway see you next devlog. (sorry for boring picture, this is pretty much all code tbh)
Devlog 25 Added a main menu. This was actually a massive pain as i had no like localised start function. So this meant that scripts and objects were doing things they weren’t meant to. So had a minor architectural overhaul. but now it works. Also ive added a way to quit the game too, in both the sim and the main menu. Also yes that it the orion capsule thing, why? Its the only textured model i could find for free. (Kinda, i had to download a 3d print 3mf or something, and i wish i was kidding but spend a few hours a few weeks ago literally assembling the model in unity, so this may just beat garten of banban for the most optimised topology of the year) Only 8 days left and i am so screwed, this entire menu was a massive procrastination from fixing the physics(it keeps slowing down the timestep to like 1e-9 seconds and i cannot figure out why, i have literally almost rewritten my physics at this point and i have had minimal difference - also the cameras bugged as hell when its following a moving object)
Devlog 26 yo guys horrible news 😭 ive gone and done it, boken my finger(if for the dumbest reason every too bro). Which means that i generally cannot type anywhere near as fast as usahll. Dw your still gonna get your ushall yap sesh tho. Im hoping that this dosent afect the timeline or anything of my project, but i have been busy. First ive started adding sound effects which are generrally a bigger pain than i thought. But now every button/ui action has an effect. however there is not music/ambiant noise. IDk weather im going to add any music but i think a low rocket engine would be cool(lets pretend you can hear sound in space). Done a bit on the code side, but really most of it has been UI. ive cahnged the hitboxes of the buttons to fit them, which was a pain as i have like 50 at this point. Ive made them hilight when you hover over them and things like that. But one thing im really confused on is when the deadline for this is? Like i got an emial saying oct 31 as they extened it but now theres this think with bukubuks or something and im not sure what that means? if you know can you leave a comment or something pelasee.
Devlog 27 Yooo Im back. Thank god the deadline has been extended broo. Done mostly boring stuff tbh. Ive begun on working on adding a grid that scales with the camera and im like 60% there. Shaders haven’t really clicked for me yet so im still kinda joining random things to other random things and hoping it looks correct tbh. Also begun work on making the mission planner automatically sort and setup lambart test cases for my solver to solve(ive actually done this already, however its really hard to validate if my resluts are anywhere near correct, they look correct but i have no numerical way of knowing, so ima go with the ignore it untill something else goes wrong and hope its fine idk) devlogs will prolly be focused on fixing the camera movement(zooming is a massive pain as its really hard to know when you want to zoom massivly or small - like you want to be zooming out fast if you want to go between planets, but if you want to go between moons or something its hard:( ) and misson planner aspects of this project for this week or so. So boring devlogs. cant wait till i can finially ship this and you can all have a go.
Devlog 28 OK ive fixed/implemented three major things. 1: camera finally logarithmically zooms and moves in a way that i am happy with. There is only one problem left now, and that is that it cant follow a moving point yet, however this shouldn’t be too bad i hope 2: ive changed my data so that the planets are now aligned with the XY plane(this is not a hardcoded fix so it it still possible to import your own data and it work completely fine) 3: ive made the grid follow the camera(as the camera stays at 0,0 and moves objects around it) and scale logorymetrly too which looks very professional im my opinion Now onto finishing up the misson planning side of this. ive got a ‘working’ state of it atm but it is quite tempramental so we shall seee
Devlog 29 Made mission planner UI. Starting to get pretty fast at these(although they still look questionable sometimes)...
|
1792478995.0222642
|
1793083795.0222642
|
|
8100
|
Crawssembly by @The_Craw | Stardance
|
The_Craw
|
3
|
310.71
|
5664
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T09:56:51Z", "hours": 137.0, "multiplier": 19.59, "payout": 2622, "blessing": "neutral", "text": "CRAWSSEMBLY - New and Improved! “Programming languages are a lie!” This is Crawssembly, the number 1 project on all of stardance! It’s a project that’s been in production for over a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly. What is new? INTERNET SOCKETS! CRAWOS COMMAND LINES! DYNAMIC LABEL JUMPING! IMPROVED DEVICES! DEDICATED PACKAGE SHARING WEBSITE! AND MORE! Check it out for yourself! (Shipped early due to Fraud Squad limitations, Crawssembly is too powerful for Hack Club)", "repo": "https://github.com/Jonah-Crawford/Crawssembly", "demo": "https://crawssembly.ultimatecraw.xyz/"}, {"ship_num": 2, "ts": "2026-07-02T17:49:35Z", "hours": 33.0, "multiplier": 19.65, "payout": 633, "blessing": "neutral", "text": "Crawssembly v1.1.0 ready to ship! “Programming languages are a lie!” This is Crawssembly, a project that’s been in production for almost a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly.", "repo": "https://github.com/Jonah-Crawford/Crawssembly", "demo": "https://crawssembly.ultimatecraw.xyz/"}, {"ship_num": 3, "ts": "2026-06-26T21:15:26Z", "hours": 134.0, "multiplier": 19.78, "payout": 2409, "blessing": "neutral", "text": "Crawssembly: The beginner’s gateway to low-level thinking. \"Programming languages are a lie!\" This is Crawssembly, a project that’s been in production for almost a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly.", "repo": "https://github.com/Jonah-Crawford/Crawssembly", "demo": "https://crawssembly.ultimatecraw.xyz/"}]...
|
[{"post_id": 79047, "ts": "202 [{"post_id": 79047, "ts": "2026-10-12T14:17:02Z", "hours": 5.8211, "text": "idk where these extra hours are coming from, but as long as I don’t ship them, they won’t count towards stardust so I’ll be fine. In the meantime, enjoy craw slop"}, {"post_id": 73135, "ts": "2026-09-24T13:36:27Z", "hours": 0.8872, "text": "It has come to my attention that not everyone who has followed Crawssembly has starred it on GitHub! Please, if you like my project, star it on GitHub at https://github.com/Jonah-Crawford/Crawssembly Thank you."}, {"post_id": 62476, "ts": "2026-09-05T20:43:32Z", "hours": 1.1861, "text": "I’m back! Fraud Squad unbanned me so WE are all having a party at my house Although I can’t use nano apparently anymore… so Crawssembly will be having it’s final ship very very soon"}, {"post_id": 53379, "ts": "2026-08-23T22:12:14Z", "hours": 4.7478, "text": "I’ve been doing much more testing and implementing the network device. Specifically testing the following commands: io net ip , io net addr , io net connect , io net socket , io net port , io net listen , io net accept , io net send , io net protocol , io net block , and io net recv ."}, {"post_id": 52283, "ts": "2026-08-22T12:07:09Z", "hours": 0.5569, "text": "HTTP requests working 🔥 ts is so peak icl"}, {"post_id": 51913, "ts": "2026-08-21T20:28:29Z", "hours": 4.2456, "text": "I’VE ACTUALLY DONE IT 🔥 Networking is now officially part of Crawssembly. Alpha tests on localhost have all passed"}, {"post_id": 51556, "ts": "2026-08-21T10:23:09Z", "hours": 0.3189, "text": "I’ve brought run back from the dead. You can now use run rXX to run a binary value inside the input register as a Crawssembly instruction"}, {"post_id": 51201, "ts": "2026-08-20T18:32:01Z", "hours": 0.4944, "text": "stardance"}, {"post_id": 50613, "ts": "2026-08-19T20:41:05Z", "hours": 1.6864, "text": "I’m finally getting somewhere with the editor, however I’m now having issues with character deletion, and adding characters inside empty newlines"}, {"post_id": 49579, "ts": "2026-08-18T13:50:02Z", "hours": 4.3281, "text": "Still no clue why characters aren’t being saved to memory in my free heap block Slow day today fr"}, {"post_id": 48745, "ts": "2026-08-17T08:45:08Z", "hours": 2.36, "text": "For some reason, I’ve been banned on slack. I don’t know why, since no one will tell me. This is not good news, but luckily it doesn’t seem to be a stardance-wide ban, so I can still do the hackathon."}, {"post_id": 48355, "ts": "2026-08-16T17:45:02Z", "hours": 8.0639, "text": "Lots of work today, sorry for the . I’ve been struggling with the text editor, heap buffers, cursor allocation, character addresses, etc etc… ad infinitum. However, I’m getting close. Rendering is outputting something, although I don’t know why typing doesn’t seem to add anything…"}, {"post_id": 47504, "ts": "2026-08-15T13:39:53Z", "hours": 4.2456, "text": "I’ve added io keyboard mod to create a bitfield of modification key presses for the keyboard device, so now keys like CTRL and TAB can be handled, which lays the foundation for my next project which is making a basic file editor in casm"}, {"post_id": 46783, "ts": "2026-08-14T09:10:12Z", "hours": 4.3825, "text": "Sorry for the but it’s been a hectic couple of days. I got into University! I’ve also been busy taking a look at a CGOL implementation, truly amazing stuff! Go check it out: https://github.com/srxcode/game-of-life-crawssembly"}, {"post_id": 45634, "ts": "2026-08-12T08:01:02Z", "hours": 1.1425, "text": "I’ve separated the old sleep command into sleepms for millisecond waits and sleepus for microsecond waits. Although, microsecond precision is highly dependent on the OS, so it won’t be as accurate as sleepms for smaller values (Say, n<50)"}, {"post_id": 45230, "ts": "2026-08-11T15:52:21Z", "hours": 1.3411, "text": "I’ve merged the new fgo rules to the project, so now fgo points to labels similar to jmp , but fgo 0 now jumps to the label defined in r01 I was having some issues with using git but I got them sorted"}, {"post_id": 45046, "ts": "2026-08-11T09:08:16Z", "hours": 0.8819, "text": "I’m back from camping! (RIP my 60+ day streak) My plans going forward immediately is improving program counter modifications to allow for higher-level concepts to be bootstrapped onto Crawssembly instruction sets. (Image unrelated)"}, {"post_id": 40794, "ts": "2026-08-04T15:32:01Z", "hours": 1.0728, "text": "I’ve been working with @BetterClient to inprove the program counter and bringing back fgo from casm beta. This is also a reminder that I’ll be OOO until next Monday."}, {"post_id": 40209, "ts": "2026-08-03T16:48:57Z", "hours": 1.4692, "text": "I’ve made publishing packages super easy now, all you need to do is craw init to create the package, and then craw pkg publish . As long as you’re signed into CPM and gh, it’ll just work"}, {"post_id": 40094, "ts": "2026-08-03T14:12:19Z", "hours": 1.1475, "text": "I’ve added Markdown support for CPM packages 🔥"}, {"post_id": 40004, "ts": "2026-08-03T11:00:47Z", "hours": 2.5797, "text": "@imakebloatedcode Thank you for your pr for CPM to include OpenAPI scemata, another great addition from the Craw Systems community Most of my time has been reviewing it and making small edits to include the security auth headers for API keys Official Announcement I’m not going to be online through the 5th August to the 10th August, I’ll be camping for those 5* days in a very low-data spot, and I’m almost certainly not taking my laptop. I might be able to get a tiny amount of code on my phone to keep my streak but certainly not enough to engage in my normal conversation on slack or post devlogs"}, {"post_id": 39500, "ts": "2026-08-02T14:31:42Z", "hours": 1.0703, "text": "Package creation and accounts are now working (theoretically) from the command line 🔥"}, {"post_id": 38989, "ts": "2026-08-01T16:48:04Z", "hours": 2.2369, "text": "The account page is looking better, and it’s survived some user testing 🙏 I need to add some boring stuff though like API key listing and said key management"}, {"post_id": 38863, "ts": "2026-08-01T12:58:59Z", "hours": 3.1425, "text": "I’ve been back working on CPM, focused on user accounts."}, {"post_id": 38130, "ts": "2026-07-31T10:56:08Z", "hours": 1.39, "text": "The Crawssembly community is real 🙏 I’ve been reviewing a PR on the GitHub to improve the multiplication script in the CSL ( std/math/multiply.craw )"}, {"post_id": 37274, "ts": "2026-07-29T21:10:18Z", "hours": 0.7014, "text": "I’ve been messing around with --input tag which seems to mess around a bit in the rust vm, but I think I’m getting closer to the cause"}, {"post_id": 36468, "ts": "2026-07-28T16:32:48Z", "hours": 1.0483, "text": "Hack Club seems to have updated the rules on banner images, claiming it has to be an image of your project working. This is no issue for Crawssembly. The new banner is now the output of one of my programs, creating the banner pixel for pixel. This both compiles with the new rule, as it demonstrates Crawssembly functioning, while maintaining its identity."}, {"post_id": 36310, "ts": "2026-07-28T10:47:11Z", "hours": 2.2539, "text": "I’ve discovered that the input file mechanism is broken, so that’s great. I’ve also been adding more commands to CrawOS"}, {"post_id": 35823, "ts": "2026-07-27T14:42:16Z", "hours": 1.9103, "text": "I’ve been adding some very basic commands, such as exit , help , and clear"}, {"post_id": 34854, "ts": "2026-07-25T21:54:23Z", "hours": 2.7158, "text": "Once you get 1 command working, many more will follow! That’s right, a command line written 100% in Crawssembly code 🔥"}, {"post_id": 34296, "ts": "2026-07-24T21:36:54Z", "hours": 0.505, "text": "icl I’ve not done much today, mostly testing the allocation code and it looks up to spec tbh, not much to say"}, {"post_id": 33496, "ts": "2026-07-23T14:28:32Z", "hours": 1.4308, "text": "Stack allocation and freeing appear to work, but I need to do more testing to prove it"}, {"post_id": 32893, "ts": "2026-07-22T10:59:17Z", "hours": 4.3922, "text": "I’m still working on stack allocation, the complex parts are walking the stack properly to get the headers, along with making sure I don’t corrupt any data. The image attached shows the maximum heap block size in blue, with the data taken up by the header of that block in red (top corner)"}, {"post_id": 32353, "ts": "2026-07-21T13:52:27Z", "hours": 1.4989, "text": "I’m going ahead with this schema for heap blocks, the reserved bits can be used for extra features that I might want to add in later versions"}, {"post_id": 32254, "ts": "2026-07-21T09:37:22Z", "hours": 12.9831, "text": "Staff, please remove the time on this devlog, I accidentally left nano open all night. Sorry!"}, {"post_id": 31982, "ts": "2026-07-20T20:21:19Z", "hours": 1.13, "text": "Reading user input isn’t that easy compared to a language like Python, where you can just do input() . Each character has to be processed as soon as the keyboard records a press, and then saved to memory. I’m currently working on a block method that takes every 16 character you type, and allocates a small block on the heap for each press. This is going to be used for my big project"}, {"post_id": 31817, "ts": "2026-07-20T14:36:29Z", "hours": 1.2011, "text": "I’ve decided to add a heap library to complement the stack library. Doing this should make my next idea easier"}, {"post_id": 31759, "ts": "2026-07-20T12:24:31Z", "hours": 0.7053, "text": "Please also star my actual github page! It’s more important than stardance followers 😤😤 https://github.com/Jonah-Crawford/Crawssembly"}, {"post_id": 31691, "ts": "2026-07-20T09:37:05Z", "hours": 1.4242, "text": "Since IEEE 754 single precision can encode much larger numbers than a standard 32-bit binary number, you can use the library to approximate much larger values for computation"}, {"post_id": 31320, "ts": "2026-07-19T16:50:46Z", "hours": 3.3533, "text": "I’ve been working on a IEEE 754 single precision 32-bit floating point number library for CSL, it turns out it’s more difficult than I expected!"}, {"post_id": 31143, "ts": "2026-07-19T09:51:00Z", "hours": 0.7642, "text": "I realised that my documentation had some issues and unfinished sections, so I touched them up"}, {"post_id": 30931, "ts": "2026-07-18T22:37:22Z", "hours": 0.9317, "text": "Added a simple stack library for function calls and other uses, along with some smaller graphics programs such as screen/rectangle_fill.craw This is also my official announcement that I’ll be doing much less programming, due to summer holiday starting now. This is because I can’t program during family time, camping weeks, and other events. In addition, I have University after summer holidays, so this reduced productivity will continue throughout the rest of Stardance. Thank you all for making Crawssembly the number 1 project on stardance!"}, {"post_id": 29811, "ts": "2026-07-16T23:06:00Z", "hours": 0.5503, "text": "67 followers"}, {"post_id": 29415, "ts": "2026-07-16T11:01:49Z", "hours": 0.8972, "text": "I’m currently focusing on adding new functions to the screen library, such as rectangles, using the line program as a primitive"}, {"post_id": 28832, "ts": "2026-07-15T10:34:49Z", "hours": 2.9103, "text": "The initial line algo only works for the 0-octant, but now my new and improved version works for every line angle!"}, {"post_id": 27711, "ts": "2026-07-13T14:37:24Z", "hours": 1.2111, "text": "We have proper line segments working 🔥"}, {"post_id": 27105, "ts": "2026-07-12T11:30:09Z", "hours": 2.2058, "text": "I’ve been adding line functions at the moment, to be honest it’s harder than the circle! Getting the angles right is the hardest"}, {"post_id": 26637, "ts": "2026-07-11T15:56:48Z", "hours": 1.8617, "text": "Circle made 🔥"}, {"post_id": 26568, "ts": "2026-07-11T14:04:16Z", "hours": 2.7844, "text": "Taking a break from CPM to work on some graphics libraries, drawing lines, circles etc…"}, {"post_id": 25954, "ts": "2026-07-10T14:03:02Z", "hours": 2.3158, "text": "Accounts are going to be tricky, more front-end stuff and some complex security back-end is going to make this tricky"}, {"post_id": 25201, "ts": "2026-07-09T09:27:17Z", "hours": 0.7178, "text": "Thinking about user login for the CPM, might implement this soon"}, {"post_id": 24627, "ts": "2026-07-08T10:43:46Z", "hours": 0.66, "text": "Thanks to @Keyboard1000n17 for making the CPM website!"}, {"post_id": 24593, "ts": "2026-07-08T09:25:31Z", "hours": 0.6333, "text": "I won’t be as active over the next couple of days so don’t expect many updates"}, {"post_id": 24123, "ts": "2026-07-07T14:18:16Z", "hours": 3.4186, "text": "I’m not good at css, but I’m trying to make the CPM website simple and easy to use. It’ll take a while but it’s slowly coming together"}, {"post_id": 23750, "ts": "2026-07-06T21:31:52Z", "hours": 0.2561, "text": "It turns out I was way closer than I thought! Publishing your own Crawssembly projects is now out of alpha, into beta (Because only I have an API key atm!)"}, {"post_id": 23730, "ts": "2026-07-06T20:59:27Z", "hours": 1.5481, "text": "Still not too much progress on CPM, but I’m still confident I can get it working"}, {"post_id": 23656, "ts": "2026-07-06T19:20:07Z", "hours": 4.075, "text": "CPM is being difficult, I’ve gone through multiple iterations now of the craw pkg publish command, but I feel like I’m getting close."}, {"post_id": 23514, "ts": "2026-07-06T15:13:35Z", "hours": 1.2278, "text": "I’ve been fighting with my server for a while now, the connection keeps on interrupting. As votes are currently coming in for Crawssembly v1.1.0, I suspect my score will be lower than expected due to the demo and doc websites coming offline randomly."}, {"post_id": 23449, "ts": "2026-07-06T13:09:35Z", "hours": 2.1969, "text": "My issues at the moment are about getting a command, craw pkg pack to create a CPM ready tarball of your project from the command line. That and my server is having a couple of internet issues at the moment which are hindering my progress. This devlog is also an official announcement that I won’t be as active as normal over the next week. I have family coming around so my time programming will be limited. In addition, when summer holiday starts this will continue, which is why most of my time programming is in the June and early July, the rest of stardance will have fewer updates and less time spent on casm."}, {"post_id": 23401, "ts": "2026-07-06T10:39:43Z", "hours": 2.2703, "text": "CPM officially works! The pipeline of Crawssembly Source -> Tarball -> Github -> CPM -> craw pkg install -> executestd functions!"}, {"post_id": 22937, "ts": "2026-07-05T16:19:57Z", "hours": 0.6922, "text": "I forgot to add on the hackatime projects of my time spent on the CPM and tests, mb"}, {"post_id": 22902, "ts": "2026-07-05T15:21:06Z", "hours": 4.3764, "text": "I’ve registered the Crawssembly Package Manager website, some SQLite problems caused some issues but I’m getting there."}, {"post_id": 22103, "ts": "2026-07-04T11:47:12Z", "hours": 0.8486, "text": "I’ve been having some internet issues with my server recently, so my productivity has slowed. However I’m at the final testing stages of linking github repos to get craw install <package> to work. The test is done on a simple repo but it should be enough to see if it works"}, {"post_id": 22080, "ts": "2026-07-04T10:27:02Z", "hours": 1.33, "text": "Compiling from a local tarball works! I’ll be working on the database soon so users can search and download. My plan is that the program is stored as a github repo, similar to cargo ."}, {"post_id": 21459, "ts": "2026-07-03T12:44:46Z", "hours": 2.6692, "text": "Package manager is coming along… slowly. I’m still working on getting a local package to install into the global executestd file inside the home folder, but it’s taking it’s time!"}, {"post_id": 21375, "ts": "2026-07-03T08:43:14Z", "hours": 2.1081, "text": "v1.2.0 is already underway! I’ve spent some time constructing a cargo crate for Crawssembly to allow other rust programs to use Crawssembly’s logic. So now YOU can add Crawssembly to your programs!"}, {"post_id": 20935, "ts": "2026-07-02T17:47:58Z", "hours": 4.0467, "text": "After helping figure out the Stardance bug with projects, Crawssembly v1.1.0 is ready to ship!"}, {"post_id": 20147, "ts": "2026-07-01T18:08:54Z", "hours": 1.3117, "text": "I’ve added the compare branch, for number checks. == , != , > , >= , < , and <= all included"}, {"post_id": 20079, "ts": "2026-07-01T16:25:10Z", "hours": 1.3397, "text": "I’ve added more CSL files, such as math/power.craw , math/abs.craw , and math/modulo.craw"}, {"post_id": 19299, "ts": "2026-06-30T15:54:10Z", "hours": 1.4808, "text": "Basic multiplication and division are the first to enter the CSL! I focused on making them memory efficient rather than time efficient, because using fewer registers makes it easier for beginners to use them in normal programs. And because Crawssembly is very very quick (Almost C level speeds) a couple extra thousand ticks won’t be missed for these first programs"}, {"post_id": 19219, "ts": "2026-06-30T14:16:39Z", "hours": 1.9419, "text": "File execution is now working! You can insert programs using execute path/to/program.craw , this leads to the Crawssembly Standard Library, a collection of useful programs that can be accessed using executestd program.craw , such as multiply or division code."}, {"post_id": 19106, "ts": "2026-06-30T10:40:13Z", "hours": 1.1736, "text": "I’m going to confess here, I was a bit lazy. I decided that, because I could create the time program, I rewarded myself by adding a native ISO 8601 time output command io text iso rXX . Elegant? Yes. Low-Level? Not as much as I would like. But the choice was either make a single line of code to simplify programs like this massively, or wire in a tediously made, messy 350 line program that doesn’t fully account for the 400 leap year rule or leap seconds. Hmm… TLDR; I caved to simplicity. But CrawFS file listing from boot now display file genesis time!"}, {"post_id": 18658, "ts": "2026-06-29T20:58:53Z", "hours": 1.0361, "text": "The time program finally works! I wrapped it in a loop so it reloads every 200ms to make a real-time clock. Soon I’ll port it to the CrawFS system to read file creation dates"}, {"post_id": 18592, "ts": "2026-06-29T19:40:11Z", "hours": 4.485, "text": "It turns out that time resolution is much harder than I thought! It’s taken me a while but I’ve got the program working for CCYY-MM-DD"}, {"post_id": 18335, "ts": "2026-06-29T13:20:35Z", "hours": 3.6708, "text": "CrawFS reading is almost done, but I need to program a way to take a raw Unix timestamp and convert it into a nice iso 8601 format ( CCYY-MM-DD HH:MM:SS ) for the ‘Time created’ field"}, {"post_id": 17965, "ts": "2026-06-28T22:33:13Z", "hours": 1.9408, "text": "Reading a specific file is clearly much harder than reading the boot sector. It turns out that parsing user input is a devious task itself!"}, {"post_id": 17863, "ts": "2026-06-28T20:03:06Z", "hours": 6.4758, "text": "Did someone say boot sectors? That’s right, Crawssembly can now read CrawFS boot sectors and output the file table data! This took a surprisingly long time, as the binary boot sector is very delicate."}, {"post_id": 17529, "ts": "2026-06-28T10:56:52Z", "hours": 2.0917, "text": "I’ve been working on a basic file system, CrawFS , used as a stepping stone towards real ones like FAT16 , FAT32 , and NTFS ."}, {"post_id": 16918, "ts": "2026-06-27T14:08:58Z", "hours": 1.6475, "text": "No time to waste after v1.0.0 is released! I’ve added raw disk sector editing for Crawssembly; an opt-in way of reading and writing to your real disk, rather than a VM. ! THIS COULD DESTROY YOUR COMPUTER ! So only do it if you know what you’re doing, as a single bit change will probably brick your entire machine if you use the --raw-disk option"}, {"post_id": 16497, "ts": "2026-06-26T20:53:01Z", "hours": 0.2767, "text": "The final updates have been made, the github is ready to ship!"}, {"post_id": 16387, "ts": "2026-06-26T17:43:02Z", "hours": 0.4742, "text": "THIS IS IT! The moment I’ve been waiting for almost a year, the first stable release of Crawssembly v1.0.0 ! And what fortune that I get to share it with you people on Stardance!"}, {"post_id": 16247, "ts": "2026-06-26T11:58:09Z", "hours": 2.7383, "text": "Crawssembly is soon to be shipped on version 1.0.0 ! A massive milestone for a project I started ~11 months ago. The raffle discs have been burned, and final preparations are underway for release."}, {"post_id": 15925, "ts": "2026-06-25T21:28:53Z", "hours": 2.8969, "text": "Basic syntax highlighting for nano ! Simply run craw install-nano to gain access to these beautiful new colours when editing .craw files."}, {"post_id": 15761, "ts": "2026-06-25T17:09:48Z", "hours": 3.3403, "text": "RAFFLE UPDATE! The 3 discs have been completed. Soon, Crawssembly will be shipped on it’s first release! Remember to follow Crawssembly before the 1st July 00:00 UTC for your chance to win one of these beautiful pieces of computing history!"}, {"post_id": 15622, "ts": "2026-06-25T12:32:33Z", "hours": 2.0561, "text": "I’ve been working on fixing up the activities in the README.md, and providing possible solutions for each. The image below is a possible output of the activity “Smiling Screen”"}, {"post_id": 15555, "ts": "2026-06-25T09:06:54Z", "hours": 0.6672, "text": "Adding the last features for pong was quite simple, making the computer lag behind a random amount utilises the current millisecond UNIX timestamp, with the least significant 2 bits being used as the ‘reaction time’, along with a per-frame flag to increase this reaction time to solve for repeating loops. The scoring system at this point is just the number of pixels in the top corner, unlike the real pong which used numbers. Perhaps for a later version?"}, {"post_id": 15542, "ts": "2026-06-25T08:21:44Z", "hours": 6.6775, "text": "PONG is very almost finished, all that needs to be done is to fine-tune the computer movement and finish displaying the score."}, {"post_id": 15086, "ts": "2026-06-24T14:51:07Z", "hours": 1.7008, "text": "I’m now moving onto some game examples. I’m working on a basic version of the popular game PONG, the hardest part is going to be the graphics syncing up with the mathematical logic"}, {"post_id": 14404, "ts": "2026-06-23T14:59:26Z", "hours": 1.9525, "text": "The structure of the compiler is complete, but getting it to work is another beast of debugging. I think this is the first program of its kind; the first program where no one, not even me, can understand it fully. A true milestone for Crawssembly"}, {"post_id": 14331, "ts": "2026-06-23T12:57:06Z", "hours": 3.1389, "text": "Integer parsing requires multiplication by 10, which in Base-10 is easy as you can just add a zero at the end. But in binary you can’t do this, as that would be multiplying by 2. So you need to get a bit more creative when multiplying by a known amount in binary. The code below shows how a number, ‘abc’ can be expressed as 100a + 10b + c. This is real code from my Crawssembly compiler written in Crawssembly."}, {"post_id": 13936, "ts": "2026-06-22T21:21:17Z", "hours": 2.0808, "text": "I’ve done a little experiment with a reduced branch of Crawssembly made for tiny ISA’s, with instructions only a single byte wide! An image of what the CPU’s core might look like is shown below."}, {"post_id": 13603, "ts": "2026-06-22T09:14:02Z", "hours": 5.5197, "text": "The trie is complete! Although I’ve still much to do for the compiler, such as per-character parsing, storage of label elements, calculation of register codes, etc…"}, {"post_id": 12777, "ts": "2026-06-20T21:47:41Z", "hours": 1.7731, "text": "7/24 trie branches have been added to the compiler, totalling just under 1000 lines of Crawssembly code, the longest hand-written .craw program ever made!"}, {"post_id": 12486, "ts": "2026-06-20T12:09:00Z", "hours": 6.3061, "text": "Adding branches still takes a while, but it’s much more efficient than testing every character for every instruction. So far I’ve mapped 17 out of ~64 command strings."}, {"post_id": 12022, "ts": "2026-06-19T16:40:42Z", "hours": 7.6139, "text": "I’ll be taking a break over the weekend, as I’ve just completed my final exams and I’m celebrating. I’ll be back proper on Monday. Today I worked on creating a trie for Crawssembly’s commands, which can be used to increase efficiency in my compiler to parse instructions faster. Rather than checking every char for every instruction like cal add -65 r01 ; if r01 = 65, this will be 0 ifz 10 ; continue if 0 cal add -70 r02 ; if r02 = 65, this will be 0 ifz 20 ; continue if 0 etc... I can split each branch into separate instructions, reducing line count and time-to-compile"}, {"post_id": 11550, "ts": "2026-06-18T20:54:02Z", "hours": 1.8203, "text": "Basic structures are coming together for the compiler"}, {"post_id": 11465, "ts": "2026-06-18T18:55:47Z", "hours": 3.2833, "text": "The C emitter function now works to the same standard as Crawssembly Online! In other news, I’m starting to write a Crawssembly compiler in Crawssembly ! This is a big step and proves that Crawssembly’s language is comprehensive enough to take on this task."}, {"post_id": 11201, "ts": "2026-06-18T10:23:03Z", "hours": 4.2258, "text": "I’m working on a way to convert Crawssembly into native ASM language, by writing to a C file and compiling that output."}, {"post_id": 9958, "ts": "2026-06-16T14:20:14Z", "hours": 0.7653, "text": "ATTENTION! The moment has arrived; The CRAWSSEMBLY Raffle! Get the chance to win a LIMITED-EDITION installer and collectable Crawssembly Disc! The disc contains the official compiler, virtual machine, and documentation. Also included are un-released legacy files from development. Simply follow Crawssembly on Stardance to enter your name! Shipping may vary depending on the UK Postal service. There are 3 physical First Edition discs available worldwide. If you’re outside the UK, I may ask you to contribute towards postage if shipping costs are high. The 3 winners will be announced on the 1st of July! So get your entry in before 23:59 UTC 30th June! Don’t miss this opportunity! Follow Crawssembly today and support open-source learning!"}, {"post_id": 9903, "ts": "2026-06-16T12:33:41Z", "hours": 0.4594, "text": "I want to thank the Stardance devs for my Super Star tag! Peak staff fr"}, {"post_id": 9210, "ts": "2026-06-15T13:50:37Z", "hours": 1.9831, "text": "Random number generator has been added to the example group, I used XOR and bit shifts with the new command io time milli , which extracts the current UNIX timestamp in milliseconds, as the seed. Basic, but quite random from a human perspective."}, {"post_id": 9153, "ts": "2026-06-15T10:18:06Z", "hours": 5.0008, "text": "I’ve been working on some examples, the biggest one being a simple calculator."}, {"post_id": 8769, "ts": "2026-06-14T16:05:49Z", "hours": 2.1869, "text": "Graphics bug fixed! Crawssembly for macOS is officially working!"}, {"post_id": 8694, "ts": "2026-06-14T13:21:09Z", "hours": 0.2944, "text": "File input now works for macOS Crawssembly! Run craw myprogram.craw --file myinputs.file to run! (The image is from Linux, not from my Mac because it’s too old for me to log in to stardance and post a ss from it, but I can assure you it works!)"}, {"post_id": 8685, "ts": "2026-06-14T13:00:13Z", "hours": 1.8931, "text": "macOS can now do everything windows can except use the speakers, scan-line free graphics, and access files. These will be the largest source of my time."}, {"post_id": 8634, "ts": "2026-06-14T11:02:36Z", "hours": 1.2475, "text": "I’m currently working on getting macOS support running. At the moment, macOS is only confirmed to work to the same level as Crawssembly Online. Hopefully I can get it to the same standard as Linux and Dos systems!"}, {"post_id": 8214, "ts": "2026-06-13T17:40:18Z", "hours": 1.2083, "text": "My respect to real CPU designers, this is tricky work! The most difficult thing is working with the 256 different registers, that’s lots of wiring to get done."}, {"post_id": 8022, "ts": "2026-06-13T11:56:22Z", "hours": 0.4569, "text": "Dedicated documentation website created, and the new demo is live at https://crawssembly.ultimatecraw.xyz/"}, {"post_id": 8011, "ts": "2026-06-13T11:23:53Z", "hours": 0.9736, "text": "Demo and README in working order, for real this time! The final things to do before shipping: Full macOS functionality: Maybe Add documentation to demo: Yes Add syntax highlighting to demo: Maybe Final Cleanup: Yes"}, {"post_id": 7748, "ts": "2026-06-12T22:53:22Z", "hours": 0.7378, "text": "I don’t usually work with frontend, so the demo won’t look anywhere near as nice as some of the other projects on Stardance, but as long as it’s usable then I’m happy."}, {"post_id": 7722, "ts": "2026-06-12T21:43:33Z", "hours": 0.8628, "text": "Crawssembly demo now working! Luckily it wasn’t as hard as I expected. I’ve tied it to an old URL for now, and it’s basic, but it works. https://demo.ultimatecraw.xyz/"}, {"post_id": 7681, "ts": "2026-06-12T20:38:11Z", "hours": 4.555, "text": "README.md Complete! The final steps is creating the demo! (And maybe getting MacOS working)"}, {"post_id": 7517, "ts": "2026-06-12T15:35:42Z", "hours": 2.0622, "text": "Many thanks to Koy Camerini-Yachdav , who tested Crawssembly on Mac OS! Their efforts go towards helping more people understand how computers actually work. ❤️ In other news, Crawssembly is soon ready for the first official release. I estimate <2 weeks before a ship fully working on both Linux and Windows systems will be made!"}, {"post_id": 7381, "ts": "2026-06-12T09:39:51Z", "hours": 0.5978, "text": "File inputs are finally ready, I think craw now has all it needs for the first release. Exciting times!"}, {"post_id": 7124, "ts": "2026-06-11T22:07:29Z", "hours": 2.2083, "text": "README.md now has documentation about all commands that will be in the first release. I’m yet to make the live demo and the documentation about machine codes though!"}, {"post_id": 7034, "ts": "2026-06-11T19:54:59Z", "hours": 3.0742, "text": "Crawssembly Programs can now be force-quit by pressing CRTL+C. I should have added this long ago, but I added it in the end."}, {"post_id": 6771, "ts": "2026-06-11T10:45:07Z", "hours": 5.2019, "text": "I’ve been doing some user testing, and have made changes to the documentation and program, such as adding craw myfile.craw --dump-decoded and craw myfile.craw --tui commands easy to use and run."}, {"post_id": 6180, "ts": "2026-06-10T11:48:41Z", "hours": 21.6656, "text": "Dynamic graphic size achieved! You can now set the screen size of the Crawssembly program by running craw myfile.craw --screen WIDTHxHEIGHT using the –screen argument."}, {"post_id": 5582, "ts": "2026-06-09T13:09:25Z", "hours": 4.1789, "text": "README.md now contains enough information about Crawssembly to make it Turing Complete. The rest involves storage, input devices, and output service commands."}, {"post_id": 5471, "ts": "2026-06-09T08:19:39Z", "hours": 0.3619, "text": "Crawssembly is officially clear for Windows & Linux OS releases! Mac OS support will hopefully come soon. There may be some linux distros that are special and cause some weird and wonderful problems, but for the generic versions (Think Ubuntu) I’m confident that Crawssembly is compatible."}, {"post_id": 5456, "ts": "2026-06-09T07:45:58Z", "hours": 4.5339, "text": "Never understood what binary actually is? Why is it important, and why are binary skills becoming less important? All this, and more, is revealed in the Crawssembly Project; the ultimate guide to learning the fundamentals of real computer design, and assembly-like languages."}, {"post_id": 4930, "ts": "2026-06-08T15:11:03Z", "hours": 3.2828, "text": "More work done on the docs today. I’m assuming near-zero knowledge about computing to allow all to access the Crawssembly Project"}, {"post_id": 4319, "ts": "2026-06-07T16:05:58Z", "hours": 3.4303, "text": "Most of my efforts today are going to the README.md file, helping beginners get their heads around Assembly-like languages"}, {"post_id": 3567, "ts": "2026-06-06T15:47:13Z", "hours": 1.5453, "text": "Currently working on adding logical branching (‘if’ statements) to CRISP, my high-level language to compile into Crawssembly"}, {"post_id": 2869, "ts": "2026-06-05T18:56:50Z", "hours": 0.5139, "text": "Crawssembly - Initial Post"}]...
|
Title: Crawssembly by @The_Craw | Stardance
Devlo Title: Crawssembly by @The_Craw | Stardance
Devlogs:
Crawssembly - Initial Post
Currently working on adding logical branching (‘if’ statements) to CRISP, my high-level language to compile into Crawssembly
Most of my efforts today are going to the README.md file, helping beginners get their heads around Assembly-like languages
More work done on the docs today. I’m assuming near-zero knowledge about computing to allow all to access the Crawssembly Project
Never understood what binary actually is? Why is it important, and why are binary skills becoming less important? All this, and more, is revealed in the Crawssembly Project; the ultimate guide to learning the fundamentals of real computer design, and assembly-like languages.
Crawssembly is officially clear for Windows & Linux OS releases! Mac OS support will hopefully come soon. There may be some linux distros that are special and cause some weird and wonderful problems, but for the generic versions (Think Ubuntu) I’m confident that Crawssembly is compatible.
README.md now contains enough information about Crawssembly to make it Turing Complete. The rest involves storage, input devices, and output service commands.
Dynamic graphic size achieved! You can now set the screen size of the Crawssembly program by running craw myfile.craw --screen WIDTHxHEIGHT using the –screen argument.
I’ve been doing some user testing, and have made changes to the documentation and program, such as adding craw myfile.craw --dump-decoded and craw myfile.craw --tui commands easy to use and run.
Crawssembly Programs can now be force-quit by pressing CRTL+C. I should have added this long ago, but I added it in the end.
README.md now has documentation about all commands that will be in the first release. I’m yet to make the live demo and the documentation about machine codes though!
File inputs are finally ready, I think craw now has all it needs for the first release. Exciting times!
Many thanks to Koy Camerini-Yachdav , who tested Crawssembly on Mac OS! Their efforts go towards helping more people understand how computers actually work. ❤️ In other news, Crawssembly is soon ready for the first official release. I estimate <2 weeks before a ship fully working on both Linux and Windows systems will be made!
README.md Complete! The final steps is creating the demo! (And maybe getting MacOS working)
Crawssembly demo now working! Luckily it wasn’t as hard as I expected. I’ve tied it to an old URL for now, and it’s basic, but it works. https://demo.ultimatecraw.xyz/
I don’t usually work with frontend, so the demo won’t look anywhere near as nice as some of the other projects on Stardance, but as long as it’s usable then I’m happy.
Demo and README in working order, for real this time! The final things to do before shipping: Full macOS functionality: Maybe Add documentation to demo: Yes Add syntax highlighting to demo: Maybe Final Cleanup: Yes
Dedicated documentation website created, and the new demo is live at https://crawssembly.ultimatecraw.xyz/
My respect to real CPU designers, this is tricky work! The most difficult thing is working with the 256 different registers, that’s lots of wiring to get done.
I’m currently working on getting macOS support running. At the moment, macOS is only confirmed to work to the same level as Crawssembly Online. Hopefully I can get it to the same standard as Linux and Dos systems!
macOS can now do everything windows can except use the speakers, scan-line free graphics, and access files. These will be the largest source of my time.
File input now works for macOS Crawssembly! Run craw myprogram.craw --file myinputs.file to run! (The image is from Linux, not from my Mac because it’s too old for me to log in to stardance and post a ss from it, but I can assure you it works!)
Graphics bug fixed! Crawssembly for macOS is officially working!
I’ve been working on some examples, the biggest one being a simple calculator.
Random number generator has been added to the example group, I used XOR and bit shifts with the new command io time milli , which extracts the current UNIX timestamp in milliseconds, as the seed. Basic, but quite random from a human perspective.
I want to thank the Stardance devs for my Super Star tag! Peak staff fr
ATTENTION! The moment has arrived; The CRAWSSEMBLY Raffle! Get the chance to win a LIMITED-EDITION installer and collectable Crawssembly Disc! The disc contains the official compiler, virtual machine, and documentation. Also included are un-released legacy files from development. Simply follow Crawssembly on Stardance to enter your name! Shipping may vary depending on the UK Postal service. There are 3 physical First Edition discs available worldwide. If you’re outside the UK, I may ask you to contribute towards postage if shipping costs are high. The 3 winners will be announced on the 1st of July! So get your entry in before 23:59 UTC 30th June! Don’t miss this opportunity! Follow Crawssembly today and support open-source learning!
I’m working on a way to convert Crawssembly into native ASM language, by writing to a C file and compiling that output.
The C emitter function now works to the same standard as Crawssembly Online! In other news, I’m starting to write a Crawssembly compiler in Crawssembly ! This is a big step and proves that Crawssembly’s language is comprehensive enough to take on this task.
Basic structures are coming together for the compiler
I’ll be taking a break over the weekend, as I’ve just completed my final exams and I’m celebrating. I’ll be back proper on Monday. Today I worked on creating a trie for Crawssembly’s commands, which can be used to increase efficiency in my compiler to parse instructions faster. Rather than checking every char for every instruction like cal add -65 r01 ; if r01 = 65, this will be 0 ifz 10 ; continue if 0 cal add -70 r02 ; if r02 = 65, this will be 0 ifz 20 ; continue if 0 etc... I can split each branch into separate instructions, reducing line count and time-to-compile
Adding branches still takes a while, but it’s much more efficient than testing every character for every instruction. So far I’ve mapped 17 out of ~64 command strings.
7/24 trie branches have been added to the compiler, totalling just under 1000 lines of Crawssembly code, the longest hand-written .craw program ever made!
The trie is complete! Although I’ve still much to do for the compiler, such as per-character parsing, storage of label elements, calculation of register codes, etc…
I’ve done a little experiment with a reduced branch of Crawssembly made for tiny ISA’s, with instructions only a single byte wide! An image of what the CPU’s core might look like is shown below.
Integer parsing requires multiplication by 10, which in Base-10 is easy as you can just add a zero at the end. But in binary you can’t do this, as that would be multiplying by 2. So you need to get a bit more creative when multiplying by a known amount in binary. The code below shows how a number, ‘abc’ can be expressed as 100a + 10b + c. This is real code from my Crawssembly compiler written in Crawssembly.
The structure of the compiler is complete, but getting it to work is another beast of debugging. I think this is the first program of its kind; the first program where no one, not even me, can understand it fully. A true milestone for Crawssembly
I’m now moving onto some game examples. I’m working on a basic version of the popular game PONG, the hardest part is going to be the graphics syncing up with the mathematical logic
PONG is very almost finished, all that needs to be done is to fine-tune the computer movement and finish displaying the score.
Adding the last features for pong was quite simple, making the computer lag behind a random amount utilises the current millisecond UNIX timestamp, with the least significant 2 bits being used as the ‘reaction time’, along with a per-frame flag to increase this reaction time to solve for repeating loops. The scoring system at this point is just the number of pixels in the top corner, unlike the real pong which used numbers. Perhaps for a later version?
I’ve been working on fixing up the activities in the README.md, and providing possible solutions for each. The image below is a possible output of the activity “Smiling Screen”
RAFFLE UPDATE! The 3 discs have been completed. Soon, Crawssembly will be shipped on it’s first release! Remember to follow Crawssembly before the 1st July 00:00 UTC for your chance to win one of these beautiful pieces of computing history!
Basic syntax highlighting for nano ! Simply run craw install-nano to gain access to these beautiful new colours when editing .craw files.
Crawssembly is soon to be shipped on version 1.0.0 ! A massive milestone for a project I started ~11 months ago. The raffle discs have been burned, and final preparations are underway for release.
THIS IS IT! The moment I’ve been waiting for almost a year, the first stable release of Crawssembly v1.0.0 ! And what fortune that I get to share it with you people on Stardance!
The final updates have been made, the github is ready to ship!
No time to waste after v1.0.0 is released! I’ve added raw disk sector editing for Crawssembly; an opt-in way of reading and writing to your real disk, rather than a VM. ! THIS COULD DESTROY YOUR COMPUTER ! So only do it if you know what you’re doing, as a single bit change will probably brick your entire machine if you use the --raw-disk option
I’ve been working on a basic file system, CrawFS , used as a stepping stone towards real ones like FAT16 , FAT32 , and NTFS .
Did someone say boot sectors? That’s right, Crawssembly can now read CrawFS boot sectors and output the file table data! This took a surprisingly long time, as the binary boot sector is very delicate.
Reading a specific file is clearly much harder than reading the boot sector. It turns out that parsing user input is a devious task itself!
CrawFS reading is almost done, but I need to program a way to take a raw Unix timestamp and convert it into a nice iso 8601 format ( CCYY-MM-DD HH:MM:SS ) for the ‘Time created’ field
It turns out that time resolution is much harder than I thought! It’s taken me a while but I’ve got the program working for CCYY-MM-DD
The time program finally works! I wrapped it in a loop so it reloads every 200ms to make a real-time clock. Soon I’ll port it to the CrawFS system to read file creation dates
I’m going to confess here, I was a bit lazy. I decided that, because I could create the time program, I rewarded myself by adding a native ISO 8601 time output command io text iso rXX . Elegant? Yes. Low-Level? Not as much as I would like. But the choice was either make a single line of code to simplify programs like this massively, or wire in a tediously made, messy 350 line program that doesn’t fully account for the 400 leap year rule or leap seconds. Hmm… TLDR; I caved to simplicity. But CrawFS file listing from boot now display file genesis time!
File execution is now working! You can insert programs using execute path/to/program.craw , this leads to the Crawssembly Standard Library, a collection of useful programs that can be accessed using executestd program.craw , such as multiply or division code.
Basic multiplication and division are the first to enter the CSL! I focused on making them memory efficient rather than time efficient, because using fewer registers makes it easier for beginners to use them in normal programs. And because Crawssembly is very very quick (Almost C level speeds) a couple extra thousand ticks won’t be missed for these first programs
I’ve added more CSL files, such as math/power.craw , math/abs.craw , and math/modulo.craw
I’ve added the compare branch, for number checks. == , != , > , >= , < , and <= all included
After helping figure out the Stardance bug with projects, Crawssembly v1.1.0 is ready to ship!
v1.2.0 is already underway! I’ve spent some time constructing a cargo crate for Crawssembly to allow other rust programs to use Crawssembly’s logic. So now YOU can add Crawssembly to your programs!
Package manager is coming along… slowly. I’m still working on getting a local package to install into the global executestd file inside the home folder, but it’s taking it’s time!
Compiling from a local tarball works! I’ll be working on the database soon so users can search and download. My plan is that the program is stored as a github repo, similar to cargo .
I’ve been having some internet issues with my server recently, so my productivity has slowed. However I’m at the final testing stages of linking github repos to get craw install <package> to work. The test is done on a simple repo but it should be enough to see if it works
I’ve registered the Crawssembly Package Manager website, some SQLite problems caused some issues but I’m getting there.
I forgot to add on the hackatime projects of my time spent on the CPM and tests, mb
CPM officially works! The pipeline of Crawssembly Source -> Tarball -> Github -> CPM -> craw pkg install -> executestd functions!
My issues at the moment are about getting a command, craw pkg pack to create a CPM ready tarball of your project from the command line. That and my server is having a couple of internet issues at the moment which are hindering my progress. This devlog is also an official announcement that I won’t be as active as normal over the next week. I have family coming around so my time programming will be limited. In addition, when summer holiday starts this will continue, which is why most of my time programming is in the June and early July, the rest of stardance will have fewer updates and less time spent on casm.
I’ve been fighting with my server for a while now, the connection keeps on interrupting. As votes are currently coming in for Crawssembly v1.1.0, I suspect my score will be lower than expected due to the demo and doc websites coming offline randomly.
CPM is being difficult, I’ve gone through multiple iterations now of the craw pkg publish command, but I feel like I’m getting close.
Still not too much progress on CPM, but I’m still confident I can get it working
It turns out I was way closer than I thought! Publishing your own Crawssembly projects is now out of alpha, into beta (Because only I have an API key atm!)
I’m not good at css, but I’m trying to make the CPM website simple and easy to use. It’ll take a while but it’s slowly coming together
I won’t be as active over the next couple of days so don’t expect many updates
Thanks to @Keyboard1000n17 for making the CPM website!
Thinking about user login for the CPM, might implement this soon
Accounts are going to be tricky, more front-end stuff and some complex security back-end is going to make this tricky
Taking a break from CPM to work on some graphics libraries, drawing lines, circles etc…
Circle made 🔥
I’ve been adding line functions at the moment, to be honest it’s harder than the circle! Getting the angles right is the hardest
We have proper line segments working 🔥
The initial line algo only works for the 0-octant, but now my new and improved version works for every line angle!
I’m currently focusing on adding new functions to the screen library, such as rectangles, using the line program as a primitive
67 followers
Added a simple stack library for function calls and other uses, along with some smaller graphics programs such as screen/rectangle_fill.craw This is also my official announcement that I’ll be doing much less programming, due to summer holiday starting now. This is because I can’t program during family time, camping weeks, and other events. In addition, I have University after summer holidays, so this reduced productivity will continue throughout the rest of Stardance. Thank you all for making Crawssembly the number 1 project on stardance!
I realised that my documentation had some issues and unfinished sections, so I touched them up
I’ve been working on a IEEE 754 single precision 32-bit floating point number library for CSL, it turns out it’s more difficult than I expected!
Since IEEE 754 single precision can encode much larger numbers than a standard 32-bit binary number, you can use the library to approximate much larger values for computation
Please also star my actual github page! It’s more important than stardance followers 😤😤 https://github.com/Jonah-Crawford/Crawssembly
I’ve decided to add a heap library to complement the stack library. Doing this should make my next idea easier
Reading user input isn’t that easy compared to a language like Python, where you can just do input() . Each character has to be processed as soon as the keyboard records a press, and then saved to memory. I’m currently working on a block method that takes every 16 character you type, and allocates a small block on the heap for each press. This is going to be used for my big project
Staff, please remove the time on this devlog, I accidentally left nano open all night. Sorry!
I’m going ahead with this schema for heap blocks, the reserved bits can be used for extra features that I might want to add in later versions
I’m still working on stack allocation, the complex parts are walking the stack properly to get the headers, along with making sure I don’t corrupt any data. The image attached shows the maximum heap block size in blue, with the data taken up by the header of that block in red (top corner)
Stack allocation and freeing appear to work, but I need to do more testing to prove it
icl I’ve not done much today, mostly testing the allocation code and it looks up to spec tbh, not much to say
Once you get 1 command working, many more will follow! That’s right, a command line written 100% in Crawssembly code 🔥
I’ve been adding some very basic commands, such as exit , help , and clear
I’ve discovered that the input file mechanism is broken, so that’s great. I’ve also been adding more commands to CrawOS
Hack Club seems to have updated the rules on banner images, claiming it has to be an image of your project working. This is no issue for Crawssembly. The new banner is now the output of one of my programs, creating the banner pixel for pixel. This both compiles with the new rule, as it demonstrates Crawssembly functioning, while maintaining its identity.
I’ve been messing around with --input tag which seems to mess around a bit in the rust vm, but I think I’m getting closer to the cause
The Crawssembly community is real 🙏 I’ve been reviewing a PR on the GitHub to improve the multiplication script in the CSL ( std/math/multiply.craw )
I’ve been back working on CPM, focused on user accounts.
The account page is looking better, and it’s survived some user testing 🙏 I need to add some boring stuff though like API key listing and said key management
Package creation and accounts are now working (theoretically) from the command line 🔥
@imakebloatedcode Thank you for your pr for CPM to include OpenAPI scemata, another great addition from the Craw Systems community Most of my time has been reviewing it and making small edits to include the security auth headers for API keys Official Announcement I’m not going to be online through the 5th August to the 10th August, I’ll be camping for those 5* days in a very low-data spot, and I’m almost certainly not taking my laptop. I might be able to get a tiny amount of code on my phone to keep my streak but certainly not enough to engage in my normal conversation on slack or post devlogs
I’ve added Markdown support for CPM packages 🔥
I’ve made publishing packages super easy now, all you need to do is craw init to create the package, and then craw pkg publish . As long as you’re signed into CPM and gh, it’ll just work
I’ve been working with @BetterClient to inprove the program counter and bringing back fgo from casm beta. This is also a reminder that I’ll be OOO until next Monday.
I’m back from camping! (RIP my 60+ day streak) My plans going forward immediately is improving program counter modifications to allow for higher-level concepts to be bootstrapped onto Crawssembly instruction sets. (Image unrelated)
I’ve merged the new fgo rules to the project, so now fgo points to labels similar to jmp , but fgo 0 now jumps to the label defined in r01 I was having some issues with using git but I got them sorted
I’ve separated the old sleep command into sleepms for millisecond waits and sleepus for microsecond waits. Although, microsecond precision is highly dependent on the OS, so it won’t be as accurate as sleepms for smaller values (Say, n<50)
Sorry for the but it’s been a hectic couple of days. I got into University! I’ve also been busy taking a look at a CGOL implementation, truly amazing stuff! Go check it out: https://github.com/srxcode/game-of-life-crawssembly
I’ve added io keyboard mod to create a bitfield of modification key presses for the keyboard device, so now keys like CTRL and TAB can be handled, which lays the foundation for my next project which is making a basic file editor in casm
Lots of work today, sorry for the . I’ve been struggling with the text editor, heap buffers, cursor allocation, character addresses, etc etc… ad infinitum. However, I’m getting close. Rendering is outputting something, although I don’t know why typing doesn’t seem to add anything…
For some reason, I’ve been banned on slack. I don’t know why, since no one will tell me. This is not good news, but luckily it doesn’t seem to be a stardance-wide ban, so I can still do the hackathon.
Still no clue why characters aren’t being saved to memory in my free heap block Slow day today fr
I’m finally getting somewhere with the editor, however I’m now having issues with character deletion, and adding characters inside empty newlines
stardance
I’ve brought run back from the dead. You can now use run rXX to run a binary value inside the input register as a Crawssembly instruction
I’VE ACTUALLY DONE IT 🔥 Networking is now officially part of Crawssembly. Alpha tests on localhost have all passed
HTTP requests working 🔥 ts is so peak icl
I’ve been doing much more testing and implementing the network device. Specifically testing the following commands: io net ip , io net addr , io net connect , io net socket , io net port , io net listen , io net accept , io net send , io net protocol , io net block , and io net recv .
I’m back! Fraud Squad unbanned me so WE are all having a party at my house Although I can’t use nano apparently anymore… so Crawssembly will be having it’s final ship very very soon
It has come to my attention that not everyone who has followed Crawssembly has starred it on GitHub! Please, if you like my project, star it on GitHub at https://github.com/Jonah-Crawford/Crawssembly Thank you.
idk where these extra hours are coming from, but as long as I don’t ship them, they won’t count towards stardust so I’ll be fine. In the meantime, enjoy craw slop
Ships:
Crawssembly: The beginner’s gateway to low-level thinking. "Programming languages are a lie!" This is Crawssembly, a project that’s been in production for almost a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly.
Crawssembly v1.1.0 ready to ship! “Programming languages are a lie!” This is Crawssembly, a project that’s been in production for almost a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly.
CRAWSSEMBLY - New and Improved! “Programming languages are a lie!” This is Crawssembly, the number 1 project on all of stardance! It’s a project that’s been in production for over a year. It is an educational assembly-like programming language that teaches users how computers actually work. Programming languages like Python, Ruby, and Java pull the wool over your eyes by abstraction and simplification. Crawssembly is the first step to seeing clearly. What is new? INTERNET SOCKETS! CRAWOS COMMAND LINES! DYNAMIC LABEL JUMPING! IMPROVED DEVICES! DEDICATED PACKAGE SHARING WEBSITE! AND MORE! Check it out for yourself! (Shipped early due to Fraud Squad limitations, Crawssembly is too powerful for Hack Club)...
|
1792839280.3425412
|
1792925680.3425412
|
|
11169
|
SupplyChains by @Thijmen | Stardance
|
Thijmen
|
1
|
313.73
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-03T19:48:03Z", "hours": 307.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Supply Chains Supply Chains is a game inspired by Transport Fever and Mindustry, centered around building road networks and logistics chains for construction and mining operations. Features Vehicles, trailers and a garage Route system: pick a source, a destination and a resource, then assign it to a vehicle Multi-step production chains Construction sites, trading, generated terrain, and A* pathfinding with road weights Controls: WASD camera, 1-5 build, right click remove, space pause. Everything else is in HELP.md . Known limitations I’m a solo dev, so some things aren’t finished. The full list is in the README. Hope you enjoy it!", "repo": "https://github.com/thijmenb1/roadbalencer", "demo": "https://github.com/thijmenb1/SupplyChains/releases/tag/v0.1.3"}]...
|
[{"post_id": 80746, "ts": "202 [{"post_id": 80746, "ts": "2026-10-18T18:11:49Z", "hours": 6.7261, "text": "Devlog 27: Tutorial: After feadback I have dicided to make a tutorial and made a couple quality of live updates that made the game easier to understand."}, {"post_id": 76500, "ts": "2026-10-03T19:24:02Z", "hours": 16.3356, "text": "Devlog 26: Last devlog I’ve officially finished the game. It’s been an incredible journey, and I’m pretty happy with the end result. excavator The excavator is now fully functional. You can use it to create mines, which automatically convert into factories once placed. a lot of small things I have done a lot of small things to optimse the game and fix things i coudend test till now Release This is the last devlog I’ll be writing for this project. I want to thank you all for the support. I hope you enjoy playing the game."}, {"post_id": 75365, "ts": "2026-09-29T21:04:49Z", "hours": 9.8742, "text": "Devlog 25: Planes and saving! I’ve locked in over the last 2 days and finished the final 2 of the 3 major systems. I’ve completed the planes (which now spawn when you accept an order) and finished the saving system. Planes/order system I’ve finished the order system, when you accept an order, a plane now spawns a couple thousand pixels out. It flies to the airstrip, loads up at the end of the runway, turns around, and flies away. It doesn’t taxi all the way to the terminal because I just don’t have time for that, but it looks good enough for now. Saving You can now save 3 worlds in the game. Everything gets encrypted and saves all the world values. It was pretty difficult converting some of the arrays filled with instances into dictionaries and back again, but it works on both PC and on the web. whats left: The only things left are the excavator and some smaller things. I’m finishing that all tomorrow, and that will be the last devlog for my ship. The main gameplay loop should be finished by end of day tomorrow. If I can’t finish everything, so be it, I dont have time to work on it anymore if I also want to continu in third space, but I’m happy with how it works now and what I have learned along the way."}, {"post_id": 74558, "ts": "2026-09-27T17:07:31Z", "hours": 10.1058, "text": "Devlog 24: Construction finished and start secunce made I’ve finished the construction system and made the start sequence actually playable by adding a resource box containing 10 iron bars needed to build a terminal. It’s been 2 weeks since my last devlog school and commitments to Third Space have kept me busier, so I’m not 100% certain I’ve captured everything that’s changed. Construction system The construction system now generates building routes that you can assign vehicles to. Resources must be delivered to a building site before construction begins, making the resource system meaningful in actual gameplay. Starting secunce The starting secunce now has a couple of steps: Place the resource box Place a runway Place a terminal Conect the runway with the terminal with a taxiway Place 4 base tiles for the vehicle to spawn on What has to be done: Mine/excavator system ~3h Finish trade system ~3h Save system ~2h Documentation ~2h"}, {"post_id": 67659, "ts": "2026-09-13T20:19:08Z", "hours": 10.0428, "text": "Devlog 23: Vehicle pathfinding and construction I have fixed the vehicle pathfinding (mostly) and I have made the construction system. Vehicle pathfinding I have fixed the vehicle pathfinding and it works now mostly. I say mostly because it breaks when a trailer is equipped, but that is a way smaller thing to fix. Construction system It’s almost done. The system makes it so the resources actually have a function and you now need to deliver resources to a building site before the factory can get built. Still not done I know I said it would be done this weekend and it still isn’t, but it’s almost there. What I still have to do: The mine/excavator ~5h Finishing a couple of systems (like the construction and trade system) ~5h Make a savegame system ~5h Small things ~2h Documentation ~2h So 2 devlogs left, and otherwise I will just ship incomplete because I don’t have time anymore."}, {"post_id": 66739, "ts": "2026-09-12T17:07:44Z", "hours": 10.2911, "text": "Devlog 22: Factory UI and Finished base building I’ve finished base building and am now working on the factory UI. Factory UI I’m working on the factory UI, where you can see the factory’s storage and change its recipe. It’s almost finished. Base building Base building is finished you can now make taxiways and build a warehouse. I’ve also put these into a UI like the factory’s, so it only takes one button. Vehicle physics/pathfinding I’ve spent yet another hour on vehicle physics/pathfinding, and I’ve narrowed it down to a bug in the handoff to the prebaked paths of the factories. Timeline I’m pretty sure I am gooing tho finish it this weekend. What’s left: Vehicle physics ~3h Mines/excavators ~5h Building construction (will reuse most of the factory logic) ~2h Random bugs and small things ~5h"}, {"post_id": 65022, "ts": "2026-09-09T20:33:42Z", "hours": 9.9275, "text": "Devlog 21: Trading Finished, but I’m Stuck I’ve finished the trading system! Trading System The trading system is done. Orders are generated, you can accept them, and accepted trades show up in the UI. The only thing left is adding the planes, but that depends on finishing the base-building system first. Base Building I’ve started working on base building. It’s pretty simple and mostly uses systems that already exist, so it should only take around an hour to fully implement. Stuck Development has been going way slower than I hoped because my codebase is currently a bunch of bandaids stacked on top of each other. I also need to ship this week since Thirdspace starts next week, which means I probably won’t have time to add much polish.So I need your opinion: is it worth delaying the game for another week? 😭 Or should I just ship it? Do you think I’ll still be able to afford the Framework 13 if I release it now? My current plan is to focus on getting the core systems working, fix any major bugs, and leave extra polish and construction vehicles for a post-launch update."}, {"post_id": 62429, "ts": "2026-09-05T19:31:29Z", "hours": 9.9097, "text": "Devlog 20: UI and Trading Got the backend for the trading system done and overhauled the UI to go with it. Trading System I made a trading system. It generates contracts with the recipient’s name, the resource being traded, and the price. Basically the foundation for the aircraft system. UI Redesigned the time and date display because it looked kinda rough. Also switched the economy back to money instead of the resource, makes way more sense for trading. Oh, and vehicles now actually speed up when you speed up time, which is pretty cool. What’s Shipping vs Later I’m not including construction vehicles in the initial release because that’s like 40+ more hours of work and I want to actually finish this before Thirdspace starts (I’m gonna compete too). So yeah, that’s going to a post-launch update. Still gotta do: Get the excavators working (mines) ~5h Finish the trading system ~3h Fix vehicle physics again 😭~5h Random bugs and polish ~5h Hope I can get that done this week. Tryna hit at least 14sd/h so I can hopfuly buy that Framework 13 lol"}, {"post_id": 55609, "ts": "2026-08-27T16:01:00Z", "hours": 4.3333, "text": "Devlog 19: Busy School has started again and I have been geting busy and my motivation is also not that high right now because things take alot longer and dont work like i want to. I think I will delay release to septembere 12th."}, {"post_id": 50634, "ts": "2026-08-19T21:45:22Z", "hours": 9.9061, "text": "Devlog 18: Pre-baked docking paths I’ve implemented pre-baked docking paths for factory entrances to solve some pathfinding issues with vehicle physics. Pre-baked paths The A* pathfinding system was struggling to navigate the sharp corners around factory entrances. When the trailer tried to find its own path through these tight spaces, it would instantly jackknife, not ideal. Rather than spend 50+ hours refining the vehicle physics, I decided to pre-bake specific docking paths to each factory. It’s not a perfect solution visually, but it’s functional and gets the job done. I can always refine this for a post-launch update if needed. I’m still wrapping up the final details of the docking path system before moving on. Mines My next major task is implementing mine logic, which includes the excavator logic and ore detection and depletion. Aircraft After the mining logic I will add the last vital gameplay system the aircraft system which will be responsible trade and contracts with other villages. Release I’m currently deciding whether to push construction vehicle implementation to a post-beta update or delay the release by a week to include them. Construction vehicles aren’t vital to core gameplay, but they would add a lot of polish. I’m still on the fence about this one, it depends on how the mine logic implementation goes."}, {"post_id": 49170, "ts": "2026-08-17T20:13:08Z", "hours": 9.9731, "text": "Devlog 17: Factory placement I’ve built a system for placing factories in the world. Factory placement Turns out it’s an absolute pain in the ass to place objects that are multiple tiles big while also having them connect to multiple Godot terrains. So I had to write a whole system that places every tile separately and keeps track of which tiles are occupied. Roads I also had to rework how roads are placed. Originally, every road type was its own terrain, but that doesn’t work if you want them all to connect to factories and to each other. So now they’re all just one terrain, and a script gives each tile the correct color for its road type. This only works because all the road types are identical in shape just different colors. Aircraft sprites I’ve added several new aircraft sprites: the Bo 105, the Twin Otter, the PC-6, and the H225. I’m planning to add the Chinook and the A400M next, which will round out the aircraft lineup for the beta launch. Release It’s going to be close. I’m not sure I’ll hit my self-imposed deadline, since some things took a lot longer than expected but I might still make it. Either way, I’m not going to rush it. I’d rather ship a week late than release something that gets 5 SD/h because it isn’t polished."}, {"post_id": 47570, "ts": "2026-08-15T15:24:06Z", "hours": 9.8719, "text": "Devlog 16: Factorys and aircraft I’ve reworked the factory sprites and added aircraft. Factory sprites I have made new sprites for every factory execpt the concrete mixing plant. the sprites are now 2x2 or larger so vehicles can realisticly unload there. Aircraft I’ve decided to add aircraft, which will serve as a trading terminal so you can trade with other villages, get contracts, and earn money. Aircraft fit well for this since no other villages spawn in the world. they let you trade with other vilages without them needing to exist in the world. I still need to add alot to make this work but currently I have a working runway building mecanic Next: Factories Next, I still need to build out the factory logic. I plan to make them with custom resources, just like vehicles. I made the new sprites first because I needed to know where (un)loading would need to happen before I could design the logic around it."}, {"post_id": 46516, "ts": "2026-08-13T19:56:21Z", "hours": 10.2989, "text": "Devlog #15: Vehicle rework I’ve completely restructured how vehicles work under the hood. The main goal was to break down the code into readable, reusable pieces. Vehicle componentization The vehicle script had become too large to work with, so I split it into five scripts: vehicleBody.gd , drivetrainComponent.gd , path_movement_component.gd , CargoComponent.gd and attachment_component.gd . This makes the code easier to maintain and reduces the chance of bugs when adding new vehicle types. Vehicle data I have converted the nested Dictionaries into custom resources which makes it easier to add vehicles and less error prone. Pathfinding improvements I tweaked how the pathfinding works by chamfering the corners so vehicles navigate them more smoothly. It doesn’t look quite as I want yet, but combined with animations, it should look acceptable for now. This is something I’ll have to find a more permanent solution for later. Release I’m targeting version 1.0.0 for Saturday, August 22nd. There’s still quite a bit to do, but I think I can make it. I set this deadline because I’ll have less time once school starts."}, {"post_id": 45126, "ts": "2026-08-11T12:41:38Z", "hours": 9.745, "text": "Devlog #14.2: Route system The route system is now done Route sytem The route system turned out to be more complicated than initially expected. I restructured it so the route is calculated centrally in the Global script, and every instance using it reads from there. This keeps things synchronized and maintainable. For now, the system has one mode implemented: a ping-pong mode where vehicles travel back and forth between two set points. Vehicle physics There’s a persistent issue with vehicle physics where they cut corners and miss checkpoints, requiring them to turn around. I’ve set this aside for now to focus on other features, but it’s something I’ll need to fix down the line. I realy have no idea how though I cant seem to find the issue. Whats next The last major things before release are: Linking factories to vehicles so they can load and unload cargo Animating the excavators at the mine Building out the construction system"}, {"post_id": 43506, "ts": "2026-08-08T20:31:23Z", "hours": 10.0922, "text": "Devlog #14: Route UI and system I am currently working on the route ui and the route system. Route UI The route UI is almost done I only need to link it to the route system. Route system I am almost finished with the route system I only have to connect it to the vehicle and rewrite the factory system a bit so it works with the route system. there will be multiple modes distribution of one factory based on demand or a ping pong mode where it drives back and forward between 2 set points. You also will be able to assign vehicles to construction projects but this will come later. Trailer UI The trailer UI is finised you can connect trailers to vehicles via it."}, {"post_id": 41554, "ts": "2026-08-05T20:48:09Z", "hours": 9.8542, "text": "Devlog #13: Vehicles in the world I’ve connected the vehicle systems to the world and to the UI. Vehicle manager I’ve made a vehilce manager script. This manager stores and retrieves vehicle data efficiently by ID, making it easy for the UI and other systems to access vehicle information. Vehicle UI I’ve made a UI where you can see the fuel, total weigth, health and engine load of the vehicle by clicking on it. There are also 2 buttons 1 for selecting a route and the other for coupling a trailer. Spauwing When you buy a vehicle it gets assigned a base tile you now need a base tile per vehicle. Last things Next, I need to implement the route selection and trailer coupling buttons to complete the vehicle system integration as far as I can right now."}, {"post_id": 40212, "ts": "2026-08-03T16:52:56Z", "hours": 10.0389, "text": "Devlog #12: Planing I’ve put together a roadmap for the rest of development. Roadmap I’m planning to release the game in 3 weeks and have laid out a plan accordingly. Vehicle physics I’ve spent about half my time since the last devlog tweaking vehicle physics, and I’ve decided to compromise on a few things — for example, when the trailer jackknifes and gets stuck, it’ll just clip through the vehicle. Shop rework I am almost finished with reworking the shop it now displays all the stats that the vehicle uses"}, {"post_id": 38143, "ts": "2026-07-31T11:37:38Z", "hours": 9.9372, "text": "Devlog #11.2: Trailer Logic and Pathfinding I’ve almost finished all the vehicle logic. Pathfinding A working pathfinding system is now in place using AStarGrid2D . This system works with vehicles both with and without trailers, and handles both on-road and off-road navigation. Trailers Trailers can now couple to vehicles with the correct hitch and follow them around in a realistic manner. The coupling mechanics work as they would in real life. Finishing Touches The vehicle logic still needs some fine-tuning, and I haven’t tested it yet with every vehicle type. I still need to implement the articulation system for the articulated dump truck."}, {"post_id": 37056, "ts": "2026-07-29T15:06:21Z", "hours": 9.8997, "text": "Devlog #11: Vehicle logic I am currently working on the vehcile logic Vehicle logic There are alot of variables now that determain the behavier off the vehicles like engine and weight Sprite scaling I have fixed the scaling of the sprites. Last things for the vehicle logic I still need to implement the trailer logic and pathfinding."}, {"post_id": 35794, "ts": "2026-07-27T13:37:20Z", "hours": 8.4642, "text": "Devlog #10: Factory logic Just returnt from vacation, and i forgot to make a devlog before i went so i dont fully know anymore what i changed. Factory logic I have implemented the core factory system. Factories can now receive resources, process them and output the procesed resource. I haven’t fully tested the logic yet since the UI and vehicle systems ( needed for input/output) aren’t complete. More I have probebly done more but i dont know anymore because i have been a way for a week. What is next My next priority is implementing vehicle logic, but first i need to fix vehicle sprite scaling. Currently all vehicles are 11px wide, which makes a dump truck as wide as a car. I want to make everything a consistent scale (probably 5px = 1m) and update all sprites accordingly for a more realistic appearance."}, {"post_id": 29417, "ts": "2026-07-16T11:03:02Z", "hours": 10.1492, "text": "Devlog #9: Supplychain Been working on the supplychain structere last 2 days, including new sprites Factorys I have made new factory sprites. All sprites are new i am not realy happy with how the steel and wire mill look but the rest look prety good i think. Resources I have also added a couple new resources their are 4 resource types now: copper, coal, gold, iron. The resources spauwn in mixed vains on the map determent by a NoiseTexture2D . What next I am now gooing to work on the logic for the factorys and i want to take a nother look at shadows because the didnt work last time but i have found a otherway to do it i want to try."}, {"post_id": 28327, "ts": "2026-07-14T14:40:52Z", "hours": 9.6725, "text": "Devlog #8.1: UI and lighting Today i have been focesing on the inviorment UI I have now linked up the hole UI. In the last devlog I had already shown the ui but now it also linked up properly with the game. Day Night cycle I am currently implementation a dynamic day/night cycle. Right now, the timing and transitions aren’t lining up the way I want them to, so i still need to do some fine tuning . Shaders / shadows This is where I’ve been strugeling. I’ve been trying to figure out how to implement proper 2D shadows. The issue is that the built in directional shadows in Godot aren’t really designed for top-down games. They make the sun’s shadows look infinitely long and completely distort the perspective. Every custom solution I’ve tried so far looks terrible. I’ve easily spent about 5 hours making custom shaders making a static shadow, but I’m still stuck. If you have any experience with top down 2D lighting or custom shadow shaders in Godot, please let me know in the comments! I could really use some help right now. The biggest problem is that the fastNoiseLite texture doesnt calculate the same in the shader as via the cpu which is also the thing that is hindering me in the ovelays."}, {"post_id": 27357, "ts": "2026-07-12T21:00:50Z", "hours": 9.8522, "text": "Devlog #8: Made UI Been working on the UI this weekend. its nothing special yet but it is good enough for now. Garage menu I have made a menu where you can see all your vehicles. It is pretty simple but i need it for programming the vehicles. Shop UI I have made a shop ui where you can buy the actual vehicles. The are sorted by type. You can see the stats and capabilities and you can decide if you want to buy the vehicles or if you want to finance it. Exstended selected tile UI I have also made some improvments and additions to the selected tile ui, you can now choose a variant if the selceted tiles has them like the factory. You can also see what number is connected to what if you hover over the ui. Overlay I am also working on a overlay so you can see the height, temperature and humidity I am doing this with a shader but it is not working how i expected at the moment because the shader doesn’t line up with my terrain."}, {"post_id": 26555, "ts": "2026-07-11T13:18:41Z", "hours": 5.2389, "text": "Devlog #7: Fresh foundation As i mentioned in devlog #6, i am rebuilding the game in godot. I am almost done with the essentials and development has already almost doubled in speed. World generation I have build a biome system using three noise textures to determine temperature, altitude, and humidity. Each tile uses these values to determine which biome gets drawn. This means the world has natural variation and will hopefully look less boring. It also sets up the foundation for biome specific resources and mechanics down the line forcing players to make a bigger network. Road placement System You can now place roads this works with terrainSets which makes it easyer to draw roads. Roads are the only thing you can place for now. Vehicle Pathfinding I’ve also made a simple pathfinding script using the built-in NavigationAgent2D. The destinations are hardcoded for now. I’ve heard AStarGrid2D might be better suited for grid-based pathfinding in my case, so I’ll be researching how to implement that. What i still have to add Before I’m back where I was with the Greenfoot version, I still need to add: The factorys and their system The trailers physics The garage menu A couple small things"}, {"post_id": 25816, "ts": "2026-07-10T08:51:36Z", "hours": 9.5967, "text": "devlog #6.1 Terrain I am almost finnished with the prosidural generation of the map which is gooing to make for way more variation in the game and beter planing were to place youre base."}, {"post_id": 24611, "ts": "2026-07-08T10:10:39Z", "hours": 31.0889, "text": "Develog #6: switching engines Spent the last week trying to fix the UI and physics in Greenfoot, and honestly? It’s just not happening. Greenfoot wasn’t really built for games like this the UI support is basically non-existent, and getting clickable buttons to work properly is way more of a pain than it should be. And i decided it was no longer wordt fighting for. So I’m switching to Godot. I’ve made some prototypes in it before, so at least I know the basics, and it’s way better suited for what I’m trying to build. The downside is development is gonna be paused for about a week while I set everything back up and rewrite some stuff. But after that? Should be able to move way faster, which will hopefully make up for the lost time."}, {"post_id": 20941, "ts": "2026-07-02T17:53:03Z", "hours": 21.3453, "text": "Devlog #5: Major System Overhaul—Resource Economy & Vehicle Expansion it has been a bit since my last devlog i have some major changes this version. It is nowhere near done yet but it is almost playable. here is what changed: Added two new resources I have added sand and gravel that are used in multiple new recipes Changed the economy: from currency to resources I got rid of the money system because it gave the ability of players just focusing on one resource. Now players need to use all the resources like iron ore, copper ore, sulfer ore, sand, gravel and many more. You have to mine all resources and process them This forces the player to actually spent time making a supplychain with diffrent mines and factories. This way it feels less as a idle and more like a managing game. Added new factories I have added new factories using the factory system i made last time these factories all require two or more inputs. Some factories make concrete from gravel and sand, others make PCBs and other compilicated stuff. I plan to add more in the future but for now it is way beter than before. Added a bunch of vehicles I have added multiple new vehicles: Bulk carriers - Can move ore and loose materials Flatbed trucks - Move finished products (pallets ore IBCs) Trailers - These can attach to diffrent vehicles and extend capacity Concrete truck - Transports concrete Construction Vehicles Dozer - Removes the building Excavator - Now needed for quarries Asphalt Paver - Changes roads from gravel to asphalt I am planing to add more construction vehicles so that every building needs a construction vehicle to build instead of the building just appearing out of nowere. Rebuilt the UI The old ui didnt fit anymore there where to many tiles and the route tab did not support construction equipment, so i made a new tile ui that groupes the tiles in road, factory and mines. I have also made a new vehicle ui which i call the garage this shows The vehicles you own The vehicle shop The abilities of the vehicle: It can hook a trailer It can carry bulk cargo It can carry flatbed cargo It can go offroad It can destroy building It can pave roads It can mine it’s way better than before but you currently cant buy the vehicles yet Roads have levels now Roads can be upgraded: gravel -> cement -> asphalt. Gravel roads are cheap but slow, asphalt is fast but expensive. Upgrading is expensive but can speed up your production or reduce the number of vehicles required to keep the factory full. The road level doesnt effect offroad vehicles and some vehicles may get a max speed in the futer What i still need to do It is the same as last time because i had to many new ideas and no motivation to implent mutch backend stuff Levels / progresion - It is just a sand box now Beter end goal - There is not realy a endgoal A tutorial - The game becomes increasingly complicated so hard without any guidance"}, {"post_id": 13898, "ts": "2026-06-22T19:41:09Z", "hours": 3.8419, "text": "Devlog #4 Finised the factory system Finised the factory ui / recipie ui that now tracks input output and procesing time Added new sprites for the vehicles now have 2 types a dumptruck form the drill and a flatbed to the sellpoint Stil need to add Change detection system Levels / progresion Beter end goal A tutorial Known bugs When you edit the route it deletes it self When you delete a route it doesnt delete the vehicles"}, {"post_id": 12159, "ts": "2026-06-19T21:21:22Z", "hours": 3.4008, "text": "Devlog #3 Added a factory system it is not fully done but there is a basic factory system now so you cant just infinatly take recources from the factroy to the sell point"}, {"post_id": 7675, "ts": "2026-06-12T20:25:33Z", "hours": 12.4575, "text": "Devlog #2 Finshed the game I have finnished the main gameplay loop I still want to add: A tutorial Levels / Progresion More recources and factorys / recipes Better end goal there is nothing to save for right now failsave for when you delete the path with vehicle on it"}, {"post_id": 4420, "ts": "2026-06-07T18:55:50Z", "hours": 1.8458, "text": "Devlog #1 I have made some improvements on the game i am curently making in greenfoot (java engine) i am using this engine because i have used it before for school"}]...
|
Title: SupplyChains by @Thijmen | Stardance
Devlo Title: SupplyChains by @Thijmen | Stardance
Devlogs:
Devlog #1 I have made some improvements on the game i am curently making in greenfoot (java engine) i am using this engine because i have used it before for school
Devlog #2 Finshed the game I have finnished the main gameplay loop I still want to add: A tutorial Levels / Progresion More recources and factorys / recipes Better end goal there is nothing to save for right now failsave for when you delete the path with vehicle on it
Devlog #3 Added a factory system it is not fully done but there is a basic factory system now so you cant just infinatly take recources from the factroy to the sell point
Devlog #4 Finised the factory system Finised the factory ui / recipie ui that now tracks input output and procesing time Added new sprites for the vehicles now have 2 types a dumptruck form the drill and a flatbed to the sellpoint Stil need to add Change detection system Levels / progresion Beter end goal A tutorial Known bugs When you edit the route it deletes it self When you delete a route it doesnt delete the vehicles
Devlog #5: Major System Overhaul—Resource Economy & Vehicle Expansion it has been a bit since my last devlog i have some major changes this version. It is nowhere near done yet but it is almost playable. here is what changed: Added two new resources I have added sand and gravel that are used in multiple new recipes Changed the economy: from currency to resources I got rid of the money system because it gave the ability of players just focusing on one resource. Now players need to use all the resources like iron ore, copper ore, sulfer ore, sand, gravel and many more. You have to mine all resources and process them This forces the player to actually spent time making a supplychain with diffrent mines and factories. This way it feels less as a idle and more like a managing game. Added new factories I have added new factories using the factory system i made last time these factories all require two or more inputs. Some factories make concrete from gravel and sand, others make PCBs and other compilicated stuff. I plan to add more in the future but for now it is way beter than before. Added a bunch of vehicles I have added multiple new vehicles: Bulk carriers - Can move ore and loose materials Flatbed trucks - Move finished products (pallets ore IBCs) Trailers - These can attach to diffrent vehicles and extend capacity Concrete truck - Transports concrete Construction Vehicles Dozer - Removes the building Excavator - Now needed for quarries Asphalt Paver - Changes roads from gravel to asphalt I am planing to add more construction vehicles so that every building needs a construction vehicle to build instead of the building just appearing out of nowere. Rebuilt the UI The old ui didnt fit anymore there where to many tiles and the route tab did not support construction equipment, so i made a new tile ui that groupes the tiles in road, factory and mines. I have also made a new vehicle ui which i call the garage this shows The vehicles you own The vehicle shop The abilities of the vehicle: It can hook a trailer It can carry bulk cargo It can carry flatbed cargo It can go offroad It can destroy building It can pave roads It can mine it’s way better than before but you currently cant buy the vehicles yet Roads have levels now Roads can be upgraded: gravel -> cement -> asphalt. Gravel roads are cheap but slow, asphalt is fast but expensive. Upgrading is expensive but can speed up your production or reduce the number of vehicles required to keep the factory full. The road level doesnt effect offroad vehicles and some vehicles may get a max speed in the futer What i still need to do It is the same as last time because i had to many new ideas and no motivation to implent mutch backend stuff Levels / progresion - It is just a sand box now Beter end goal - There is not realy a endgoal A tutorial - The game becomes increasingly complicated so hard without any guidance
Develog #6: switching engines Spent the last week trying to fix the UI and physics in Greenfoot, and honestly? It’s just not happening. Greenfoot wasn’t really built for games like this the UI support is basically non-existent, and getting clickable buttons to work properly is way more of a pain than it should be. And i decided it was no longer wordt fighting for. So I’m switching to Godot. I’ve made some prototypes in it before, so at least I know the basics, and it’s way better suited for what I’m trying to build. The downside is development is gonna be paused for about a week while I set everything back up and rewrite some stuff. But after that? Should be able to move way faster, which will hopefully make up for the lost time.
devlog #6.1 Terrain I am almost finnished with the prosidural generation of the map which is gooing to make for way more variation in the game and beter planing were to place youre base.
Devlog #7: Fresh foundation As i mentioned in devlog #6, i am rebuilding the game in godot. I am almost done with the essentials and development has already almost doubled in speed. World generation I have build a biome system using three noise textures to determine temperature, altitude, and humidity. Each tile uses these values to determine which biome gets drawn. This means the world has natural variation and will hopefully look less boring. It also sets up the foundation for biome specific resources and mechanics down the line forcing players to make a bigger network. Road placement System You can now place roads this works with terrainSets which makes it easyer to draw roads. Roads are the only thing you can place for now. Vehicle Pathfinding I’ve also made a simple pathfinding script using the built-in NavigationAgent2D. The destinations are hardcoded for now. I’ve heard AStarGrid2D might be better suited for grid-based pathfinding in my case, so I’ll be researching how to implement that. What i still have to add Before I’m back where I was with the Greenfoot version, I still need to add: The factorys and their system The trailers physics The garage menu A couple small things
Devlog #8: Made UI Been working on the UI this weekend. its nothing special yet but it is good enough for now. Garage menu I have made a menu where you can see all your vehicles. It is pretty simple but i need it for programming the vehicles. Shop UI I have made a shop ui where you can buy the actual vehicles. The are sorted by type. You can see the stats and capabilities and you can decide if you want to buy the vehicles or if you want to finance it. Exstended selected tile UI I have also made some improvments and additions to the selected tile ui, you can now choose a variant if the selceted tiles has them like the factory. You can also see what number is connected to what if you hover over the ui. Overlay I am also working on a overlay so you can see the height, temperature and humidity I am doing this with a shader but it is not working how i expected at the moment because the shader doesn’t line up with my terrain.
Devlog #8.1: UI and lighting Today i have been focesing on the inviorment UI I have now linked up the hole UI. In the last devlog I had already shown the ui but now it also linked up properly with the game. Day Night cycle I am currently implementation a dynamic day/night cycle. Right now, the timing and transitions aren’t lining up the way I want them to, so i still need to do some fine tuning . Shaders / shadows This is where I’ve been strugeling. I’ve been trying to figure out how to implement proper 2D shadows. The issue is that the built in directional shadows in Godot aren’t really designed for top-down games. They make the sun’s shadows look infinitely long and completely distort the perspective. Every custom solution I’ve tried so far looks terrible. I’ve easily spent about 5 hours making custom shaders making a static shadow, but I’m still stuck. If you have any experience with top down 2D lighting or custom shadow shaders in Godot, please let me know in the comments! I could really use some help right now. The biggest problem is that the fastNoiseLite texture doesnt calculate the same in the shader as via the cpu which is also the thing that is hindering me in the ovelays.
Devlog #9: Supplychain Been working on the supplychain structere last 2 days, including new sprites Factorys I have made new factory sprites. All sprites are new i am not realy happy with how the steel and wire mill look but the rest look prety good i think. Resources I have also added a couple new resources their are 4 resource types now: copper, coal, gold, iron. The resources spauwn in mixed vains on the map determent by a NoiseTexture2D . What next I am now gooing to work on the logic for the factorys and i want to take a nother look at shadows because the didnt work last time but i have found a otherway to do it i want to try.
Devlog #10: Factory logic Just returnt from vacation, and i forgot to make a devlog before i went so i dont fully know anymore what i changed. Factory logic I have implemented the core factory system. Factories can now receive resources, process them and output the procesed resource. I haven’t fully tested the logic yet since the UI and vehicle systems ( needed for input/output) aren’t complete. More I have probebly done more but i dont know anymore because i have been a way for a week. What is next My next priority is implementing vehicle logic, but first i need to fix vehicle sprite scaling. Currently all vehicles are 11px wide, which makes a dump truck as wide as a car. I want to make everything a consistent scale (probably 5px = 1m) and update all sprites accordingly for a more realistic appearance.
Devlog #11: Vehicle logic I am currently working on the vehcile logic Vehicle logic There are alot of variables now that determain the behavier off the vehicles like engine and weight Sprite scaling I have fixed the scaling of the sprites. Last things for the vehicle logic I still need to implement the trailer logic and pathfinding.
Devlog #11.2: Trailer Logic and Pathfinding I’ve almost finished all the vehicle logic. Pathfinding A working pathfinding system is now in place using AStarGrid2D . This system works with vehicles both with and without trailers, and handles both on-road and off-road navigation. Trailers Trailers can now couple to vehicles with the correct hitch and follow them around in a realistic manner. The coupling mechanics work as they would in real life. Finishing Touches The vehicle logic still needs some fine-tuning, and I haven’t tested it yet with every vehicle type. I still need to implement the articulation system for the articulated dump truck.
Devlog #12: Planing I’ve put together a roadmap for the rest of development. Roadmap I’m planning to release the game in 3 weeks and have laid out a plan accordingly. Vehicle physics I’ve spent about half my time since the last devlog tweaking vehicle physics, and I’ve decided to compromise on a few things — for example, when the trailer jackknifes and gets stuck, it’ll just clip through the vehicle. Shop rework I am almost finished with reworking the shop it now displays all the stats that the vehicle uses
Devlog #13: Vehicles in the world I’ve connected the vehicle systems to the world and to the UI. Vehicle manager I’ve made a vehilce manager script. This manager stores and retrieves vehicle data efficiently by ID, making it easy for the UI and other systems to access vehicle information. Vehicle UI I’ve made a UI where you can see the fuel, total weigth, health and engine load of the vehicle by clicking on it. There are also 2 buttons 1 for selecting a route and the other for coupling a trailer. Spauwing When you buy a vehicle it gets assigned a base tile you now need a base tile per vehicle. Last things Next, I need to implement the route selection and trailer coupling buttons to complete the vehicle system integration as far as I can right now.
Devlog #14: Route UI and system I am currently working on the route ui and the route system. Route UI The route UI is almost done I only need to link it to the route system. Route system I am almost finished with the route system I only have to connect it to the vehicle and rewrite the factory system a bit so it works with the route system. there will be multiple modes distribution of one factory based on demand or a ping pong mode where it drives back and forward between 2 set points. You also will be able to assign vehicles to construction projects but this will come later. Trailer UI The trailer UI is finised you can connect trailers to vehicles via it.
Devlog #14.2: Route system The route system is now done Route sytem The route system turned out to be more complicated than initially expected. I restructured it so the route is calculated centrally in the Global script, and every instance using it reads from there. This keeps things synchronized and maintainable. For now, the system has one mode implemented: a ping-pong mode where vehicles travel back and forth between two set points. Vehicle physics There’s a persistent issue with vehicle physics where they cut corners and miss checkpoints, requiring them to turn around. I’ve set this aside for now to focus on other features, but it’s something I’ll need to fix down the line. I realy have no idea how though I cant seem to find the issue. Whats next The last major things before release are: Linking factories to vehicles so they can load and unload cargo Animating the excavators at the mine Building out the construction system
Devlog #15: Vehicle rework I’ve completely restructured how vehicles work under the hood. The main goal was to break down the code into readable, reusable pieces. Vehicle componentization The vehicle script had become too large to work with, so I split it into five scripts: vehicleBody.gd , drivetrainComponent.gd , path_movement_component.gd , CargoComponent.gd and attachment_component.gd . This makes the code easier to maintain and reduces the chance of bugs when adding new vehicle types. Vehicle data I have converted the nested Dictionaries into custom resources which makes it easier to add vehicles and less error prone. Pathfinding improvements I tweaked how the pathfinding works by chamfering the corners so vehicles navigate them more smoothly. It doesn’t look quite as I want yet, but combined with animations, it should look acceptable for now. This is something I’ll have to find a more permanent solution for later. Release I’m targeting version 1.0.0 for Saturday, August 22nd. There’s still quite a bit to do, but I think I can make it. I set this deadline because I’ll have less time once school starts.
Devlog 16: Factorys and aircraft I’ve reworked the factory sprites and added aircraft. Factory sprites I have made new sprites for every factory execpt the concrete mixing plant. the sprites are now 2x2 or larger so vehicles can realisticly unload there. Aircraft I’ve decided to add aircraft, which will serve as a trading terminal so you can trade with other villages, get contracts, and earn money. Aircraft fit well for this since no other villages spawn in the world. they let you trade with other vilages without them needing to exist in the world. I still need to add alot to make this work but currently I have a working runway building mecanic Next: Factories Next, I still need to build out the factory logic. I plan to make them with custom resources, just like vehicles. I made the new sprites first because I needed to know where (un)loading would need to happen before I could design the logic around it.
Devlog 17: Factory placement I’ve built a system for placing factories in the world. Factory placement Turns out it’s an absolute pain in the ass to place objects that are multiple tiles big while also having them connect to multiple Godot terrains. So I had to write a whole system that places every tile separately and keeps track of which tiles are occupied. Roads I also had to rework how roads are placed. Originally, every road type was its own terrain, but that doesn’t work if you want them all to connect to factories and to each other. So now they’re all just one terrain, and a script gives each tile the correct color for its road type. This only works because all the road types are identical in shape just different colors. Aircraft sprites I’ve added several new aircraft sprites: the Bo 105, the Twin Otter, the PC-6, and the H225. I’m planning to add the Chinook and the A400M next, which will round out the aircraft lineup for the beta launch. Release It’s going to be close. I’m not sure I’ll hit my self-imposed deadline, since some things took a lot longer than expected but I might still make it. Either way, I’m not going to rush it. I’d rather ship a week late than release something that gets 5 SD/h because it isn’t polished.
Devlog 18: Pre-baked docking paths I’ve implemented pre-baked docking paths for factory entrances to solve some pathfinding issues with vehicle physics. Pre-baked paths The A* pathfinding system was struggling to navigate the sharp corners around factory entrances. When the trailer tried to find its own path through these tight spaces, it would instantly jackknife, not ideal. Rather than spend 50+ hours refining the vehicle physics, I decided to pre-bake specific docking paths to each factory. It’s not a perfect solution visually, but it’s functional and gets the job done. I can always refine this for a post-launch update if needed. I’m still wrapping up the final details of the docking path system before moving on. Mines My next major task is implementing mine logic, which includes the excavator logic and ore detection and depletion. Aircraft After the mining logic I will add the last vital gameplay system the aircraft system which will be responsible trade and contracts with other villages. Release I’m currently deciding whether to push construction vehicle implementation to a post-beta update or delay the release by a week to include them. Construction vehicles aren’t vital to core gameplay, but they would add a lot of polish. I’m still on the fence about this one, it depends on how the mine logic implementation goes.
Devlog 19: Busy School has started again and I have been geting busy and my motivation is also not that high right now because things take alot longer and dont work like i want to. I think I will delay release to septembere 12th.
Devlog 20: UI and Trading Got the backend for the trading system done and overhauled the UI to go with it. Trading System I made a trading system. It generates contracts with the recipient’s name, the resource being traded, and the price. Basically the foundation for the aircraft system. UI Redesigned the time and date display because it looked kinda rough. Also switched the economy back to money instead of the resource, makes way more sense for trading. Oh, and vehicles now actually speed up when you speed up time, which is pretty cool. What’s Shipping vs Later I’m not including construction vehicles in the initial release because that’s like 40+ more hours of work and I want to actually finish this before Thirdspace starts (I’m gonna compete too). So yeah, that’s going to a post-launch update. Still gotta do: Get the excavators working (mines) ~5h Finish the trading system ~3h Fix vehicle physics again 😭~5h Random bugs and polish ~5h Hope I can get that done this week. Tryna hit at least 14sd/h so I can hopfuly buy that Framework 13 lol
Devlog 21: Trading Finished, but I’m Stuck I’ve finished the trading system! Trading System The trading system is done. Orders are generated, you can accept them, and accepted trades show up in the UI. The only thing left is adding the planes, but that depends on finishing the base-building system first. Base Building I’ve started working on base building. It’s pretty simple and mostly uses systems that already exist, so it should only take around an hour to fully implement. Stuck Development has been going way slower than I hoped because my codebase is currently a bunch of bandaids stacked on top of each other. I also need to ship this week since Thirdspace starts next week, which means I probably won’t have time to add much polish.So I need your opinion: is it worth delaying the game for another week? 😭 Or should I just ship it? Do you think I’ll still be able to afford the Framework 13 if I release it now? My current plan is to focus on getting the core systems working, fix any major bugs, and leave extra polish and construction vehicles for a post-launch update.
Devlog 22: Factory UI and Finished base building I’ve finished base building and am now working on the factory UI. Factory UI I’m working on the factory UI, where you can see the factory’s storage and change its recipe. It’s almost finished. Base building Base building is finished you can now make taxiways and build a warehouse. I’ve also put these into a UI like the factory’s, so it only takes one button. Vehicle physics/pathfinding I’ve spent yet another hour on vehicle physics/pathfinding, and I’ve narrowed it down to a bug in the handoff to the prebaked paths of the factories. Timeline I’m pretty sure I am gooing tho finish it this weekend. What’s left: Vehicle physics ~3h Mines/excavators ~5h Building construction (will reuse most of the factory logic) ~2h Random bugs and small things ~5h
Devlog 23: Vehicle pathfinding and construction I have fixed the vehicle pathfinding (mostly) and I have made the construction system. Vehicle pathfinding I have fixed the vehicle pathfinding and it works now mostly. I say mostly because it breaks when a trailer is equipped, but that is a way smaller thing to fix. Construction system It’s almost done. The system makes it so the resources actually have a function and you now need to deliver resources to a building site before the factory can get built. Still not done I know I said it would be done this weekend and it still isn’t, but it’s almost there. What I still have to do: The mine/excavator ~5h Finishing a couple of systems (like the construction and trade system) ~5h Make a savegame system ~5h Small things ~2h Documentation ~2h So 2 devlogs left, and otherwise I will just ship incomplete because I don’t have time anymore.
Devlog 24: Construction finished and start secunce made I’ve finished the construction system and made the start sequence actually playable by adding a resource box containing 10 iron bars needed to build a terminal. It’s been 2 weeks since my last devlog school and commitments to Third Space have kept me busier, so I’m not 100% certain I’ve captured everything that’s changed. Construction system The construction system now generates building routes that you can assign vehicles to. Resources must be delivered to a building site before construction begins, making the resource system meaningful in actual gameplay. Starting secunce The starting secunce now has a couple of steps: Place the resource box Place a runway Place a terminal Conect the runway with the terminal with a taxiway Place 4 base tiles for the vehicle to spawn on What has to be done: Mine/excavator system ~3h Finish trade system ~3h Save system ~2h Documentation ~2h
Devlog 25: Planes and saving! I’ve locked in over the last 2 days and finished the final 2 of the 3 major systems. I’ve completed the planes (which now spawn when you accept an order) and finished the saving system. Planes/order system I’ve finished the order system, when you accept an order, a plane now spawns a couple thousand pixels out. It flies to the airstrip, loads up at the end of the runway, turns around, and flies away. It doesn’t taxi all the way to the terminal because I just don’t have time for that, but it looks good enough for now. Saving You can now save 3 worlds in the game. Everything gets encrypted and saves all the world values. It was pretty difficult converting some of the arrays filled with instances into dictionaries and back again, but it works on both PC and on the web. whats left: The only things left are the excavator and some smaller things. I’m finishing that all tomorrow, and that will be the last devlog for my ship. The main gameplay loop should be finished by end of day tomorrow. If I can’t finish everything, so be it, I dont have time to work on it anymore if I also want to continu in third space, but I’m happy with how it works now and what I have learned along the way.
Devlog 26: Last devlog I’ve officially finished the game. It’s been an incredible journey, and I’m pretty happy with the end result. excavator The excavator is now fully functional. You can use it to create mines, which automatically convert into factories once placed. a lot of small things I have done a lot of small things to optimse the game and fix things i coudend test till now Release This is the last devlog I’ll be writing for this project. I want to thank you all for the support. I hope you enjoy playing the game.
Devlog 27: Tutorial: After feadback I have dicided to make a tutorial and made a couple quality of live updates that made the game easier to understand.
Ships:
Supply Chains Supply Chains is a game inspired by Transport Fever and Mindustry, centered around building road networks and logistics chains for construction and mining operations. Features Vehicles, trailers and a garage Route system: pick a source, a destination and a resource, then assign it to a vehicle Multi-step production chains Construction sites, trading, generated terrain, and A* pathfinding with road weights Controls: WASD camera, 1-5 build, right click remove, space pause. Everything else is in HELP.md . Known limitations I’m a solo dev, so some things aren’t finished. The full list is in the README. Hope you enjoy it!...
|
1792853836.385709
|
1792940236.385709
|
|
18497
|
Helyx by @lix | Stardance
|
lix
|
1
|
324.55
|
5177
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T22:08:55Z", "hours": 309.0, "multiplier": 19.45, "payout": 5177, "blessing": "neutral", "text": "What I made Helyx is a terminal app for Windows that keeps every local Git repository you own in one place and lets you commit, branch, resolve conflicts, repair broken repositories and answer GitHub Issues and Pull Requests without opening anything else. I spent a lot of time thinking about what kind of project I wanted to build. I wanted something that would be genuinely useful to developers in many different ways, and that is how I came up with Helyx, a TUI application that brings many Git and GitHub tasks into one place. What was challenging Learning new libraries, keeping the code organized as it grew, and designing every screen so it looks and feels as polished as I could get it. Deciding what to build next was harder than it sounds, because there was always more that could go in. What I am proud of It has everything I originally planned to include. The diagnostics screen finds what is wrong with a repository and offers the fix instead of just reporting it, the conflict resolver opens the conflicted block in its own editor, and the whole app speaks 8 languages. How to try it Download the latest release from Helyx’s GitHub and run it. It installs into your user folder and adds Helyx to your PATH , so you can start it by typing helyx in any terminal. No administrator rights are needed, and the .NET runtime is bundled inside. Then pick Add project and choose any folder that contains your project. Helyx is open source, so you can also read the code or build it yourself. Just click See source code below.", "repo": "https://github.com/lixtheyt/Helyx", "demo": "https://github.com/lixtheyt/Helyx/releases/latest"}]...
|
[{"post_id": 68799, "ts": "202 [{"post_id": 68799, "ts": "2026-09-15T19:30:38Z", "hours": 4.4892, "text": "Hackatime integration Hello there! A guy made a feature suggestion on Helyx’s GitHub, that I should add a Hackatime integration into it. So I was thinking… and thinking… and thinking and woah… I ADDED IT! It is not 1:1 like the web interface, that one is better & shows you more things but sadly this was everything that I could request from API (at least I think): Total Seconds Languages Repo URL Total Heartbeats First Heartbeat (DateTime) Last Heartbeat (DateTime) and when combining all of these information, I created a screen where you can see all of this specifically for your project. It works on the principe of authorization. You put in your Hackatime token which authorizes you and then when you go to your project and go on Hackatime Info, it prompts you to select the project from a list of projects that are assigned to your Hackatime account/token."}, {"post_id": 62263, "ts": "2026-09-05T15:31:03Z", "hours": 1.14, "text": "Fixed User Scripts bug So, every path block used Path.GetFullPath(path) instead of Path.GetFullPath(path, script.ProjectPath) . That means it was resolving relative paths against Helyx’s own directory, not your project’s. This is now fixed."}, {"post_id": 60348, "ts": "2026-09-02T17:13:41Z", "hours": 2.7431, "text": "Reviewing my codebase and fixing bugs Since all of the features that Helyx was supposed to be finished with are almost all done (maybe even all are done), I will now change my view to another projects for Stardance such as ThetaNexus . But that does not mean that now I will just forget about Helyx. I will be reviewing the codebase sometimes to find some bugs and fix them. You can help me with this, by making an Issue request on Helyx’s GitHub. So what bugs did I fix since the last devlog? I fixed line breaking in badge/status README editor. When you were inserting your badge/status into your README via Helyx’s README editor, it done… messy stuff to the README, not something like really bad what couldn’t be fixed by manually doing it, but it should now insert the badge/status exactly as you see it in the editor. I also introduced a new ‘Found state’ text instead of ‘Found’ text in IDE settings to avoid confusion. To avoid confusion because if an editor was found and you clicked on it… it wrote this: Found Found Found Not Found Found Set by user Now it writes this: Found state Found Found state Not Found Found state Set by user Most of the time, I was reviewing the codebase via Claude Code to actually check everything precisely."}, {"post_id": 56815, "ts": "2026-08-28T18:55:16Z", "hours": 1.7133, "text": "Replaced hardcoded string colors with Color members for code safety, fixed line breaking while assigning a status/badge Okay so Markup texts (those are the texts with color) were formatted in this format: \"[red]Hello World![/]\" So it was string-based. And if you accidentally added some character to it for instance: \"[redd]Hello World![/]\" <- Exception Helyx would crash. I mainly added this, because it is an open-source project. So if someone tried to edit it, they would only have to edit the string and they might have misspelled it. But now, when he goes into the codebase, he will see Color members and he just can’t misspell that, and if he would, compiler would alert him. Basically, now it is like this: $\"[{Color.Red}]Hello World![/]\" Okay so next I fixed line breaking. What does that mean? Well… In Helyx native README editor, so when you try to assign a status/badge, you’ll get that editor, when you try to add a status/badge to that line, you might have thought that it would be on the same line as the tags above it. But it didn’t… This was happening due to the comment markers for Helyx so Helyx knows where this status/badge is located and which status/badge it is. Now Helyx will put those comment markers in a way that prevents the line from breaking."}, {"post_id": 56645, "ts": "2026-08-28T14:17:12Z", "hours": 2.1092, "text": "Added GitHub Issues/PRs events rendering Originally, when you selected Manage GitHub Issues or PRs and opened some issues/PR. You could have only seen messages posted by users, but not when a label was assigned or when the issue/PR was closed. Well… Now you can! Now it displays the exact action that happened and when it happened! Of course, it is also translated to all languages that Helyx supports. Just making sure you didn’t think it wasn’t! I also cleaned up the code a little bit. Removed some useless usings and some files were in the wrong namespace, so that is fixed too."}, {"post_id": 54407, "ts": "2026-08-25T12:34:33Z", "hours": 1.2639, "text": "Edited README.md, again I was again editing the whole README.md, because reviewers weren’t happy with the current one. Well after spending another hour of editing the whole README.md file, I hope they won’t ask me to rewrite the whole README.md file again, because I don’t even know what else to add/remove/edit."}, {"post_id": 53900, "ts": "2026-08-24T16:30:00Z", "hours": 2.0894, "text": "Edited README.md I rewrote the README.md because of the ship review. I also added a couple of recommendations that are worth knowing when you use Helyx. I also removed the <summary> comments that Claude Code wrote for the documentation, I don’t think that anyone would have used them anyway."}, {"post_id": 52656, "ts": "2026-08-22T22:04:08Z", "hours": 0.4681, "text": "README.md update I replaced the title in README.md with a banner that contains the text Helyx. I tried a few versions I made and, well, I landed on the one you can see in Helyx’s README.md, or below!"}, {"post_id": 52636, "ts": "2026-08-22T21:23:40Z", "hours": 1.4575, "text": "Experimenting with the conflict solver I was thinking about adding a simpler conflict solver, where you wouldn’t have to delete the <<<<<<< , ======= and >>>>>>> markers yourself but would just pick either the first or the second version. But I realized it would be messier than I thought, so in the end I kept it as a basic editor where you remove the version you don’t want by hand."}, {"post_id": 52516, "ts": "2026-08-22T17:40:41Z", "hours": 4.2228, "text": "GitHub done, shipping Helyx today! Today I was messing with the GitHub page for Helyx, fixing the last bugs we found and working on the installer. For the installer I used Inno Setup, because it is the most recognized and the most used one. The point of using an installer is simple: it adds Helyx to PATH. Of course there were other options, but this one seemed like the best fit. We were fighting with the script for a while, because it was doing really weird things, like staying in the background after the installation finished. But those bugs are fixed now! README.md is done, all of those GIFs and screenshots are in it too, and I have to say it looks really good! I was also setting up the GitHub side of things, so the description, the tags, a GitHub Action and so on. With the help of Claude Code, we created the logo and the banner for the installer as well. The installer uses the same logo as Helyx. It’s just a basic H, because nothing else came to mind haha. I also asked Claude Code to review the codebase one last time, and yep, it looks fine! I told it to add the basic documentation comments as well, the <summary> kind. Let’s be real here, nobody does this, and if they do, something else writes it for them, usually an AI, because it understands the function better than the person who wrote it (I know that from my own experience hahaha)."}, {"post_id": 51969, "ts": "2026-08-21T23:29:24Z", "hours": 9.8508, "text": "New features, new languages, new problems. A new feature that I added is GitHub Actions! It is on the same principle as Manage Issues and Manage PRs, so you have a list of GitHub Actions, you pick one and you can control it, check its log, observe information about it. You can even run an action! I also added a refresh keybind to Manage Issues, Manage PRs and GitHub Actions. Before, you had to go back from the details of an issue/PR/action to the list and then return to the details. Now you don’t have to. You just have to press the keybind displayed in the footer that belongs to refresh. Yes! The Helyx Language System is finally complete! Italian & Portuguese are now available in Helyx! Lately I’ve been working on the README.md file. I was mainly making more GIFs & designing screenshots for it so it will look pretty and futuristic (in my opinion)! As I have mentioned in the title, NEW… PROBLEMS! People… you won’t believe what happened to me today… I use Helyx’s Git & GitHub for testing, so there is no official one yet, and I rarely commit changes or push them. Only when I test something. And it looks like it got back at me. Well… I told Claude Code to remove comments all over my codebase, because they were mainly scrapped code and some temporary information that I had there, that wasn’t used anymore. Okay, so I told it to remove them, and for some reason instead of removing comments, it deleted Helyx’s whole codebase. Thank god README.md was untouched haha. We had to decompile the .dll that was left over from testing Helyx’s latest version, and actually check the diff and rewrite it. We still don’t know if everything was brought back since for some reason Claude Code’s memory got wiped instantly when it realized that it deleted my whole codebase. There were no backups, no restore, no nothing. The only possible thing was to use the forgotten stash that I created and use the .dll as a map to restore Helyx’s outdated codebase and rewrite it again. So that’s what we did. Yeah, so I hope everything was brought back. Claude says it was, but after what it has done I don’t know if I trust it. Just kidding, everything should be back, because it compared the .dll with the rewritten code 1:1 and everything matched."}, {"post_id": 51403, "ts": "2026-08-21T02:37:22Z", "hours": 10.1656, "text": "More bugs fixed, new functions, README & Language System updates! Hello guys, once again at 4 AM! Bugs: As the title says, there are more fixed bugs. Diagnostics crashed Helyx if you ran a rebase in a terminal and hit a conflict. Now it doesn’t! Another fixed bug is that when you opened an issue in Helyx, the footer vanished. At first I was shocked, but it was a simple fix so now your footer doesn’t vanish. Another vanishing bug! The Languages row from the header vanished when you entered a tab where Layout class was being used. Now you will see your sweet programming languages used in your selected project. Guess what! Another vanishing bug! This time the whole header vanished when you exited .Live()! Now it is okay! New behaviour: I unified some color codes with some type of info. E.g. SHA is Dark Orange everywhere, Stash is Yellow, Date is Cadet Blue and Issue Number is Aqua. The README.md editor, when inserting badges/status now has a new keybind: backspace! It is different from DEL! DEL deletes the badges/status but backspace deletes the whole line, including the badge/status that was on that line. README The README is almost done! At least I hope! Claude was a big help here, because I wanted to create an insane README and we really did. Guys, you should be excited about the README file haha! Language System Translations for these languages are already done: English French German Russian Slovak Spanish So basically every language translation is already done. BUT I decided to add even more languages! The new languages that Helyx will support are: Italian Portuguese"}, {"post_id": 50335, "ts": "2026-08-19T14:33:20Z", "hours": 8.0847, "text": "Languages almost done, moving onto GitHub & README.md Well guys, Language System is almost done. It is powered by a Resources file that stores all of the translated strings. More bugs were found! But now, all of the bugs should be fixed with also many failsafes! Now, I want to complete the Language System because I am really close to finishing it. I also want to make the README.md for Helyx’s GitHub Repository. Originally I wanted to make it via Obsidian app, but it doesn’t have direct support for Wakatime, so I have to use VS 2026 native Markdown editor with the support of Markdown Editor v2 extension from Mads Kristensen. (not sponsored lol) I also heard that Obsidian app doesn’t use the same Markdown as GitHub does so there would be some things mistyped or not even rendered, but VS 2026 should be fully compatible with GitHub’s Markdown renderer, so we will see!"}, {"post_id": 49506, "ts": "2026-08-18T11:50:08Z", "hours": 6.5236, "text": "Fixing more bugs I fix bugs mainly with use of Claude Code, because hunting for bugs is not easy and this project is not a small one haha. I had to run MANY code review tools for this, because every time it kept finding new bugs. No idea how but it did. So what we fixed? If a GitHub comment had bold text split across two lines, opening that issue crashed Helyx before it drew anything. A file with a square bracket in its name (e.g. data[1].json) crashed Status, Diff, Commit, Stashes and Log. If anything held config.json open for even a moment, Helyx assumed it was corrupt, reset it, then crashed everywhere that looked for a project. If config.json was missing its Badges section, the startup migration quietly deleted every badge from every project. Committing saved a copy of the project taken before the confirmation prompts, so anything changed in between was silently thrown away. If you linked a GitHub repo during Push, the remote was created with an empty name. Syncing a status that had since been deleted crashed in the middle of a push. A commit message containing a square bracket crashed “View Full Message” (those are just bugs that were missing Markup.Escape() function). Applying a stash said “applied successfully” even when it conflicted. One bad path stored in config.json crashed “Add Project”. This is just a snippet of the amount of fixed bugs. I won’t write all of them here since it would take a lot of text and I am pretty sure that this is enough for you to understand that we fixed a lot of bugs haha. Right now I am going to do the Language System. I am not sure if I mentioned in some devlog, the list of languages that Helyx will support. If not… there it is: English Slovak Spanish French German Russian"}, {"post_id": 48471, "ts": "2026-08-16T20:37:52Z", "hours": 9.3269, "text": "Adding new features & fixing bugs I finished making “Analyze Project” which analyzes your whole project and prints stuff such as: Number of files Number of folders Size of the project on disk Number of lines Also you can now see what amount of what programming language makes your project. It also shows you the biggest files in your project directory. And also you can see Git information such as: Branch Number of commits First commit (date) Last commit Working tree .git size So it displays some maybe important and basic information that you may check sometimes or might be interested in. There were like 6 revisions of this because I was testing different styles & designs. I also found a lot of hidden bugs with help of Claude! Before talking about bugs, I will tell you something about new features that I added. Now, when you assign a badge or change a status and you don’t have markers in README.md yet in it, then it will ask you if you want to add them manually or via Helyx. What does that mean? Well, it opens a “text editor” in Helyx which displays README.md and you can insert the badges/statuses where you want instead of opening the file in notepad and inserting the markers manually. Overall it is way quicker to do it now via Helyx. Helyx’s Generic Text Editor is now even better! You can now use all of the arrows, before you could just use Left/Right Arrow to move cursor left or right. Now you can move between lines. Now you can also open your project’s wiki via Helyx. Be aware that it doesn’t check anything, if you have wiki or not. It directly opens the website for the wiki where it should have been for the current linked GitHub Repository. Let’s talk about bugs now! Open an issue called the Markdown handler function and it was accidentally calling GitHub 101 times, when it needed some info. Now it doesn’t. 🆒 Notes have an encryption system, so if you put some sensitive info into it, it couldn’t be directly taken from the file. Only via Helyx. There was a bug, where when you enabled encryption and edit notes of 2 projects, then you turn off encryption globally and open the first project’s notes, it decrypts… but after that you open second project’s notes, it won’t. This was due to having a global bool instead of per project bool when saving if it was encrypted. Fixeddd! Another bug! Sync Status & Sync Badges was deleting staging index. Funny that I was thinking about to restore the staging index whenever using it, but at the end… the logic was wrong 😭 Now it isn’t. Then there was a bug that when you unassigned a badge, it unassigned ALL badges. Fixed! Another bug linked to badges… Unassigning a badge didn’t remove it from GitHub. Yeah… fixed!!"}, {"post_id": 47110, "ts": "2026-08-14T19:16:58Z", "hours": 10.0108, "text": "Manage PRs done! Added few new things… I finally finished making Manage PRs. So now you can: Delete Comment Merge Review Close PR Reopen PR I also had to fix some design flaws and function flaws but now it should be all good. Before doing all of this, there was a bunch of GET requests… now? Now it is also a bunch of PATCH & PUT requests. Also, now when you’ll try to link your GitHub Repository with the local one, you will just select the one that is on your GitHub account. Another thing! When you have conflicts between the local repository and the remote one (GitHub) and you try to sync them, a lot of the time Notepad pops us and tells you to remove the version of the text that you don’t want. Well now Helyx does it too and doesn’t open notepad, but lets you do it directly in TUI interface in my very own notepad. Conflict solver also uses alternate screen for this. (there’s sadly no showoff image for this, because currently I don’t have anything to create a conflict on) I am not sure what to do next in a next devlog, since everything I really wanted to do is already done… well… not everything but everything around the main things is. Maybe I’ll move on another refactoring? Or finishing the language settings? Well, we will see!"}, {"post_id": 46111, "ts": "2026-08-13T03:18:59Z", "hours": 9.2472, "text": "Manage PRs displaying and some logic done After pulling another all-nighter I finished making the Pull Request display functions. List and details about each Pull Request is done and paging also works too (took it from manage issues ;] ). Pull Requests also contain filters such as: Open Drafts Assigned Reviewed and we can’t forget their counterparts either: Closed Ready Unassigned No reviewers Pull Requests now have comment selection and Markdown formatting, but functions to manage Pull Requests are not done yet. The only ones I managed to finish are: Comment Open Browser The biggest problem with PRs is going to be, that their functions and methods for executing those functions are more complex than the ones for Issues. I plan to add these functions for PRs: Delete Comment Merge Review Close PR Reopen PR I am pretty sure that all of this will be done in next devlog, so stay updated! This is going to be very cool, I think. Well, now I am going to sleep so good night everyone!"}, {"post_id": 45830, "ts": "2026-08-12T15:39:18Z", "hours": 8.5531, "text": "Manage Issues, completed! PRs, incoming… Manage Issues is now fully completed. I still had a few issues with paging and rendering but now they are fixed. Now you can select a message and delete it & edit it. But also now you can create a comment, lock an issue, unlock an issue and create an issue. I also added a thing that I hope will be appreciated, Helyx renders Markdown from GitHub Issue comment and when you comment via Helyx, Helyx gives you Markdown options such as: Bold Text Italic Text Code Text List Quote Also, when you don’t provide a text to a comment in GitHub, Helyx will say that “No description was provided.” So the same thing as GitHub already does, but in Helyx you must provide text. Why? Because why would you create a comment with no text? So I banned adding a comment with no text. Okay, that would be everything! It was fun to create this because everything was working so well, except the paging system… that was painful to make even with Claude’s help. As I said in past devlogs, after Issues I am going to move to PRs. So yeah, let’s work on PR. I hope it won’t be harder to make, because a PR is a type of Issue in GitHub, so I hope I will use the same function logic and functions and callbacks to make it."}, {"post_id": 45232, "ts": "2026-08-11T15:56:35Z", "hours": 9.2425, "text": "Paging done, functions almost! I finished making the logic for rendering issues. In the last devlog it was just displaying all of the issues at the same time. No paging system so if there was a lot of issues or long issues, they would simply… not appear. It took me a really long time to work this out. I was mainly switching back and forth the rendering logic all the time and it went so far, that I had to use Claude to help me with it. At the end, I ended up with a rendering logic that I am not really keen on, but it is the best one that can be used in Helyx and TUI environment. Main obstacles were the Spectre.Console rendering functions and classes that were under IRenderable interface. And also the limitations of Panels, Grids… Layout had everything I needed . I wanted to cut the part which couldn’t be rendered and it should have looked like, like an unfinished Panel. Well, this was impossible. Without changing the core code of Spectre.Console or creating own system for making Panels it was impossible. Also, I haven’t seen it as something that WOULD NEED an own system that would render comments. So I just made it when a comment cuts, it creates whole Panel with part of the comment that can be rendered and at the bottom is text saying that it continues on the next page… and on the other page at the top there’s text that, hey, it continues here! Let’s finally talk about the Issue functions! I finished some simple one like: Close Reopen and create an issue… But I still have to create a system that can let you: Comment Edit comments Delete comments Lock issue Unlock issue Those are currently in WIP, but in the next devlog they’ll be most probably finished and after everything is done with issues, I will move to Pull Requests!"}, {"post_id": 44672, "ts": "2026-08-10T16:18:14Z", "hours": 9.8836, "text": "Manage Issues, at your service. After a painful development period I am again here, writing devlog! What changed? Good question! Manage Issues is partly done! I still have to finish making the actual actions but displaying is somewhat finished. When you go to ‘Manage Issues’, you will firstly see a list of issues that are on your GitHub repository. From there you can already see some details about the issues such as: Number State Title Labels Comments (number) Updated (time) Above them are filters, currently those are the available filters: All -> All Commented -> Issues has some comments Assigned -> Issues that have some assignees Labels -> Issues that have some labels But that is not all! There are also their counterparts: No comments Unassigned Unlabeled (there’s no inversion of All because why would you need filter None) Yeah, so you can invert your filters… When you select an issue at the very top you will see its number, then you will have a panel with details about the issue with its title and: State Author Opened (time) Labels Assignees Right under these details are all of the comments in chronological order. When it is done, it will also show the whole timeline of each issue. So when this and this label was added/removed… when was this assignee assigned/unassigned… when was this issue closed/opened…. Of course I am going to add actions so you can add a comment, close issue, open issue, etc… When I’ll finish Manage Issues, I will go to work on Manage Pull Requests. It shouldn’t be that different because Pull Requests are by GitHub a kind of Issue but they are also not the same, so different classes, types, etc… Well, wish me luck people… or should I say… Stardancers?? P.S.: Sorry for the grammar in images in comments. I did it very quick for the preview."}, {"post_id": 44020, "ts": "2026-08-09T14:52:22Z", "hours": 9.7869, "text": "Diagnostics done, other stuff too and some changes! Diagnostics are now fully done! When something messes up, it will give you options to fix it! Some time ago I created GitHub Synchronization settings for managing what to sync with GitHub, so what to retrieve and send with those options: Sync status with GitHub repository Sync badges with GitHub repository Fetch GitHub repository topics Fetch GitHub repository stats Use GitHub’s language detection instead of Helyx’s I created a brand new tab called ‘GitHub Actions’ where this setting is. GitHub Actions is meant to contain all of the actions that are mainly linked with GitHub endpoints. I kept few such as Push, Pull, Sync in Git Actions due to how the layout is already created. Also I added when you are rebasing and it fails, it automatically gives you a prompt to cancel it. So repair it… GitHub Actions will contain a new stuff that will come to Helyx! Managing Issues and Pull Requests!! Maybe also workspaces/actions but I will see how difficult that is and how it is needed/useful in Helyx. Another new function is, that when there’s an update for Helyx and I change the GitHub OAuth scope because of new features… Helyx will warn you and tell you to reauthorize to make sure every function will work correctly. Before this change, Helyx was using its folder name as a name of the project and as a repository name for GitHub. Now, when you add a project to Helyx, Helyx will ask you what’s its name and when you will try to use some GitHub function for the first time on your newly added project on Helyx, it will request a GitHub Repository name from you. ;) There’s still a lot of things to add. Honestly I thought that Helyx was at the very end like 50 hours ago and look! There are many more functions to add haha!"}, {"post_id": 43404, "ts": "2026-08-08T17:00:23Z", "hours": 8.0208, "text": "Doctor Git As you may know, right now I am working on Diagnostics. I am almost done with fully displaying all of the health checks about your Git repository. But I still have to finish all of the fixing actions that it will have. Diagnostics will mainly be for a case where something happens in Helyx and it will need to be fixed. The main idea of it is not aimed at resolving issues with your Git repository outside Helyx. But it may resolve some because you may run into the same issue as you had in Helyx of course. In the last devlog I said that I put GitHub Topics off. Well, that did not happen! I finished displaying GitHub Topics!! I think in some devlogs I said that it was for managing GitHub Topics. Managing meant like adding, removing, editing. Well, that wasn’t actually my main point. I just wanted it to show you your currently assigned topics in GitHub. I also didn’t see a big reason in adding Add, Remove, Edit functions for topics. Topics rarely changed, honestly and the most intuitive way would be doing it via GitHub web interface."}, {"post_id": 42869, "ts": "2026-08-07T20:34:12Z", "hours": 3.6694, "text": "More bugs are appearing, and being fixed!! So since Helyx is already far and has many advanced functions, it also has some bugs. Today when I was experimenting with assigning a project and syncing it with GitHub, I found out, that if you try to sync the projects in a wrong way… it will not work. For that reason I added more fail-safes to make sure that this will be eliminated. I can’t confirm yet if those fail-safes work, because I am also working on a new Diagnostics action in Git Actions so if something goes wrong, you can fix it by the error Helyx gives you. Right now my testing project is in a state of “Git corrupted” (no idea what I should call it) where rebase was aborted. Because of this, I had to put the “GitHub Sync Topics” synchronization off until later, so I can focus on fixing these major bugs. Also another bug came to my mind that I fixed… Helyx works on a principle of directory paths. Each project is saved in config file under its own unique GUID and its path. The bug is that when you try to rename the directory, the project won’t be found and it will be removed from Helyx. Now, you can either let Helyx find it automatically (sadly can easily fail) or you can select project manually in explorer (recommended!!!)."}, {"post_id": 42404, "ts": "2026-08-07T02:57:49Z", "hours": 4.2367, "text": "Sync finally done!! It’s 5 AM and I finished “Sync badges with GitHub Repository” and “Sync the status with GitHub repository” (this was already done, but with the enum version of status). I added also a few fail-safes so when you assign some badge or status and then delete it, it will also delete it from GitHub and project. Now it won’t be a ghost that you cannot get rid of haha. This was a little more difficult than I expected to do, the fail-safes because the local changing mechanism and syncing mechanism were written inline in the same function. The only thing that was dividing them was an if statement. It was interesting to make this. To make sure everything will work fine. Even though it didn’t MANY TIMES. Now I will focus on syncing GitHub topics. Wish me luck! P.S.: Forgot to mention, that I have to add this “On Status/Badge Edit, ASAP sync with GitHub” with Edit. I almost forgot lol, just came into my mind. I hope that COPY+PASTE will be enough and I won’t have to create another syncing system specifically for edits…"}, {"post_id": 42259, "ts": "2026-08-06T21:43:48Z", "hours": 8.6897, "text": "Never expected it to be this hard So the last days I was again changing the structure of my solution and trying to get on with it. It took me a while to create one that Claude agrees with and is good for such open-source projects. Anyways, this was the easy part. In my last devlog I said that I completed Custom Statuses & Custom Badges. Well… I did! But then I found out, that my system was bad… and when I say bad I mean it wasn’t thought out. I found out about all of this when I finished the edit action for both. Originally I used Dictionary<string, TagDefinition>. Key was name of the Status/Badge and TagDefinition was the class of one of them which also has name property. But Helyx was not prepared for this, so for the last days I redid the whole system eight times. Once I used Dictionary, once I used List, then HashSet, then Dictionary, then Dictionary with other types and so on. I just couldn’t settle on the correct type for it. Until now, it took so long even though it is so primitive because it simply didn’t come to my mind and when I was asking Claude for suggestions of how could it be made, it didn’t think of using this type. The final type is simply… Dictionary<Guid, TagDefinition> AND A LOT OF CHANGES. Yeah… don’t worry guys! I am totally devastated by doing this over and over even though it was so simple & primitive to do. Well… maybe not really primitive because the changes were also difficult to do. I mainly didn’t want to use the GUID system because I have Custom Statuses but also Built-in Statuses and I was really worried about Built-in statuses having GUID assigned to them. Those sync options with GitHub are still in work, but I finished the GitHub Repository Stats viewer after a lot of experimenting with layouts and designs/effects/colors. I’m looking forward to the next devlog guys! I hope Helyx will be your good coworker that will actually count for something hah! P.S.: I also made that text of colors is grammatically formatted. At least it should be…"}, {"post_id": 40755, "ts": "2026-08-04T14:24:15Z", "hours": 6.5064, "text": "Adding Custom Statuses, Custom Badges and even more! Here we are again! Today I added: Custom Statuses Custom Badges WIP: Sync badges with GitHub repository Sync topics with GitHub repository My original status system for projects was a hardcoded enum with statuses “Active”, “Inactive”, “Paused” and “Archived”. Then I had a lot of switches which determined color of markup based on which enum it is hah. As you may already know, enums cannot be changed in runtime :) What does that mean? That users cannot add their own statuses in Helyx directly… They would have to hardcode into Helyx their own statuses and that’s just impractical, no? That’s why I spent below mentioned amount of hours redoing so many things to make it actually work and I even learned something from this! That JSON Parsers and Colors are NOT huge friends! (genuinely, I HAD NO IDEA why it wasn’t working until AI told me that JSON parsers cannot translate Color structs). Custom Statuses/Badges currently have Add/Delete functions and right now I am going to add also Edit function, so when you accidentally create a status/badge with wrong color, you don’t have to delete it and create it again :) (just saved 10seconds of your life). I also recategorized my whole codebase with help of Claude Code. I told him to review my whole codebase and suggest what classes, enums, interfaces should be in which files and those files in which folders. It was fun, finally something where I did not have to concentrate much and chill and watch something when doing it. Well, now it is not much fun when functions that I was using are in different files and some classes have different names. But at least my codebase looks more professional! (before this I had like 10 files with a bunch of lines where classes were stacked…) Also, about the WIP stuff above… Sync badges with GitHub repository is going to be something like the Sync status with GitHub repository. It will just pop up in your README.md based on where you put the headers which Helyx will give you for that specific badge. Sync topics on the other hand are classic topics of the repository which you can see in top right corner of your repository page. It will mostly show you which topics are assigned to your repository in Helyx but I’ll make it also so you can assign/unassign topics from your repository. I’m thinking of adding more GitHub Synchronization options, but none are currently coming to my mind. Maybe something with actions, no idea yet, or local AI that will explain to you errors given by Helyx when you will be trying to do something. We will see!"}, {"post_id": 40227, "ts": "2026-08-03T17:05:06Z", "hours": 5.3314, "text": "Settings and Git pages are receiving more stuff! I added for Settings page: Notes Settings Updates and for Git page: Undo Commit Redo Commit as the name says, Notes Settings are for changing properties of global Notes on every project. There is only one setting that came to my mind and that is encryption. Some of you might paste into it something personal or confidential. Well, this makes sure that these info CANNOT be taken from raw file, but from Helyx directly. (thinking about adding password mechanism lol) Updates, yeah, it looks for updates for Helyx . Undo Commit is a special one, when you commit something and for some reason you want to go back you just undo it. On the other hand, if you somehow accidentaly clicked on Undo Commit or now you want to redo the undo, you can with Redo Commit. My plan now is to add again more functions, such as Custom Badges, option to sync the Custom Badges with your GitHub repo (it will pop up in README.md) and also add Tags sync, so you can edit your repository’s Tags via Helyx. Oh yeah, also going to add custom project status because some people may say that having statuses such as “Active”, “Inactive”, “Paused”, “Archived” is limiting (custom ones will yes, also be synced with GitHub). :) I also mustn’t forget to add the translations for other languages. I am going to do this at the end due to new text appearing every time I add something new."}, {"post_id": 39660, "ts": "2026-08-02T19:45:40Z", "hours": 6.2036, "text": "Slowly, but surely We are almost at the end (if no other function to add will come to my mind) and I was messing with access modifiers, accessors, refactoring names of variables, Tasks, voids, properties. I was adding exception handling keywords and many ifs to make sure there will be no bugs and that almost every exception will be caught. I was doing this manually so I might have missed some places where the exception handler is needed but yeah we shall see! I also enabled a search bar, so when you will be looking for your project in Helyx and you have many projects added, you can search for yours! I was also changing styles of my old menus and theirs logic because they weren’t done very well in comparison with style that I am using now… Funny story: while I was messing with the access modifiers and accessors I actually bricked the whole Helyx, because functions that were supposed to resolve configuration file and read/write into it couldn’t. I thought I accidentally removed something important but at the end it was just that, that I was changing the access modifiers and accessors."}, {"post_id": 39059, "ts": "2026-08-01T18:54:21Z", "hours": 9.4842, "text": "Added new setting, finished overwrite languages and still working on show stats I have finished the overwrite languages function which uses GitHub’s programming languages detection system over Helyx’s one. I added a setting where you can choose your identity (Git -> local, GitHub -> remote). Local is based on Git’s settings and remote one is accessible after authorization with GitHub. I am currently working on retrieving and displaying the GitHub repository statistics. I am using charts to display it nicely and simply. Currently it is showing only Stars, Watchers, Forks and chart of used languages. I also added a few informative labels that tell you that something is actually happening and the program did not freeze. If I didn’t add this you would be looking at an empty black screen. One of the last things I added is active GitHub Authorization Token checker and resolver. Before this if you revoked your OAuth with Helyx on GitHub page, Helyx would think that it is still authorized to your GitHub account, now it checks it and if you revoke it online, Helyx will disable functions that are only accessible when you are authorized via GitHub."}, {"post_id": 37815, "ts": "2026-07-30T19:23:03Z", "hours": 4.9556, "text": "User Scripts done? What next?? As written above, I have finished User Scripts. Yeah, they don’t have that many functions as before, but I am going to add some, that will actually be useful and will stay in Helyx. Right after that I’d want to move to add more things to GitHub Synchronization settings that are per project. This is mainly to make the Helyx project dashboard look better with more interesting info about your current repository. Be aware that you have to be authorized in Helyx via GitHub to access those settings. This may sound funny, but I was thinking about adding Add-on manager to Helyx. No idea how I would make it yet or what packages would even Helyx have, but I hope that after some brainstorming I will have an answer. Before that, I will again think for a while if it is a good idea and if it is even needed. But surely it sounds cool to me, to someone who has never made an add-on manager for his program. At the end I want to transfer my view to hardening the code. Many checkings, many dialog boxes what’s wrong, and such things, so your Helyx window just doesn’t close after you mess up with configuration file or you do something that no one would ever do in his lifetime. ;)"}, {"post_id": 37545, "ts": "2026-07-30T10:56:21Z", "hours": 10.0053, "text": "Changing my mind over User Scripts So I have finished all of these User Scripts functions and I found out something interesting, that made me remove some of them after I finished them. In the devlog before, I wrote a list of actions that are in Helyx such as… Wait Until, If, Loop, Set/Get Variable, etc… . Well, I found out that making some that I have mentioned would be useless, because I imagined User Scripts mainly as an automatic actions for testing your project, but how could your program get script’s variable from Helyx or set/change it. The same applies for If, If would be also complex to set. With each If Action there would be x^2 (if my calculations are correct) more node pathways and without making some really good UX in TUI environment, it would be difficult to find your way around."}, {"post_id": 36457, "ts": "2026-07-28T16:14:12Z", "hours": 9.1958, "text": "Making User Scripts I am currently working on the User Scripts as I have mentioned in older devlogs. I must say that this is one of my first interactions with interfaces in C# because there was not a huge reason to use it in my code… until now. I must say that User Scripts is the most difficult thing in all Helyx to make because you have to think on everything… how this will work, how shall we display it, how to make it versatile so other actions work with it too, etc… I made the system for adding Blocks (Actions = Blocks) to Scripts and right now I am implementing dialogs to insert properties for each action, such as Duration for Wait Action. These are current actions that are in Helyx (you can suggest new ones in comments) : Wait Wait Until If Loop (should be something like while(), might change the idea of it) End (ends script, so like return/break) Set Variable Get Variable Compare Random Log (logs text) Execute (executes command) Open (opens directory) Create File Create Folder Delete File Delete Folder Right after that I would want to move to make the UI look overall better and function better. Welp, we will see in my next devlog the progress I will make."}, {"post_id": 35822, "ts": "2026-07-27T14:40:58Z", "hours": 5.6561, "text": "Backup system, done!! I finished the Backup system and also had to fix some major issues I had in helper functions due to the “project looking up system” migration… yeah… awkward name, I know. Now that the Backup system is done, let me continue and begin to work on User Scripts. Just realized that I have to come up with how it will work…"}, {"post_id": 34093, "ts": "2026-07-24T15:52:43Z", "hours": 8.3447, "text": "Losing sanity is not fun I honestly think I’ll go insane soon. I have changed the whole system of how Helyx saves Projects to its config file and how every function… EVERY FUNCTION works with it. I just have to say that I’ll try my best to make the code better than the one I am currently editing because 18h spent on redoing the whole codebase (revamping included from devlog before) is 1. crazy and 2. even more crazy. It’s wild how a tiny thing can ruin your whole codebase, I hope I will finish it quickly, because I want to continue working on the Backup system and after that on the User Scripts."}, {"post_id": 31940, "ts": "2026-07-20T19:06:16Z", "hours": 9.93, "text": "Cleanup time! I have completely revamped my code… I removed a lot of unused code that was either used for experimenting or was scrapped and I forgot to remove it. Before removing some of the code, I actually tried something with it… but then I realized that they were commented for some reason. I refactored parts of my code to look overall simpler with lambda expressions and LINQ. Not sure if it is more readable now, but it works so it’s fine. If anything, I’ll just add a comment so I know what it does instead of looking at it and brainstorming what it could be. I decided to mainly work on the Backup system because I think that User Scripts will be more complicated to make."}, {"post_id": 31333, "ts": "2026-07-19T17:11:07Z", "hours": 6.3575, "text": "Local & Remote Repository status I just finished making the status manager, so now you can change your status locally… but also remotely! Remotely means on GitHub, not like via some controller. Because of this, I created a tab called GitHub Synchronization, where you can enable/disable settings that are linked with GitHub and retrieve/push from/to GitHub. Now, I am planning to work on Backup system and User Scripts."}, {"post_id": 29735, "ts": "2026-07-16T20:33:20Z", "hours": 9.7861, "text": "Git Actions family is getting EVEN bigger! I have finally finished a lot of major stuff and also tried to make some additional things that MAY be added in the future. I finally added Stashes, Pull, Push and Sync to the Git Actions, so now they work! Also, all of Git functions have some automatic repair, so if you do something you shouldn’t, it should be alright… but it is not 100% so don’t try your luck! I still have to finish and a bunch of stuff with it so you can do whatever you want with it without editing the code itself! I was thinking of adding some label for your GitHub repository which you can control via Helyx. Like status… yeah… let’s add a badge that will act as a status info of your project!"}, {"post_id": 26717, "ts": "2026-07-11T17:47:55Z", "hours": 12.8578, "text": "Git Actions family is getting bigger! We’ve made a lot of progress! More of the Git Actions are done such as… Status Stage Commit Diff Create Branch Switch Branch Delete Branch Right now I am working on another: Pull Push Sync Stashes I hope they will be done soon! Stay updated!"}, {"post_id": 21798, "ts": "2026-07-03T22:31:34Z", "hours": 45.9456, "text": "Huge updates!! Since it is my first time working with Spectre.Console library, I was trying a lot of stuff with it. When I was somewhat happy with what I learned, I cleaned up the code due to the amount of useless lines and duplicated/not used variables . 1, Updated UI/UX I have updated the UI/UX so it looks more modern-ish. This new UI/UX design is for now only on the main pages of Helyx… but I plan to add it to every page very soon! 2, More actions! (even more will be available in the future) I have added more Git Actions that are still in WIP. I also created templates in code of what actions I’d want to add later. I’ll tell you more about them when they will be finished (SOON). 3, More stuff in Settings! I have added more settings into Settings :D Now you can select Default IDE, see if your IDE was found in your system, if not you can manually select the .exe of it. You can also manage the configuration file, well, reset it. 4, Projects sorting Projects are now sorted based on its status. 5, You can manage the projects for Helyx You can now delete the projects and change the status. 6, Future bugs & lots of if statements My code was completely unsafe up to this point, so I had to add many of try/catch and if statements to make it safe. I was experimenting with Spectre.Console, because I have never worked with it. I made some cool stuff that I will add in the future to Helyx! I understand it now better! All of this was quite difficult for me to do, since as I said, on such project where I am using C# with its basic types… I was mostly a Unity C# Developer, where Unity had its own classes and functions and callers that were standard."}, {"post_id": 10796, "ts": "2026-06-17T18:25:25Z", "hours": 14.0269, "text": "Helyx, the IDE detective I’ve been working on the IDE detection system. This took me a long time because I was testing many different ways of how to detect it and then sort them from most probable to least. At the end I have selected the one that uses points based on what the Project includes in its path… so files, extensions and directories. I was experimenting with the Language system that I will make in the future. I just want to be sure what I am doing so later, I won’t be in panic what now and what was my original plan. I have also refactored the code to some point but it is still not great after all of these things I have done above … so still need to do this. I redesigned the menus and made it more universal and made the menu easier to navigate in. I think my progress is going kinda good so far and it looks promising for me. I also added some basic Git function like “git status” but I am about to add more. I’d appreciate if you would write into comments some functions that I should add to Helyx. Not sure if I already mentioned this but I am also planning to add a feature so you can create your own shortcuts for your projects like… some testing shortcut. For instance, you have some project you want to test and you need to build it, then tweak some settings and at the end you actually test. With this, you can do all of this just by one click… Well, that’s at least my imagination and I am not sure if it will get to such point where you can do such tasks but we’ll see Wish me luck!"}, {"post_id": 9561, "ts": "2026-06-15T22:44:15Z", "hours": 4.0336, "text": "Project handler, done for now I was thinking of adding a translation system for Helyx. I was experimenting with a lot of systems how to do it… well, I might keep this for the end of Helyx so at the end I translate all of the strings. I added the “Add Project” system and some basic detection systems for it such as… Project Name Path Languages (used programming language in project) Used IDE for the project then it will ask you if you really, but REALLY want to add the project and if you proceed it will be added to your Projects menu. After that you can open your Project and see such basic info as… Status Last modified Languages Used IDE Is a GIT Repo I am thinking about adding more, removing some and making it overall more versatile because versatile applications are just the best ones. For now, I created some basic functions for your Projects such as… Open in VS Code Git Status Remove Project (from Helyx) but these are the ones already working, but I am still trying to make them more versatile :p … but there’s more functions that I am currently working on, that I hope won’t be scrapped and I will mention them in next devlog!"}, {"post_id": 9329, "ts": "2026-06-15T17:24:04Z", "hours": 7.76, "text": "Lots of new ideas, lots of scrapped ideas Lately I’ve been working on a way to search for projects automatically but I had to scrap the idea because I didn’t like it at the end… so now I am making it so you can add your own projects and some IDE integrations. I was also trying multiple libraries for TUI interface integration and GUI support with other libraries and input devices. These hours were full of scrapping & making new ideas, but that’s what programming is about!"}, {"post_id": 8639, "ts": "2026-06-14T11:15:51Z", "hours": 1.3039, "text": "The beginning… So I have finally begun to work on this! I was thinking a lot what to create for Stardance and it looks like this might be something I want to create! Originally I wanted to create this in Python but then I really quickly found out that my Python skills wouldn’t be enough to create something like this and I didn’t want this to be a vibe-coding project… SO HERE WE ARE… using C#! So far so good, I guess… Currently I am working on the configuration handler which will have functions for implementing and retrieving info from the configuration file. After that, I am planning to make the interface somewhat versatile, so it is possible to adjust it for yourself or add some new options and such."}]...
|
Title: Helyx by @lix | Stardance
Devlogs:
The beg Title: Helyx by @lix | Stardance
Devlogs:
The beginning… So I have finally begun to work on this! I was thinking a lot what to create for Stardance and it looks like this might be something I want to create! Originally I wanted to create this in Python but then I really quickly found out that my Python skills wouldn’t be enough to create something like this and I didn’t want this to be a vibe-coding project… SO HERE WE ARE… using C#! So far so good, I guess… Currently I am working on the configuration handler which will have functions for implementing and retrieving info from the configuration file. After that, I am planning to make the interface somewhat versatile, so it is possible to adjust it for yourself or add some new options and such.
Lots of new ideas, lots of scrapped ideas Lately I’ve been working on a way to search for projects automatically but I had to scrap the idea because I didn’t like it at the end… so now I am making it so you can add your own projects and some IDE integrations. I was also trying multiple libraries for TUI interface integration and GUI support with other libraries and input devices. These hours were full of scrapping & making new ideas, but that’s what programming is about!
Project handler, done for now I was thinking of adding a translation system for Helyx. I was experimenting with a lot of systems how to do it… well, I might keep this for the end of Helyx so at the end I translate all of the strings. I added the “Add Project” system and some basic detection systems for it such as… Project Name Path Languages (used programming language in project) Used IDE for the project then it will ask you if you really, but REALLY want to add the project and if you proceed it will be added to your Projects menu. After that you can open your Project and see such basic info as… Status Last modified Languages Used IDE Is a GIT Repo I am thinking about adding more, removing some and making it overall more versatile because versatile applications are just the best ones. For now, I created some basic functions for your Projects such as… Open in VS Code Git Status Remove Project (from Helyx) but these are the ones already working, but I am still trying to make them more versatile :p … but there’s more functions that I am currently working on, that I hope won’t be scrapped and I will mention them in next devlog!
Helyx, the IDE detective I’ve been working on the IDE detection system. This took me a long time because I was testing many different ways of how to detect it and then sort them from most probable to least. At the end I have selected the one that uses points based on what the Project includes in its path… so files, extensions and directories. I was experimenting with the Language system that I will make in the future. I just want to be sure what I am doing so later, I won’t be in panic what now and what was my original plan. I have also refactored the code to some point but it is still not great after all of these things I have done above … so still need to do this. I redesigned the menus and made it more universal and made the menu easier to navigate in. I think my progress is going kinda good so far and it looks promising for me. I also added some basic Git function like “git status” but I am about to add more. I’d appreciate if you would write into comments some functions that I should add to Helyx. Not sure if I already mentioned this but I am also planning to add a feature so you can create your own shortcuts for your projects like… some testing shortcut. For instance, you have some project you want to test and you need to build it, then tweak some settings and at the end you actually test. With this, you can do all of this just by one click… Well, that’s at least my imagination and I am not sure if it will get to such point where you can do such tasks but we’ll see Wish me luck!
Huge updates!! Since it is my first time working with Spectre.Console library, I was trying a lot of stuff with it. When I was somewhat happy with what I learned, I cleaned up the code due to the amount of useless lines and duplicated/not used variables . 1, Updated UI/UX I have updated the UI/UX so it looks more modern-ish. This new UI/UX design is for now only on the main pages of Helyx… but I plan to add it to every page very soon! 2, More actions! (even more will be available in the future) I have added more Git Actions that are still in WIP. I also created templates in code of what actions I’d want to add later. I’ll tell you more about them when they will be finished (SOON). 3, More stuff in Settings! I have added more settings into Settings :D Now you can select Default IDE, see if your IDE was found in your system, if not you can manually select the .exe of it. You can also manage the configuration file, well, reset it. 4, Projects sorting Projects are now sorted based on its status. 5, You can manage the projects for Helyx You can now delete the projects and change the status. 6, Future bugs & lots of if statements My code was completely unsafe up to this point, so I had to add many of try/catch and if statements to make it safe. I was experimenting with Spectre.Console, because I have never worked with it. I made some cool stuff that I will add in the future to Helyx! I understand it now better! All of this was quite difficult for me to do, since as I said, on such project where I am using C# with its basic types… I was mostly a Unity C# Developer, where Unity had its own classes and functions and callers that were standard.
Git Actions family is getting bigger! We’ve made a lot of progress! More of the Git Actions are done such as… Status Stage Commit Diff Create Branch Switch Branch Delete Branch Right now I am working on another: Pull Push Sync Stashes I hope they will be done soon! Stay updated!
Git Actions family is getting EVEN bigger! I have finally finished a lot of major stuff and also tried to make some additional things that MAY be added in the future. I finally added Stashes, Pull, Push and Sync to the Git Actions, so now they work! Also, all of Git functions have some automatic repair, so if you do something you shouldn’t, it should be alright… but it is not 100% so don’t try your luck! I still have to finish and a bunch of stuff with it so you can do whatever you want with it without editing the code itself! I was thinking of adding some label for your GitHub repository which you can control via Helyx. Like status… yeah… let’s add a badge that will act as a status info of your project!
Local & Remote Repository status I just finished making the status manager, so now you can change your status locally… but also remotely! Remotely means on GitHub, not like via some controller. Because of this, I created a tab called GitHub Synchronization, where you can enable/disable settings that are linked with GitHub and retrieve/push from/to GitHub. Now, I am planning to work on Backup system and User Scripts.
Cleanup time! I have completely revamped my code… I removed a lot of unused code that was either used for experimenting or was scrapped and I forgot to remove it. Before removing some of the code, I actually tried something with it… but then I realized that they were commented for some reason. I refactored parts of my code to look overall simpler with lambda expressions and LINQ. Not sure if it is more readable now, but it works so it’s fine. If anything, I’ll just add a comment so I know what it does instead of looking at it and brainstorming what it could be. I decided to mainly work on the Backup system because I think that User Scripts will be more complicated to make.
Losing sanity is not fun I honestly think I’ll go insane soon. I have changed the whole system of how Helyx saves Projects to its config file and how every function… EVERY FUNCTION works with it. I just have to say that I’ll try my best to make the code better than the one I am currently editing because 18h spent on redoing the whole codebase (revamping included from devlog before) is 1. crazy and 2. even more crazy. It’s wild how a tiny thing can ruin your whole codebase, I hope I will finish it quickly, because I want to continue working on the Backup system and after that on the User Scripts.
Backup system, done!! I finished the Backup system and also had to fix some major issues I had in helper functions due to the “project looking up system” migration… yeah… awkward name, I know. Now that the Backup system is done, let me continue and begin to work on User Scripts. Just realized that I have to come up with how it will work…
Making User Scripts I am currently working on the User Scripts as I have mentioned in older devlogs. I must say that this is one of my first interactions with interfaces in C# because there was not a huge reason to use it in my code… until now. I must say that User Scripts is the most difficult thing in all Helyx to make because you have to think on everything… how this will work, how shall we display it, how to make it versatile so other actions work with it too, etc… I made the system for adding Blocks (Actions = Blocks) to Scripts and right now I am implementing dialogs to insert properties for each action, such as Duration for Wait Action. These are current actions that are in Helyx (you can suggest new ones in comments) : Wait Wait Until If Loop (should be something like while(), might change the idea of it) End (ends script, so like return/break) Set Variable Get Variable Compare Random Log (logs text) Execute (executes command) Open (opens directory) Create File Create Folder Delete File Delete Folder Right after that I would want to move to make the UI look overall better and function better. Welp, we will see in my next devlog the progress I will make.
Changing my mind over User Scripts So I have finished all of these User Scripts functions and I found out something interesting, that made me remove some of them after I finished them. In the devlog before, I wrote a list of actions that are in Helyx such as… Wait Until, If, Loop, Set/Get Variable, etc… . Well, I found out that making some that I have mentioned would be useless, because I imagined User Scripts mainly as an automatic actions for testing your project, but how could your program get script’s variable from Helyx or set/change it. The same applies for If, If would be also complex to set. With each If Action there would be x^2 (if my calculations are correct) more node pathways and without making some really good UX in TUI environment, it would be difficult to find your way around.
User Scripts done? What next?? As written above, I have finished User Scripts. Yeah, they don’t have that many functions as before, but I am going to add some, that will actually be useful and will stay in Helyx. Right after that I’d want to move to add more things to GitHub Synchronization settings that are per project. This is mainly to make the Helyx project dashboard look better with more interesting info about your current repository. Be aware that you have to be authorized in Helyx via GitHub to access those settings. This may sound funny, but I was thinking about adding Add-on manager to Helyx. No idea how I would make it yet or what packages would even Helyx have, but I hope that after some brainstorming I will have an answer. Before that, I will again think for a while if it is a good idea and if it is even needed. But surely it sounds cool to me, to someone who has never made an add-on manager for his program. At the end I want to transfer my view to hardening the code. Many checkings, many dialog boxes what’s wrong, and such things, so your Helyx window just doesn’t close after you mess up with configuration file or you do something that no one would ever do in his lifetime. ;)
Added new setting, finished overwrite languages and still working on show stats I have finished the overwrite languages function which uses GitHub’s programming languages detection system over Helyx’s one. I added a setting where you can choose your identity (Git -> local, GitHub -> remote). Local is based on Git’s settings and remote one is accessible after authorization with GitHub. I am currently working on retrieving and displaying the GitHub repository statistics. I am using charts to display it nicely and simply. Currently it is showing only Stars, Watchers, Forks and chart of used languages. I also added a few informative labels that tell you that something is actually happening and the program did not freeze. If I didn’t add this you would be looking at an empty black screen. One of the last things I added is active GitHub Authorization Token checker and resolver. Before this if you revoked your OAuth with Helyx on GitHub page, Helyx would think that it is still authorized to your GitHub account, now it checks it and if you revoke it online, Helyx will disable functions that are only accessible when you are authorized via GitHub.
Slowly, but surely We are almost at the end (if no other function to add will come to my mind) and I was messing with access modifiers, accessors, refactoring names of variables, Tasks, voids, properties. I was adding exception handling keywords and many ifs to make sure there will be no bugs and that almost every exception will be caught. I was doing this manually so I might have missed some places where the exception handler is needed but yeah we shall see! I also enabled a search bar, so when you will be looking for your project in Helyx and you have many projects added, you can search for yours! I was also changing styles of my old menus and theirs logic because they weren’t done very well in comparison with style that I am using now… Funny story: while I was messing with the access modifiers and accessors I actually bricked the whole Helyx, because functions that were supposed to resolve configuration file and read/write into it couldn’t. I thought I accidentally removed something important but at the end it was just that, that I was changing the access modifiers and accessors.
Settings and Git pages are receiving more stuff! I added for Settings page: Notes Settings Updates and for Git page: Undo Commit Redo Commit as the name says, Notes Settings are for changing properties of global Notes on every project. There is only one setting that came to my mind and that is encryption. Some of you might paste into it something personal or confidential. Well, this makes sure that these info CANNOT be taken from raw file, but from Helyx directly. (thinking about adding password mechanism lol) Updates, yeah, it looks for updates for Helyx . Undo Commit is a special one, when you commit something and for some reason you want to go back you just undo it. On the other hand, if you somehow accidentaly clicked on Undo Commit or now you want to redo the undo, you can with Redo Commit. My plan now is to add again more functions, such as Custom Badges, option to sync the Custom Badges with your GitHub repo (it will pop up in README.md) and also add Tags sync, so you can edit your repository’s Tags via Helyx. Oh yeah, also going to add custom project status because some people may say that having statuses such as “Active”, “Inactive”, “Paused”, “Archived” is limiting (custom ones will yes, also be synced with GitHub). :) I also mustn’t forget to add the translations for other languages. I am going to do this at the end due to new text appearing every time I add something new.
Adding Custom Statuses, Custom Badges and even more! Here we are again! Today I added: Custom Statuses Custom Badges WIP: Sync badges with GitHub repository Sync topics with GitHub repository My original status system for projects was a hardcoded enum with statuses “Active”, “Inactive”, “Paused” and “Archived”. Then I had a lot of switches which determined color of markup based on which enum it is hah. As you may already know, enums cannot be changed in runtime :) What does that mean? That users cannot add their own statuses in Helyx directly… They would have to hardcode into Helyx their own statuses and that’s just impractical, no? That’s why I spent below mentioned amount of hours redoing so many things to make it actually work and I even learned something from this! That JSON Parsers and Colors are NOT huge friends! (genuinely, I HAD NO IDEA why it wasn’t working until AI told me that JSON parsers cannot translate Color structs). Custom Statuses/Badges currently have Add/Delete functions and right now I am going to add also Edit function, so when you accidentally create a status/badge with wrong color, you don’t have to delete it and create it again :) (just saved 10seconds of your life). I also recategorized my whole codebase with help of Claude Code. I told him to review my whole codebase and suggest what classes, enums, interfaces should be in which files and those files in which folders. It was fun, finally something where I did not have to concentrate much and chill and watch something when doing it. Well, now it is not much fun when functions that I was using are in different files and some classes have different names. But at least my codebase looks more professional! (before this I had like 10 files with a bunch of lines where classes were stacked…) Also, about the WIP stuff above… Sync badges with GitHub repository is going to be something like the Sync status with GitHub repository. It will just pop up in your README.md based on where you put the headers which Helyx will give you for that specific badge. Sync topics on the other hand are classic topics of the repository which you can see in top right corner of your repository page. It will mostly show you which topics are assigned to your repository in Helyx but I’ll make it also so you can assign/unassign topics from your repository. I’m thinking of adding more GitHub Synchronization options, but none are currently coming to my mind. Maybe something with actions, no idea yet, or local AI that will explain to you errors given by Helyx when you will be trying to do something. We will see!
Never expected it to be this hard So the last days I was again changing the structure of my solution and trying to get on with it. It took me a while to create one that Claude agrees with and is good for such open-source projects. Anyways, this was the easy part. In my last devlog I said that I completed Custom Statuses & Custom Badges. Well… I did! But then I found out, that my system was bad… and when I say bad I mean it wasn’t thought out. I found out about all of this when I finished the edit action for both. Originally I used Dictionary<string, TagDefinition>. Key was name of the Status/Badge and TagDefinition was the class of one of them which also has name property. But Helyx was not prepared for this, so for the last days I redid the whole system eight times. Once I used Dictionary, once I used List, then HashSet, then Dictionary, then Dictionary with other types and so on. I just couldn’t settle on the correct type for it. Until now, it took so long even though it is so primitive because it simply didn’t come to my mind and when I was asking Claude for suggestions of how could it be made, it didn’t think of using this type. The final type is simply… Dictionary<Guid, TagDefinition> AND A LOT OF CHANGES. Yeah… don’t worry guys! I am totally devastated by doing this over and over even though it was so simple & primitive to do. Well… maybe not really primitive because the changes were also difficult to do. I mainly didn’t want to use the GUID system because I have Custom Statuses but also Built-in Statuses and I was really worried about Built-in statuses having GUID assigned to them. Those sync options with GitHub are still in work, but I finished the GitHub Repository Stats viewer after a lot of experimenting with layouts and designs/effects/colors. I’m looking forward to the next devlog guys! I hope Helyx will be your good coworker that will actually count for something hah! P.S.: I also made that text of colors is grammatically formatted. At least it should be…
Sync finally done!! It’s 5 AM and I finished “Sync badges with GitHub Repository” and “Sync the status with GitHub repository” (this was already done, but with the enum version of status). I added also a few fail-safes so when you assign some badge or status and then delete it, it will also delete it from GitHub and project. Now it won’t be a ghost that you cannot get rid of haha. This was a little more difficult than I expected to do, the fail-safes because the local changing mechanism and syncing mechanism were written inline in the same function. The only thing that was dividing them was an if statement. It was interesting to make this. To make sure everything will work fine. Even though it didn’t MANY TIMES. Now I will focus on syncing GitHub topics. Wish me luck! P.S.: Forgot to mention, that I have to add this “On Status/Badge Edit, ASAP sync with GitHub” with Edit. I almost forgot lol, just came into my mind. I hope that COPY+PASTE will be enough and I won’t have to create another syncing system specifically for edits…
More bugs are appearing, and being fixed!! So since Helyx is already far and has many advanced functions, it also has some bugs. Today when I was experimenting with assigning a project and syncing it with GitHub, I found out, that if you try to sync the projects in a wrong way… it will not work. For that reason I added more fail-safes to make sure that this will be eliminated. I can’t confirm yet if those fail-safes work, because I am also working on a new Diagnostics action in Git Actions so if something goes wrong, you can fix it by the error Helyx gives you. Right now my testing project is in a state of “Git corrupted” (no idea what I should call it) where rebase was aborted. Because of this, I had to put the “GitHub Sync Topics” synchronization off until later, so I can focus on fixing these major bugs. Also another bug came to my mind that I fixed… Helyx works on a principle of directory paths. Each project is saved in config file under its own unique GUID and its path. The bug is that when you try to rename the directory, the project won’t be found and it will be removed from Helyx. Now, you can either let Helyx find it automatically (sadly can easily fail) or you can select project manually in explorer (recommended!!!).
Doctor Git As you may know, right now I am working on Diagnostics. I am almost done with fully displaying all of the health checks about your Git repository. But I still have to finish all of the fixing actions that it will have. Diagnostics will mainly be for a case where something happens in Helyx and it will need to be fixed. The main idea of it is not aimed at resolving issues with your Git repository outside Helyx. But it may resolve some because you may run into the same issue as you had in Helyx of course. In the last devlog I said that I put GitHub Topics off. Well, that did not happen! I finished displaying GitHub Topics!! I think in some devlogs I said that it was for managing GitHub Topics. Managing meant like adding, removing, editing. Well, that wasn’t actually my main point. I just wanted it to show you your currently assigned topics in GitHub. I also didn’t see a big reason in adding Add, Remove, Edit functions for topics. Topics rarely changed, honestly and the most intuitive way would be doing it via GitHub web interface.
Diagnostics done, other stuff too and some changes! Diagnostics are now fully done! When something messes up, it will give you options to fix it! Some time ago I created GitHub Synchronization settings for managing what to sync with GitHub, so what to retrieve and send with those options: Sync status with GitHub repository Sync badges with GitHub repository Fetch GitHub repository topics Fetch GitHub repository stats Use GitHub’s language detection instead of Helyx’s I created a brand new tab called ‘GitHub Actions’ where this setting is. GitHub Actions is meant to contain all of the actions that are mainly linked with GitHub endpoints. I kept few such as Push, Pull, Sync in Git Actions due to how the layout is already created. Also I added when you are rebasing and it fails, it automatically gives you a prompt to cancel it. So repair it… GitHub Actions will contain a new stuff that will come to Helyx! Managing Issues and Pull Requests!! Maybe also workspaces/actions but I will see how difficult that is and how it is needed/useful in Helyx. Another new function is, that when there’s an update for Helyx and I change the GitHub OAuth scope because of new features… Helyx will warn you and tell you to reauthorize to make sure every function will work correctly. Before this change, Helyx was using its folder name as a name of the project and as a repository name for GitHub. Now, when you add a project to Helyx, Helyx will ask you what’s its name and when you will try to use some GitHub function for the first time on your newly added project on Helyx, it will request a GitHub Repository name from you. ;) There’s still a lot of things to add. Honestly I thought that Helyx was at the very end like 50 hours ago and look! There are many more functions to add haha!
Manage Issues, at your service. After a painful development period I am again here, writing devlog! What changed? Good question! Manage Issues is partly done! I still have to finish making the actual actions but displaying is somewhat finished. When you go to ‘Manage Issues’, you will firstly see a list of issues that are on your GitHub repository. From there you can already see some details about the issues such as: Number State Title Labels Comments (number) Updated (time) Above them are filters, currently those are the available filters: All -> All Commented -> Issues has some comments Assigned -> Issues that have some assignees Labels -> Issues that have some labels But that is not all! There are also their counterparts: No comments Unassigned Unlabeled (there’s no inversion of All because why would you need filter None) Yeah, so you can invert your filters… When you select an issue at the very top you will see its number, then you will have a panel with details about the issue with its title and: State Author Opened (time) Labels Assignees Right under these details are all of the comments in chronological order. When it is done, it will also show the whole timeline of each issue. So when this and this label was added/removed… when was this assignee assigned/unassigned… when was this issue closed/opened…. Of course I am going to add actions so you can add a comment, close issue, open issue, etc… When I’ll finish Manage Issues, I will go to work on Manage Pull Requests. It shouldn’t be that different because Pull Requests are by GitHub a kind of Issue but they are also not the same, so different classes, types, etc… Well, wish me luck people… or should I say… Stardancers?? P.S.: Sorry for the grammar in images in comments. I did it very quick for the preview.
Paging done, functions almost! I finished making the logic for rendering issues. In the last devlog it was just displaying all of the issues at the same time. No paging system so if there was a lot of issues or long issues, they would simply… not appear. It took me a really long time to work this out. I was mainly switching back and forth the rendering logic all the time and it went so far, that I had to use Claude to help me with it. At the end, I ended up with a rendering logic that I am not really keen on, but it is the best one that can be used in Helyx and TUI environment. Main obstacles were the Spectre.Console rendering functions and classes that were under IRenderable interface. And also the limitations of Panels, Grids… Layout had everything I needed . I wanted to cut the part which couldn’t be rendered and it should have looked like, like an unfinished Panel. Well, this was impossible. Without changing the core code of Spectre.Console or creating own system for making Panels it was impossible. Also, I haven’t seen it as something that WOULD NEED an own system that would render comments. So I just made it when a comment cuts, it creates whole Panel with part of the comment that can be rendered and at the bottom is text saying that it continues on the next page… and on the other page at the top there’s text that, hey, it continues here! Let’s finally talk about the Issue functions! I finished some simple one like: Close Reopen and create an issue… But I still have to create a system that can let you: Comment Edit comments Delete comments Lock issue Unlock issue Those are currently in WIP, but in the next devlog they’ll be most probably finished and after everything is done with issues, I will move to Pull Requests!
Manage Issues, completed! PRs, incoming… Manage Issues is now fully completed. I still had a few issues with paging and rendering but now they are fixed. Now you can select a message and delete it & edit it. But also now you can create a comment, lock an issue, unlock an issue and create an issue. I also added a thing that I hope will be appreciated, Helyx renders Markdown from GitHub Issue comment and when you comment via Helyx, Helyx gives you Markdown options such as: Bold Text Italic Text Code Text List Quote Also, when you don’t provide a text to a comment in GitHub, Helyx will say that “No description was provided.” So the same thing as GitHub already does, but in Helyx you must provide text. Why? Because why would you create a comment with no text? So I banned adding a comment with no text. Okay, that would be everything! It was fun to create this because everything was working so well, except the paging system… that was painful to make even with Claude’s help. As I said in past devlogs, after Issues I am going to move to PRs. So yeah, let’s work on PR. I hope it won’t be harder to make, because a PR is a type of Issue in GitHub, so I hope I will use the same function logic and functions and callbacks to make it.
Manage PRs displaying and some logic done After pulling another all-nighter I finished making the Pull Request display functions. List and details about each Pull Request is done and paging also works too (took it from manage issues ;] ). Pull Requests also contain filters such as: Open Drafts Assigned Reviewed and we can’t forget their counterparts either: Closed Ready Unassigned No reviewers Pull Requests now have comment selection and Markdown formatting, but functions to manage Pull Requests are not done yet. The only ones I managed to finish are: Comment Open Browser The biggest problem with PRs is going to be, that their functions and methods for executing those functions are more complex than the ones for Issues. I plan to add these functions for PRs: Delete Comment Merge Review Close PR Reopen PR I am pretty sure that all of this will be done in next devlog, so stay updated! This is going to be very cool, I think. Well, now I am going to sleep so good night everyone!
Manage PRs done! Added few new things… I finally finished making Manage PRs. So now you can: Delete Comment Merge Review Close PR Reopen PR I also had to fix some design flaws and function flaws but now it should be all good. Before doing all of this, there was a bunch of GET requests… now? Now it is also a bunch of PATCH & PUT requests. Also, now when you’ll try to link your GitHub Repository with the local one, you will just select the one that is on your GitHub account. Another thing! When you have conflicts between the local repository and the remote one (GitHub) and you try to sync them, a lot of the time Notepad pops us and tells you to remove the version of the text that you don’t want. Well now Helyx does it too and doesn’t open notepad, but lets you do it directly in TUI interface in my very own notepad. Conflict solver also uses alternate screen for this. (there’s sadly no showoff image for this, because currently I don’t have anything to create a conflict on) I am not sure what to do next in a next devlog, since everything I really wanted to do is already done… well… not everything but everything around the main things is. Maybe I’ll move on another refactoring? Or finishing the language settings? Well, we will see!
Adding new features & fixing bugs I finished making “Analyze Project” which analyzes your whole project and prints stuff such as: Number of files Number of folders Size of the project on disk Number of lines Also you can now see what amount of what programming language makes your project. It also shows you the biggest files in your project directory. And also you can see Git information such as: Branch Number of commits First commit (date) Last commit Working tree .git size So it displays some maybe important and basic information that you may check sometimes or might be interested in. There were like 6 revisions of this because I was testing different styles & designs. I also found a lot of hidden bugs with help of Claude! Before talking about bugs, I will tell you something about new features that I added. Now, when you assign a badge or change a status and you don’t have markers in README.md yet in it, then it will ask you if you want to add them manually or via Helyx. What does that mean? Well, it opens a “text editor” in Helyx which displays README.md and you can insert the badges/statuses where you want instead of opening the file in notepad and inserting the markers manually. Overall it is way quicker to do it now via Helyx. Helyx’s Generic Text Editor is now even better! You can now use all of the arrows, before you could just use Left/Right Arrow to move cursor left or right. Now you can move between lines. Now you can also open your project’s wiki via Helyx. Be aware that it doesn’t check anything, if you have wiki or not. It directly opens the website for the wiki where it should have been for the current linked GitHub Repository. Let’s talk about bugs now! Open an issue called the Markdown handler function and it was accidentally calling GitHub 101 times, when it needed some info. Now it doesn’t. 🆒 Notes have an encryption system, so if you put some sensitive info into it, it couldn’t be directly taken from the file. Only via Helyx. There was a bug, where when you enabled encryption and edit notes of 2 projects, then you turn off encryption globally and open the first project’s notes, it decrypts… but after that you open second project’s notes, it won’t. This was due to having a global bool instead of per project bool when saving if it was encrypted. Fixeddd! Another bug! Sync Status & Sync Badges was deleting staging index. Funny that I was thinking about to restore the staging index whenever using it, but at the end… the logic was wrong 😭 Now it isn’t. Then there was a bug that when you unassigned a badge, it unassigned ALL badges. Fixed! Another bug linked to badges… Unassigning a badge didn’t remove it from GitHub. Yeah… fixed!!
Fixing more bugs I fix bugs mainly with use of Claude Code, because hunting for bugs is not easy and this project is not a small one haha. I had to run MANY code review tools for this, because every time it kept finding new bugs. No idea how but it did. So what we fixed? If a GitHub comment had bold text split across two lines, opening that issue crashed Helyx before it drew anything. A file with a square bracket in its name (e.g. data[1].json) crashed Status, Diff, Commit, Stashes and Log. If anything held config.json open for even a moment, Helyx assumed it was corrupt, reset it, then crashed everywhere that looked for a project. If config.json was missing its Badges section, the startup migration quietly deleted every badge from every project. Committing saved a copy of the project taken before the confirmation prompts, so anything changed in between was silently thrown away. If you linked a GitHub repo during Push, the remote was created with an empty name. Syncing a status that had since been deleted crashed in the middle of a push. A commit message containing a square bracket crashed “View Full Message” (those are just bugs that were missing Markup.Escape() function). Applying a stash said “applied successfully” even when it conflicted. One bad path stored in config.json crashed “Add Project”. This is just a snippet of the amount of fixed bugs. I won’t write all of them here since it would take a lot of text and I am pretty sure that this is enough for you to understand that we fixed a lot of bugs haha. Right now I am going to do the Language System. I am not sure if I mentioned in some devlog, the list of languages that Helyx will support. If not… there it is: English Slovak Spanish French German Russian
Languages almost done, moving onto GitHub & README.md Well guys, Language System is almost done. It is powered by a Resources file that stores all of the translated strings. More bugs were found! But now, all of the bugs should be fixed with also many failsafes! Now, I want to complete the Language System because I am really close to finishing it. I also want to make the README.md for Helyx’s GitHub Repository. Originally I wanted to make it via Obsidian app, but it doesn’t have direct support for Wakatime, so I have to use VS 2026 native Markdown editor with the support of Markdown Editor v2 extension from Mads Kristensen. (not sponsored lol) I also heard that Obsidian app doesn’t use the same Markdown as GitHub does so there would be some things mistyped or not even rendered, but VS 2026 should be fully compatible with GitHub’s Markdown renderer, so we will see!
More bugs fixed, new functions, README & Language System updates! Hello guys, once again at 4 AM! Bugs: As the title says, there are more fixed bugs. Diagnostics crashed Helyx if you ran a rebase in a terminal and hit a conflict. Now it doesn’t! Another fixed bug is that when you opened an issue in Helyx, the footer vanished. At first I was shocked, but it was a simple fix so now your footer doesn’t vanish. Another vanishing bug! The Languages row from the header vanished when you entered a tab where Layout class was being used. Now you will see your sweet programming languages used in your selected project. Guess what! Another vanishing bug! This time the whole header vanished when you exited .Live()! Now it is okay! New behaviour: I unified some color codes with some type of info. E.g. SHA is Dark Orange everywhere, Stash is Yellow, Date is Cadet Blue and Issue Number is Aqua. The README.md editor, when inserting badges/status now has a new keybind: backspace! It is different from DEL! DEL deletes the badges/status but backspace deletes the whole line, including the badge/status that was on that line. README The README is almost done! At least I hope! Claude was a big help here, because I wanted to create an insane README and we really did. Guys, you should be excited about the README file haha! Language System Translations for these languages are already done: English French German Russian Slovak Spanish So basically every language translation is already done. BUT I decided to add even more languages! The new languages that Helyx will support are: Italian Portuguese
New features, new languages, new problems. A new feature that I added is GitHub Actions! It is on the same principle as Manage Issues and Manage PRs, so you have a list of GitHub Actions, you pick one and you can control it, check its log, observe information about it. You can even run an action! I also added a refresh keybind to Manage Issues, Manage PRs and GitHub Actions. Before, you had to go back from the details of an issue/PR/action to the list and then return to the details. Now you don’t have to. You just have to press the keybind displayed in the footer that belongs to refresh. Yes! The Helyx Language System is finally complete! Italian & Portuguese are now available in Helyx! Lately I’ve been working on the README.md file. I was mainly making more GIFs & designing screenshots for it so it will look pretty and futuristic (in my opinion)! As I have mentioned in the title, NEW… PROBLEMS! People… you won’t believe what happened to me today… I use Helyx’s Git & GitHub for testing, so there is no official one yet, and I rarely commit changes or push them. Only when I test something. And it looks like it got back at me. Well… I told Claude Code to remove comments all over my codebase, because they were mainly scrapped code and some temporary information that I had there, that wasn’t used anymore. Okay, so I told it to remove them, and for some reason instead of removing comments, it deleted Helyx’s whole codebase. Thank god README.md was untouched haha. We had to decompile the .dll that was left over from testing Helyx’s latest version, and actually check the diff and rewrite it. We still don’t know if everything was brought back since for some reason Claude Code’s memory got wiped instantly when it realized that it deleted my whole codebase. There were no backups, no restore, no nothing. The only possible thing was to use the forgotten stash that I created and use the .dll as a map to restore Helyx’s outdated codebase and rewrite it again. So that’s what we did. Yeah, so I hope everything was brought back. Claude says it was, but after what it has done I don’t know if I trust it. Just kidding, everything should be back, because it compared the .dll with the rewritten code 1:1 and everything matched.
GitHub done, shipping Helyx today! Today I was messing with the GitHub page for Helyx, fixing the last bugs we found and working on the installer. For the installer I used Inno Setup, because it is the most recognized and the most used one. The point of using an installer is simple: it adds Helyx to PATH. Of course there were other options, but this one seemed like the best fit. We were fighting with the script for a while, because it was doing really weird things, like staying in the background after the installation finished. But those bugs are fixed now! README.md is done, all of those GIFs and screenshots are in it too, and I have to say it looks really good! I was also setting up the GitHub side of things, so the description, the tags, a GitHub Action and so on. With the help of Claude Code, we created the logo and the banner for the installer as well. The installer uses the same logo as Helyx. It’s just a basic H, because nothing else came to mind haha. I also asked Claude Code to review the codebase one last time, and yep, it looks fine! I told it to add the basic documentation comments as well, the <summary> kind. Let’s be real here, nobody does this, and if they do, something else writes it for them, usually an AI, because it understands the function better than the person who wrote it (I know that from my own experience hahaha).
Experimenting with the conflict solver I was thinking about adding a simpler conflict solver, where you wouldn’t have to delete the <<<<<<< , ======= and >>>>>>> markers yourself but would just pick either the first or the second version. But I realized it would be messier than I thought, so in the end I kept it as a basic editor where you remove the version you don’t want by hand.
README.md update I replaced the title in README.md with a banner that contains the text Helyx. I tried a few versions I made and, well, I landed on the one you can see in Helyx’s README.md, or below!
Edited README.md I rewrote the README.md because of the ship review. I also added a couple of recommendations that are worth knowing when you use Helyx. I also removed the <summary> comments that Claude Code wrote for the documentation, I don’t think that anyone would have used them anyway.
Edited README.md, again I was again editing the whole README.md, because reviewers weren’t happy with the current one. Well after spending another hour of editing the whole README.md file, I hope they won’t ask me to rewrite the whole README.md file again, because I don’t even know what else to add/remove/edit.
Added GitHub Issues/PRs events rendering Originally, when you selected Manage GitHub Issues or PRs and opened some issues/PR. You could have only seen messages posted by users, but not when a label was assigned or when the issue/PR was closed. Well… Now you can! Now it displays the exact action that happened and when it happened! Of course, it is also translated to all languages that Helyx supports. Just making sure you didn’t think it wasn’t! I also cleaned up the code a little bit. Removed some useless usings and some files were in the wrong namespace, so that is fixed too.
Replaced hardcoded string colors with Color members for code safety, fixed line breaking while assigning a status/badge Okay so Markup texts (those are the texts with color) were formatted in this format: "[red]Hello World![/]" So it was string-based. And if you accidentally added some character to it for instance: "[redd]Hello World![/]" <- Exception Helyx would crash. I mainly added this, because it is an open-source project. So if someone tried to edit it, they would only have to edit the string and they might have misspelled it. But now, when he goes into the codebase, he will see Color members and he just can’t misspell that, and if he would, compiler would alert him. Basically, now it is like this: $"[{Color.Red}]Hello World![/]" Okay so next I fixed line breaking. What does that mean? Well… In Helyx native README editor, so when you try to assign a status/badge, you’ll get that editor, when you try to add a status/badge to that line, you might have thought that it would be on the same line as the tags above it. But it didn’t… This was happening due to the comment markers for Helyx so Helyx knows where this status/badge is located and which status/badge it is. Now Helyx will put those comment markers in a way that prevents the line from breaking.
Reviewing my codebase and fixing bugs Since all of the features that Helyx was supposed to be finished with are almost all done (maybe even all are done), I will now change my view to another projects for Stardance such as ThetaNexus . But that does not mean that now I will just forget about Helyx. I will be reviewing the codebase sometimes to find some bugs and fix them. You can help me with this, by making an Issue request on Helyx’s GitHub. So what bugs did I fix since the last devlog? I fixed line breaking in badge/status README editor. When you were inserting your badge/status into your README via Helyx’s README editor, it done… messy stuff to the README, not something like really bad what couldn’t be fixed by manually doing it, but it should now insert the badge/status exactly as you see it in the editor. I also introduced a new ‘Found state’ text instead of ‘Found’ text in IDE settings to avoid confusion. To avoid confusion because if an editor was found and you clicked on it… it wrote this: Found Found Found Not Found Found Set by user Now it writes this: Found state Found Found state Not Found Found state Set by user Most of the time, I was reviewing the codebase via Claude Code to actually check everything precisely.
Fixed User Scripts bug So, every path block used Path.GetFullPath(path) instead of Path.GetFullPath(path, script.ProjectPath) . That means it was resolving relative paths against Helyx’s own directory, not your project’s. This is now fixed.
Hackatime integration Hello there! A guy made a feature suggestion on Helyx’s GitHub, that I should add a Hackatime integration into it. So I was thinking… and thinking… and thinking and woah… I ADDED IT! It is not 1:1 like the web interface, that one is better & shows you more things but sadly this was everything that I could request from API (at least I think): Total Seconds Languages Repo URL Total Heartbeats First Heartbeat (DateTime) Last Heartbeat (DateTime) and when combining all of these information, I created a screen where you can see all of this specifically for your project. It works on the principe of authorization. You put in your Hackatime token which authorizes you and then when you go to your project and go on Hackatime Info, it prompts you to select the project from a list of projects that are assigned to your Hackatime account/token.
Ships:
What I made Helyx is a terminal app for Windows that keeps every local Git repository you own in one place and lets you commit, branch, resolve conflicts, repair broken repositories and answer GitHub Issues and Pull Requests without opening anything else. I spent a lot of time thinking about what kind of project I wanted to build. I wanted something that would be genuinely useful to developers in many different ways, and that is how I came up with Helyx, a TUI application that brings many Git and GitHub tasks into one place. What was challenging Learning new libraries, keeping the code organized as it grew, and designing every screen so it looks and feels as polished as I could get it. Deciding what to build next was harder than it sounds, because there was always more that could go in. What I am proud of It has everything I originally planned to include. The diagnostics screen finds what is wrong with a repository and offers the fix instead of just reporting it, the conflict resolver opens the conflicted block in its own editor, and the whole app speaks 8 languages. How to try it Download the latest release from Helyx’s GitHub and run it. It installs into your user folder and adds Helyx to your PATH , so you can start it by typing helyx in any terminal. No administrator rights are needed, and the .NET runtime is bundled inside. Then pick Add project and choose any folder that contains your project. Helyx is open source, so you can also read the code or build it yourself. Just click See source code below....
|
1792810518.606234
|
1792896918.606234
|
|
10673
|
DimeTrack by @d3monas | Stardance
|
d3monas
|
3
|
325.0
|
2960
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-18T21:44:49Z", "hours": 123.0, "multiplier": 16.88, "payout": 1039, "blessing": "neutral", "text": "DimeTrack is an open-source personal finance manager that helps people manage their money entirely in a browser. There are no accounts or subscriptions required and your data is stored locally on your device, with an OPTIONAL cloud sync if you want to access it across devices. Since my second shipment, the project has grown even further. I read every single review and Implemented all the suggestions that were provided. Made an optional cloud syncing feature that allows users to access and use the app across multiple devices. Made a small tutorial/guide that provides a bit more information on how to use DimeTrack. Replaced the Calendar tab with a new Timeline, that shows all your recurring transactions in your selected time interval, your projected balance and an ability to add a safety net and see if your projected balance falls below it in the coming months. Added an ability to manually track your Investments. Even more customization options and many other things. Similar to my previous shipments, the biggest challenge was to keep everything synced. One feature depends on another, so adding new functionality means that I have to update existing systems to ensure that everything stays working. I’ve somehow spent 325 hrs on this project and this will probably be my final shipment. I’ve had a lot of fun working on it and hope to maybe sometime later. For the v3 you should try to: Complete the tutorial (If you have used DimeTrack previously, go to settings -> data -> clear all data or just use incognito window) Add some recurring transactions and test out the Timeline to see your projected balance Explore the new subscriptions tab Set up cloud sync Add some Investments, update their price so see how your portfolio value goes up or down Check out the new financial insights in the Overview tab Use the Command Bar at top middle, you can find some quick actions there, search for any transaction or even create a quick transaction by typing in the search bar - Amount, Description, Existing Category (for example: 5 Coffee Food (must have a category called Food)) Explore the keyboard shortcuts Do a few achievements Create a few transactions and test out the bulk editing options", "repo": "https://github.com/d3monas/DimeTrack", "demo": "https://dime-track.vercel.app/"}, {"ship_num": 2, "ts": "2026-07-24T18:06:38Z", "hours": 174.0, "multiplier": 18.83, "payout": 1539, "blessing": "neutral", "text": "DimeTrack is an open-source personal finance manager that helps people manage their money entirely in a browser. There are no accounts, subscriptions, servers - everything is stored locally on device. Since my first shipment, the project has grown significantly. It now supports accounts, transfers between them, split purchases, multiple savings goals with contribution history and target dates, budget limits, auto-categorization rules, cash flow calendar with forecasting, monthly spending reports, net worth tracking, customizable categories and accounts, JSON backups, CSV import & export and many other quality of life improvements were made during the many hours spent on this project. The biggest challenge was keeping every feature synced as the project grew. Transactions can affect accounts, budgets, savings goals, recurring payments, reports, charts and basically everything. Adding new functionality means that I have to update existing systems to ensure that everything stays working as intended. But I’m proud to see how much my project has evolved and grown. You should try to: Create multiple accounts and transfer money between them Add income & expense transactions, try the split transaction function Set up a few savings goals with target dates and see how the contribution suggestion feature works Customize categories & accounts with icons and colors Configure budget limits and see the warnings that It gives you when nearing the limits Create an auto-categorization rule Explore the cash flow calendar Try exporting your data to JSON", "repo": "https://github.com/d3monas/DimeTrack", "demo": "https://dime-track.vercel.app/"}, {"ship_num": 3, "ts": "2026-06-18T11:37:29Z", "hours": 28.0, "multiplier": 13.41, "payout": 382, "blessing": "neutral", "text": "I built DimeTrack, a personal finance & budgeting web app that helps users to track their income, expenses, manage custom spending categories, create budgets & save toward their set goals. The application store data locally, allowing users to use it without creating an account. One of the biggest challenges was managing the app as it grew. Features such as recurring transactions, savings goal contributions, budget tracking & categories all interact with each other. Ensuring that data remained synced required lots of testing. I’m proud that I built DimeTrack to have so many features, I’ve never built anything quite like this. To test DimeTrack: Try to create some categories through the settings menu Add income & expenses Create a savings goal and try to contribute to it Set budget limits Try recurring transactions Search & filter your transactions (transcations can be searched by description, amount or category) Export your transaction data using the CSV export feature (if you only want data from let’s say todays transactions, apply a filter) Refresh the page with all the data, to confirm that everything is saved. No accounts needed!", "repo": "https://github.com/d3monas/DimeTrack", "demo": "https://dime-track.vercel.app/"}]...
|
[{"post_id": 49906, "ts": "202 [{"post_id": 49906, "ts": "2026-08-18T21:22:02Z", "hours": 5.8847, "text": "Worked on a custom date picker for the Timeline, so now instead of being locked into 7-day, 1 or 3 month views, users can now view any custom date they want. Created a financial safety net, where users can set a minimum balance and if your projected balance drops below it, a warning banner appears. Updated the auto-sync feature and made it truly auto, all users now need to do, is just enter a password once. Finally, did a final test of the app, fixed bugs, updated the landing page and the GitHub readme"}, {"post_id": 48713, "ts": "2026-08-17T07:13:40Z", "hours": 5.0786, "text": "Today, I worked on more Quality of Life features for my app, first of all - Introduced Keyboard Shortcuts, you can open the Command Bar with CTRL + K, add new transactions with ALT + N and switch tabs with ALT + 1 through 6. Created a small dialog that shows all the keyboard shortcuts available. Another feature - Transaction Presets. You can now create a preset for your most used transactions, just fill out the add transaction form as usual and instead of pressing “Save Transaction” just press the new Bookmark icon, then at the top your preset will appear, next time just press on the preset and everything will be filled out for you. Fixed a few tiny UI details, optimized mobile design, fixed a bug where the quick-add suggestion bar hardcoded a $ sign regardless of your selected currency. Finally, when creating a new transaction through the quick-add feature, you must now include a valid category otherwise the app won’t recognize that you are trying to add a transaction."}, {"post_id": 48036, "ts": "2026-08-16T10:16:00Z", "hours": 7.9572, "text": "Today, I Improved the “Smart Stats” feature with a new “Insights” tab. I didn’t want to create a new tab just for the Insights, so I decided to Implement the new feature in to an already existing one. Insights display your spending pace, give budget warnings, alerts you If your Net Worth & Savings are trending up or down and gives your Goal Projections without you having to navigate to the Goals tab. Also, replaced the default browser confirmation dialogs with custom ones, updated the tabs list design to a bit more modern one and made the tabs list stick so when you are scrolling down, your tabs list will always be accessible. Finally, fixed a few small bugs and a major budget rollover bug that would instantly roll over your budget without checking, if you even had a budget limit previously."}, {"post_id": 46940, "ts": "2026-08-14T14:40:05Z", "hours": 7.0375, "text": "Today, I’ve updated the command bar navigation to include the new Timeline and Investment tabs and with that also created a quicker way to add transactions - To create a transaction quicker, In the command bar all you need to do is type the amount, description and optionally category and account (for example: 9 Breakfast Food Checking). Also, reworked the transaction list and added abilities to select multiple or all transactions and bulk change account, categories, type or bulk delete transactions. Added ability to restore your transaction, if deleted accidentally. Finally, added an ability to duplicate transactions If needed."}, {"post_id": 45842, "ts": "2026-08-12T15:51:41Z", "hours": 9.6678, "text": "Today, I created a fun new achievement system which currently features 12 achievements. In the achievements page you can see all of them + progress tracker towards them. Upon unlocking an achievement, you will receive a notification in the bottom right corner of your screen. All achievements are saved locally, included in JSON backups and sync seamlessly. Also, fixed some localstorage and JSON backup issues and fixed a bug that when clearing your data, your investments would not clear."}, {"post_id": 45096, "ts": "2026-08-11T11:17:58Z", "hours": 6.7625, "text": "For todays update, I’ve worked on customization more. In settings, added an ability to turn off selected widgets that you do not care about. Turned off widgets will not be shown in the Overview tab. Also, I’ve done some more work to the Timeline tab, after each recurring transaction - your projected balance will show now, added an overdraft warning, so if your projected balance dips below 0 on a specific day, the chart will show a red zero-line and a warning banner will appear. Made the 3-month view sorted into groups by month, so Its easier to differentiate by month. Finally, I updated the exporting/importing and cloud syncing to make sure that everything is properly synced and no errors occur."}, {"post_id": 44522, "ts": "2026-08-10T10:42:39Z", "hours": 6.9944, "text": "Made some small improvements to the Investments tab and added a “Portfolio Performance” chart, which tracks how much you invested vs how much your portfolio is worth currently. Other than that, I completely reworked the Calendar, which is now called - Timeline. Instead of a Calendar it now shows your 7 day, 30 day and 3 month timeline with a projected balance, a projected balance chart and upcoming recurring transactions. It it somewhat similar to the calendar, however the whole UX is much more simpler and cleaner. Finally, I fixed some math calculations."}, {"post_id": 43894, "ts": "2026-08-09T10:37:55Z", "hours": 6.7469, "text": "Reworked the Investments Tab. Now you can properly buy/sell/update your investments to keep track of your Profit & Loss. When creating a new Investment, first of all, you will be able to select what kind of asset this is (It can be Stock, Crypto, ETF or Other). After creating an asset, you can buy/sell/update your asset. When buying, enter the quantity, price per date and set a date when bought. After buying you will instantly see your new updated portfolio value & how much you have invested. If you want to see your Total Profit & Loss, update your asset prices."}, {"post_id": 42550, "ts": "2026-08-07T11:27:13Z", "hours": 7.3378, "text": "Another requested feature was cloud syncing or login so It was easier to use DimeTrack between multiple devices. I built a cloud syncing feature with Upstash. Basically, your data is still encryped and nobody except you can see it. Also built an auto-sync feature so any time you add a transaction, update a budget, create a goal or do anything, the application waits 3 seconds and pushes your updated data to the cloud. Finally, did some minor settings UI changes to the tabs are less cluttered, especially on mobile screens. How to set up syncing? Open Settings and navigate to the new Sync tab Under “Start New Sync” create your password and enable syncing The app will generate a unique Sync ID, save this ID On your secondary device: Open Settings and navigate to the Sync tab Under “Connect to Existing Sync”, paste your Sync ID and enter your password Click Pull Data & Connect and your data will be downloaded. Auto-Sync is now active on both. Auto-Sync is only active until you refresh your browser. After you refresh your browser, you will see a banner saying that Auto-sync is paused. To unpause - enter your password again. *This sync feature is completely optional"}, {"post_id": 41530, "ts": "2026-08-05T19:59:50Z", "hours": 9.8156, "text": "Since the last devlog, I created a new Investments tab, where users can manually log their assets, mark them as Recurring Investments and update their values. Also, the total asset value is automatically added to the user’s Net Worth. For now, this investment tracker is very simple and I will be expanding on this feature a bit later. Most of my time during these few days was spent, trying to figure out how to connect Upstash to my app, so users can sync their data between devices, while I still keep DimeTrack fully serverless."}, {"post_id": 40251, "ts": "2026-08-03T17:32:22Z", "hours": 9.4694, "text": "I’ve read the reviews of my previous ship and a few users suggested that I create a tutorial. So that’s what I have done. When a brand new user opens the app (or an existing user clears their data), they will receive this welcome popup and will be given 2 choices - “Start Fresh” or “Start Demo Tour”. If the user chooses the Demo Tour, the app will instantly fill with realistic sample data (transactions, categories, accounts, recurring transactions, savings goals & more). On top of that, a quick 12 step tutorial will appear. During the tutorial, users will create a transaction, a new category, setup an auto categorization rule & create a savings goal. Once the tutorial is finished, the sample data will be wiped and the user will be able to use the app with their own data."}, {"post_id": 39370, "ts": "2026-08-02T09:43:02Z", "hours": 8.1022, "text": "Upgraded the budgeting side and added support for category rollover. So basically, If you underspend your limit this month, the remainder rolls over to the next month. But If you overspend, it will carry over as debt and your limit next month will be lower. Also worked on some smaller features, such as: added a clear filters button in transaction list whenever active filters are applied. Added small colored dots next to category names in the transaction list, the color of the dot matches your category color. If no recurring expenses are present, you will see a button, that will help you to create one. Finally, started working on a proper tutorial which is probably going to be in the next devlog."}, {"post_id": 38100, "ts": "2026-07-31T09:53:36Z", "hours": 6.8269, "text": "Added a new chart to the overview tab that projects your accounts balance 12 months in to the future based on your active recurring income & expenses. It features a red line at 0$ to warn you of potential overdrafts. Other than that, I’ve made a few code refactors, extracted formatting logic into a shared component and worked on mobile UI for this chart."}, {"post_id": 36954, "ts": "2026-07-29T11:29:37Z", "hours": 6.8278, "text": "Since the last update, I’ve made some small QOL improvements. Created ability to edit assigned accounts when editing a transaction. Also, you can now sort transactions by date (newest/oldest) or amount (highest/lowest). Added ability to filter and search transactions by tags. Reorganized the filter & search toolbar to fit everything smoothly, especially for mobiles. Lastly, upgraded empty states, so if you have no transactions, you’ll see not only the empty state but also an “Add Transaction” button. The change applies to Savings Goals"}, {"post_id": 35845, "ts": "2026-07-27T15:23:08Z", "hours": 9.1947, "text": "Today I spent a lot of time making a command menu, basically you can press Ctrl+K anywhere or click the new search bar in the header to open the Command Menu. It allows you to instantly search all transactions, jump to any tab, or trigger actions like adding a transaction or goal. Also, I created a new tags feature, you can add tags when creating or editing transactions for cross-category tracking. Finally, slightly redesigned the header so It now fully functions and fits on mobile."}, {"post_id": 35147, "ts": "2026-07-26T11:57:54Z", "hours": 9.3906, "text": "Continuing to work on DimeTrack, I made a dedicated “Subscriptions” tab, where It scans your recurring expenses, displays how much you spend on subscriptions monthly & annually and allows to toggle subscriptions between “Active” and “Cancelled” without deleting past transaction history. Also upgraded the main dashboard tabs to support 5 categories, added Icons to the tabs and on mobile tabs switch to icon-only layout to prevent text squishing. Finally, added a native browser confirmation prompts to all delete actions (deleting goals, accounts, categories & recurring transactions)"}, {"post_id": 34160, "ts": "2026-07-24T17:48:20Z", "hours": 7.9261, "text": "Created a “Monthly Report” dialog that generates a breakdown of the current months total income & expenses, net savings & savings rate, daily average spending, top spending category, largest single purchase & a trend comparison of expenses versus the previous month. Also fixed chart tool tip clipping om mobile screens, optimized the main header layout by hiding button text on small screens, preventing the “Settings” & “View Monthly Report” buttons from going out of bounds. Updated the landing page with new features and screenshots & updated the github readme."}, {"post_id": 33454, "ts": "2026-07-23T13:04:07Z", "hours": 9.5942, "text": "Added a new Net Worth History chart to the overview tab, which tracks your all-time balance over the last 6 months. Also upgraded the 6-month Income vs Expenses visualization from a Bar chart to a Line chart to match the Net Worth History chart design. Both charts now feature a smart Y-axis formatting for large numbers, shared tooltip styles."}, {"post_id": 32937, "ts": "2026-07-22T12:42:22Z", "hours": 7.5039, "text": "Today I made a guided setup checklist to help new users configure their dashboard with ease. Instead of an empty app, now a “Get Started” button appears at the top right corner, which opens a 5 step tutorial (Create Account, Category, Set a budget limit, a savings goal & Add a transaction). The checklist automatically detects completed steps and also allows users to skip the guide. Onboarding is fully linked with localStorage and JSON backups, so It doesn’t appear to users who already have everything setup."}, {"post_id": 31958, "ts": "2026-07-20T19:40:38Z", "hours": 9.7931, "text": "Created 2 new features: Net Worth - replaced the “current balance” card on the overview tab which a dynamic Net Worth widget which calculates your all-time balance and compares it to your balance at the end of last month, displaying a green or red trend arrow to show how much your net worth has grown or shrunk this month. Custom color theming - created a new settings tab called “appearance” & custom color picker which allows users to instantly re-theme buttons, active tabs, calendar selections, focused inputs. The color picker here is powered by react-colorful and color change is being handled by colord. Also implemented a localColor state so the app only commits the CSS when the user releases the color picker drag."}, {"post_id": 31210, "ts": "2026-07-19T12:56:00Z", "hours": 9.5264, "text": "Created a new Smart Stats widget to Overview tab that calculates your Daily Average spending and projects your End Of Month spending based on your current Daily Average spending. Then after that, I looked through every file and did some refactors, bug fixes & UI polishing (especially on mobile). Bug fixes: Excluded “Starting Balance” transactions from calculateIncome & getMonthlyTrends so adding an account with starting balance doesn’t inflate income stats or trend charts. Fixed deleteCategory to clean up everything (including transaction splits, auto-categorization rules and category customization). Added a transfer account validation to Add Transaction dialog to prevent saving a transfer with empty “From/To” accounts or transferring money to the same account. Fixed the “Will exceed budget” warning showing when adding Income. Added defaultAccountId to JSON export/import handlers so the user’s default account setting survives JSON backups. Refactors: Extracted the duplicated color/icon Popover UI from settingsUI & accountManager in to a single colorIconPicker component. Extracted duplicated Recharts tooltip styling into a shared chartStyles.ts constant. UI Polish: Made the calendar mobile-friendly by showing colored dots on small screens and full text & balances on larger ones. Hid the default calendar navigation arrows that appeared at the top of the screen and adjusted button heights to match. Adjusted TabsList to use text-xs on mobile to prevent text overlapping on small screens. Added offset, z-index & allowEscapeViewBox to chart styles to prevent hover tooltips from being hidden behind chart graphics. Removed dead props, fixed a few typos and replaced hardcoded values with consts."}, {"post_id": 30620, "ts": "2026-07-18T10:38:01Z", "hours": 9.6939, "text": "Final part of the Accounts update: Worked on visual customization for the accounts system. Users can now edit account names without losing their transaction history. Also introduced a color and icon picker for accounts (just like with categories), so It’s easier for users to differentiate between accounts. Created a new “Total Balance” card that quickly shows your balance between all accounts. Finally, added a new filter for the transaction list - “Transfer”, colored transfers in a gray color so they don’t look like expenses, hidden the “Starting Balance” system transactions to reduce the visual clutter of the transaction list & updated the default account badge design."}, {"post_id": 29478, "ts": "2026-07-16T13:32:53Z", "hours": 10.1997, "text": "Part 2 of the Accounts update: Created a new ‘account balance’ widget that displays all your accounts & their balances. The transaction list now features a badge with the account name that the transaction was assigned to. Spent a lot of time fixing CSV exports/imports to properly support accounts & transfers between accounts. Finally, introduced a ‘starting balance’ feature for users can instantly input their balance when creating a new account without typing months of history and a ‘default account’ setting that auto selects their primary account when creating a new transaction"}, {"post_id": 28548, "ts": "2026-07-14T21:22:16Z", "hours": 9.845, "text": "Part 1 of the Accounts update: I finally built the whole architecture for multi-account management. Users can now create accounts (like checking or savings) and assign transactions to them. Also Introduced “transfers” which allow users to move money between accounts without adding fake data to income or expenses. The add and edit transaction dialogs now feature a dynamic UI that swaps out categories & split transaction functionalities for “From/to” account selectors. Finally, updated localStorage & JSON data exports to make sure that accounts are included."}, {"post_id": 27124, "ts": "2026-07-12T12:16:03Z", "hours": 7.7758, "text": "Improved the spending pie chart by adding a legend below the chart, displaying currency symbols when hovering & vastly improving tooltip readability on hover. Also expanded the Recent Transactions page with even more filters. Now you can filter transactions by income, expenses and categories. Finally, fixed some design inconsistencies."}, {"post_id": 26471, "ts": "2026-07-11T09:01:46Z", "hours": 9.3356, "text": "Added category customization, allowing users to personalize categories with custom icons & colors. Updated the spending chart and budget overview to use the new customization system, so select icons and colors are consistent throughout the whole application. Refactored the application to use default icon & color when none are selected."}, {"post_id": 25000, "ts": "2026-07-08T22:05:19Z", "hours": 11.4794, "text": "Added auto-categorization rules, which allows transactions to be automatically assigned to categories based on custom keywords. When you type the set keyword in description, a category will be auto chosen based on the rule. Built a rules manager in the Settings page to manage auto-categorization rules. Also expanded CSV & JSON import/export functionality to include notes & auto-categorization rules. Fixed several issues with CSV importing, when imported descriptions, notes were missing & incorrect amounts were assigned. Finally, redesigned the Settings UI and assigned each category to its own tab & cleaned up various design inconsistencies."}, {"post_id": 24022, "ts": "2026-07-07T09:34:59Z", "hours": 13.2997, "text": "Introduced the ability to split a single transaction across multiple categories. Also improved the transaction list to clearly display split categories and their amounts. Now, creating new categories is much easier, as they can be added directly when creating a transaction. Finally, I added warnings that notify users when a savings goal contribution would exceed its target or when a new expense would push a category over Its budget limit."}, {"post_id": 21802, "ts": "2026-07-03T22:35:42Z", "hours": 11.8697, "text": "I spent 12 hours on this 😭😭😭. It’s a cash flow calendar which uses historical and current transactions & puts them in a calendar. This feature projects your upcoming recurring transactions & income, automatically calculating your daily running balance. It highlights your balance red, if there is a potential overdraft. It’s pretty easy to navigate through past & future months to analyze your spending."}, {"post_id": 19107, "ts": "2026-06-30T10:41:35Z", "hours": 12.7331, "text": "Created an optional selection when creating a savings goal - Target Date. If Target Date is selected, when contributing to a goal, you will get a suggested amount based on your goal & target date. Created a notification system and replaced all alert() functions with notifications. When creating & editing transactions, users can now enter additional notes that they may have about the transaction. Also fixed CSV importing bugs & a few small UI inconsistencies."}, {"post_id": 17223, "ts": "2026-06-27T22:43:14Z", "hours": 8.6589, "text": "Today most of my time was dedicated to a UI rearrangement. I split the whole dashboard into 3 main tabs. Also created a section that shows your upcoming recurring transactions in the next 7 days. Finally, made a setting that allows users to wipe all their data."}, {"post_id": 15987, "ts": "2026-06-25T23:18:41Z", "hours": 10.7472, "text": "Mostly worked on the new Import CSV, Export & Import backups features. With Import CSV, you can import your existing transactions & categories while with Import backup you can import everything that your app has, this is great if user is switching browsers or devices. The other feature is a 6 month expenses vs income TrendChart that allows you to visually see how much you are making, spending & compare."}, {"post_id": 14707, "ts": "2026-06-23T22:10:13Z", "hours": 8.1892, "text": "DEV #7 Well first of all, It took me an hour to find a simple shadow class that needed to be removed so the landing page picture looks better. The rest of the time was spent figuring out how to & actually making the ability to create multiple goals at once."}, {"post_id": 13351, "ts": "2026-06-21T21:23:45Z", "hours": 5.655, "text": "DEV #6 Since shipping I worked on a small landing page which presents the core features of dimetrack. Fixed some issues with recurring transactions & implemented the ability to use custom values for recurring transactions instead of using the preset ones. Lastly, created loading skeletons & worked on some small design improvements (inconsistent gaps, settings dialog not being scrollable when too many elements are present, added small animations to progress bars.)"}, {"post_id": 11219, "ts": "2026-06-18T11:22:15Z", "hours": 5.0586, "text": "DEV #5 Polished the application more (especially mobile design) and finished the remaining features that I had planned. Users can now search their transactions by description, category or amount Added a separate goal contribution history for easier tracking Added budget limit warnings at: 50%, 80% & 100% Users can export their data in a .csv file"}, {"post_id": 10249, "ts": "2026-06-16T21:45:47Z", "hours": 6.6958, "text": "DEV #4 Added recurring transactions support. Users can select recurring transactions every day, week, month or year. Users can see all their recurring transactions & delete them in settings Added transaction filtering, same as recurring transactions, users can filter their recent transactions by day, week, month, year or lifetime Created field errors Many bug fixes"}, {"post_id": 8385, "ts": "2026-06-13T22:57:24Z", "hours": 8.8989, "text": "DEV #3 New features: Currency selector New settings page Ability to contribute to goal Ability to delete categories Ability to edit budget limits Lots of bug fixes Huge code cleanup, refactors & +99 more bugs to fix"}, {"post_id": 5190, "ts": "2026-06-08T21:42:35Z", "hours": 4.8833, "text": "Day 2 Created: Categories Spending by category & spending breakdown pie-chart Ability to edit goals Mostly worked on optimization today, moved most components into separate files. Fixed some bugs (hopefully). Designed a quick (was not quick) logo & favicon."}, {"post_id": 4518, "ts": "2026-06-07T21:11:11Z", "hours": 2.9533, "text": "Created the first working version of the transaction system. Income and expenses are now accepted, and actual data rather than hardcoded amounts are used to update balance, income, and spending in real time. Also created transaction saving to localStorage. Discovered a bug early on where an invalid input broke all calculations, so I added a better validation in the form to (hopefully) prevent these types of errors in the future. For now, I’ll keep working on the UX part and create more features and then move on to UI."}]...
|
Title: DimeTrack by @d3monas | Stardance
Devlogs: Title: DimeTrack by @d3monas | Stardance
Devlogs:
Created the first working version of the transaction system. Income and expenses are now accepted, and actual data rather than hardcoded amounts are used to update balance, income, and spending in real time. Also created transaction saving to localStorage. Discovered a bug early on where an invalid input broke all calculations, so I added a better validation in the form to (hopefully) prevent these types of errors in the future. For now, I’ll keep working on the UX part and create more features and then move on to UI.
Day 2 Created: Categories Spending by category & spending breakdown pie-chart Ability to edit goals Mostly worked on optimization today, moved most components into separate files. Fixed some bugs (hopefully). Designed a quick (was not quick) logo & favicon.
DEV #3 New features: Currency selector New settings page Ability to contribute to goal Ability to delete categories Ability to edit budget limits Lots of bug fixes Huge code cleanup, refactors & +99 more bugs to fix
DEV #4 Added recurring transactions support. Users can select recurring transactions every day, week, month or year. Users can see all their recurring transactions & delete them in settings Added transaction filtering, same as recurring transactions, users can filter their recent transactions by day, week, month, year or lifetime Created field errors Many bug fixes
DEV #5 Polished the application more (especially mobile design) and finished the remaining features that I had planned. Users can now search their transactions by description, category or amount Added a separate goal contribution history for easier tracking Added budget limit warnings at: 50%, 80% & 100% Users can export their data in a .csv file
DEV #6 Since shipping I worked on a small landing page which presents the core features of dimetrack. Fixed some issues with recurring transactions & implemented the ability to use custom values for recurring transactions instead of using the preset ones. Lastly, created loading skeletons & worked on some small design improvements (inconsistent gaps, settings dialog not being scrollable when too many elements are present, added small animations to progress bars.)
DEV #7 Well first of all, It took me an hour to find a simple shadow class that needed to be removed so the landing page picture looks better. The rest of the time was spent figuring out how to & actually making the ability to create multiple goals at once.
Mostly worked on the new Import CSV, Export & Import backups features. With Import CSV, you can import your existing transactions & categories while with Import backup you can import everything that your app has, this is great if user is switching browsers or devices. The other feature is a 6 month expenses vs income TrendChart that allows you to visually see how much you are making, spending & compare.
Today most of my time was dedicated to a UI rearrangement. I split the whole dashboard into 3 main tabs. Also created a section that shows your upcoming recurring transactions in the next 7 days. Finally, made a setting that allows users to wipe all their data.
Created an optional selection when creating a savings goal - Target Date. If Target Date is selected, when contributing to a goal, you will get a suggested amount based on your goal & target date. Created a notification system and replaced all alert() functions with notifications. When creating & editing transactions, users can now enter additional notes that they may have about the transaction. Also fixed CSV importing bugs & a few small UI inconsistencies.
I spent 12 hours on this 😭😭😭. It’s a cash flow calendar which uses historical and current transactions & puts them in a calendar. This feature projects your upcoming recurring transactions & income, automatically calculating your daily running balance. It highlights your balance red, if there is a potential overdraft. It’s pretty easy to navigate through past & future months to analyze your spending.
Introduced the ability to split a single transaction across multiple categories. Also improved the transaction list to clearly display split categories and their amounts. Now, creating new categories is much easier, as they can be added directly when creating a transaction. Finally, I added warnings that notify users when a savings goal contribution would exceed its target or when a new expense would push a category over Its budget limit.
Added auto-categorization rules, which allows transactions to be automatically assigned to categories based on custom keywords. When you type the set keyword in description, a category will be auto chosen based on the rule. Built a rules manager in the Settings page to manage auto-categorization rules. Also expanded CSV & JSON import/export functionality to include notes & auto-categorization rules. Fixed several issues with CSV importing, when imported descriptions, notes were missing & incorrect amounts were assigned. Finally, redesigned the Settings UI and assigned each category to its own tab & cleaned up various design inconsistencies.
Added category customization, allowing users to personalize categories with custom icons & colors. Updated the spending chart and budget overview to use the new customization system, so select icons and colors are consistent throughout the whole application. Refactored the application to use default icon & color when none are selected.
Improved the spending pie chart by adding a legend below the chart, displaying currency symbols when hovering & vastly improving tooltip readability on hover. Also expanded the Recent Transactions page with even more filters. Now you can filter transactions by income, expenses and categories. Finally, fixed some design inconsistencies.
Part 1 of the Accounts update: I finally built the whole architecture for multi-account management. Users can now create accounts (like checking or savings) and assign transactions to them. Also Introduced “transfers” which allow users to move money between accounts without adding fake data to income or expenses. The add and edit transaction dialogs now feature a dynamic UI that swaps out categories & split transaction functionalities for “From/to” account selectors. Finally, updated localStorage & JSON data exports to make sure that accounts are included.
Part 2 of the Accounts update: Created a new ‘account balance’ widget that displays all your accounts & their balances. The transaction list now features a badge with the account name that the transaction was assigned to. Spent a lot of time fixing CSV exports/imports to properly support accounts & transfers between accounts. Finally, introduced a ‘starting balance’ feature for users can instantly input their balance when creating a new account without typing months of history and a ‘default account’ setting that auto selects their primary account when creating a new transaction
Final part of the Accounts update: Worked on visual customization for the accounts system. Users can now edit account names without losing their transaction history. Also introduced a color and icon picker for accounts (just like with categories), so It’s easier for users to differentiate between accounts. Created a new “Total Balance” card that quickly shows your balance between all accounts. Finally, added a new filter for the transaction list - “Transfer”, colored transfers in a gray color so they don’t look like expenses, hidden the “Starting Balance” system transactions to reduce the visual clutter of the transaction list & updated the default account badge design.
Created a new Smart Stats widget to Overview tab that calculates your Daily Average spending and projects your End Of Month spending based on your current Daily Average spending. Then after that, I looked through every file and did some refactors, bug fixes & UI polishing (especially on mobile). Bug fixes: Excluded “Starting Balance” transactions from calculateIncome & getMonthlyTrends so adding an account with starting balance doesn’t inflate income stats or trend charts. Fixed deleteCategory to clean up everything (including transaction splits, auto-categorization rules and category customization). Added a transfer account validation to Add Transaction dialog to prevent saving a transfer with empty “From/To” accounts or transferring money to the same account. Fixed the “Will exceed budget” warning showing when adding Income. Added defaultAccountId to JSON export/import handlers so the user’s default account setting survives JSON backups. Refactors: Extracted the duplicated color/icon Popover UI from settingsUI & accountManager in to a single colorIconPicker component. Extracted duplicated Recharts tooltip styling into a shared chartStyles.ts constant. UI Polish: Made the calendar mobile-friendly by showing colored dots on small screens and full text & balances on larger ones. Hid the default calendar navigation arrows that appeared at the top of the screen and adjusted button heights to match. Adjusted TabsList to use text-xs on mobile to prevent text overlapping on small screens. Added offset, z-index & allowEscapeViewBox to chart styles to prevent hover tooltips from being hidden behind chart graphics. Removed dead props, fixed a few typos and replaced hardcoded values with consts.
Created 2 new features: Net Worth - replaced the “current balance” card on the overview tab which a dynamic Net Worth widget which calculates your all-time balance and compares it to your balance at the end of last month, displaying a green or red trend arrow to show how much your net worth has grown or shrunk this month. Custom color theming - created a new settings tab called “appearance” & custom color picker which allows users to instantly re-theme buttons, active tabs, calendar selections, focused inputs. The color picker here is powered by react-colorful and color change is being handled by colord. Also implemented a localColor state so the app only commits the CSS when the user releases the color picker drag.
Today I made a guided setup checklist to help new users configure their dashboard with ease. Instead of an empty app, now a “Get Started” button appears at the top right corner, which opens a 5 step tutorial (Create Account, Category, Set a budget limit, a savings goal & Add a transaction). The checklist automatically detects completed steps and also allows users to skip the guide. Onboarding is fully linked with localStorage and JSON backups, so It doesn’t appear to users who already have everything setup.
Added a new Net Worth History chart to the overview tab, which tracks your all-time balance over the last 6 months. Also upgraded the 6-month Income vs Expenses visualization from a Bar chart to a Line chart to match the Net Worth History chart design. Both charts now feature a smart Y-axis formatting for large numbers, shared tooltip styles.
Created a “Monthly Report” dialog that generates a breakdown of the current months total income & expenses, net savings & savings rate, daily average spending, top spending category, largest single purchase & a trend comparison of expenses versus the previous month. Also fixed chart tool tip clipping om mobile screens, optimized the main header layout by hiding button text on small screens, preventing the “Settings” & “View Monthly Report” buttons from going out of bounds. Updated the landing page with new features and screenshots & updated the github readme.
Continuing to work on DimeTrack, I made a dedicated “Subscriptions” tab, where It scans your recurring expenses, displays how much you spend on subscriptions monthly & annually and allows to toggle subscriptions between “Active” and “Cancelled” without deleting past transaction history. Also upgraded the main dashboard tabs to support 5 categories, added Icons to the tabs and on mobile tabs switch to icon-only layout to prevent text squishing. Finally, added a native browser confirmation prompts to all delete actions (deleting goals, accounts, categories & recurring transactions)
Today I spent a lot of time making a command menu, basically you can press Ctrl+K anywhere or click the new search bar in the header to open the Command Menu. It allows you to instantly search all transactions, jump to any tab, or trigger actions like adding a transaction or goal. Also, I created a new tags feature, you can add tags when creating or editing transactions for cross-category tracking. Finally, slightly redesigned the header so It now fully functions and fits on mobile.
Since the last update, I’ve made some small QOL improvements. Created ability to edit assigned accounts when editing a transaction. Also, you can now sort transactions by date (newest/oldest) or amount (highest/lowest). Added ability to filter and search transactions by tags. Reorganized the filter & search toolbar to fit everything smoothly, especially for mobiles. Lastly, upgraded empty states, so if you have no transactions, you’ll see not only the empty state but also an “Add Transaction” button. The change applies to Savings Goals
Added a new chart to the overview tab that projects your accounts balance 12 months in to the future based on your active recurring income & expenses. It features a red line at 0$ to warn you of potential overdrafts. Other than that, I’ve made a few code refactors, extracted formatting logic into a shared component and worked on mobile UI for this chart.
Upgraded the budgeting side and added support for category rollover. So basically, If you underspend your limit this month, the remainder rolls over to the next month. But If you overspend, it will carry over as debt and your limit next month will be lower. Also worked on some smaller features, such as: added a clear filters button in transaction list whenever active filters are applied. Added small colored dots next to category names in the transaction list, the color of the dot matches your category color. If no recurring expenses are present, you will see a button, that will help you to create one. Finally, started working on a proper tutorial which is probably going to be in the next devlog.
I’ve read the reviews of my previous ship and a few users suggested that I create a tutorial. So that’s what I have done. When a brand new user opens the app (or an existing user clears their data), they will receive this welcome popup and will be given 2 choices - “Start Fresh” or “Start Demo Tour”. If the user chooses the Demo Tour, the app will instantly fill with realistic sample data (transactions, categories, accounts, recurring transactions, savings goals & more). On top of that, a quick 12 step tutorial will appear. During the tutorial, users will create a transaction, a new category, setup an auto categorization rule & create a savings goal. Once the tutorial is finished, the sample data will be wiped and the user will be able to use the app with their own data.
Since the last devlog, I created a new Investments tab, where users can manually log their assets, mark them as Recurring Investments and update their values. Also, the total asset value is automatically added to the user’s Net Worth. For now, this investment tracker is very simple and I will be expanding on this feature a bit later. Most of my time during these few days was spent, trying to figure out how to connect Upstash to my app, so users can sync their data between devices, while I still keep DimeTrack fully serverless.
Another requested feature was cloud syncing or login so It was easier to use DimeTrack between multiple devices. I built a cloud syncing feature with Upstash. Basically, your data is still encryped and nobody except you can see it. Also built an auto-sync feature so any time you add a transaction, update a budget, create a goal or do anything, the application waits 3 seconds and pushes your updated data to the cloud. Finally, did some minor settings UI changes to the tabs are less cluttered, especially on mobile screens. How to set up syncing? Open Settings and navigate to the new Sync tab Under “Start New Sync” create your password and enable syncing The app will generate a unique Sync ID, save this ID On your secondary device: Open Settings and navigate to the Sync tab Under “Connect to Existing Sync”, paste your Sync ID and enter your password Click Pull Data & Connect and your data will be downloaded. Auto-Sync is now active on both. Auto-Sync is only active until you refresh your browser. After you refresh your browser, you will see a banner saying that Auto-sync is paused. To unpause - enter your password again. *This sync feature is completely optional
Reworked the Investments Tab. Now you can properly buy/sell/update your investments to keep track of your Profit & Loss. When creating a new Investment, first of all, you will be able to select what kind of asset this is (It can be Stock, Crypto, ETF or Other). After creating an asset, you can buy/sell/update your asset. When buying, enter the quantity, price per date and set a date when bought. After buying you will instantly see your new updated portfolio value & how much you have invested. If you want to see your Total Profit & Loss, update your asset prices.
Made some small improvements to the Investments tab and added a “Portfolio Performance” chart, which tracks how much you invested vs how much your portfolio is worth currently. Other than that, I completely reworked the Calendar, which is now called - Timeline. Instead of a Calendar it now shows your 7 day, 30 day and 3 month timeline with a projected balance, a projected balance chart and upcoming recurring transactions. It it somewhat similar to the calendar, however the whole UX is much more simpler and cleaner. Finally, I fixed some math calculations.
For todays update, I’ve worked on customization more. In settings, added an ability to turn off selected widgets that you do not care about. Turned off widgets will not be shown in the Overview tab. Also, I’ve done some more work to the Timeline tab, after each recurring transaction - your projected balance will show now, added an overdraft warning, so if your projected balance dips below 0 on a specific day, the chart will show a red zero-line and a warning banner will appear. Made the 3-month view sorted into groups by month, so Its easier to differentiate by month. Finally, I updated the exporting/importing and cloud syncing to make sure that everything is properly synced and no errors occur.
Today, I created a fun new achievement system which currently features 12 achievements. In the achievements page you can see all of them + progress tracker towards them. Upon unlocking an achievement, you will receive a notification in the bottom right corner of your screen. All achievements are saved locally, included in JSON backups and sync seamlessly. Also, fixed some localstorage and JSON backup issues and fixed a bug that when clearing your data, your investments would not clear.
Today, I’ve updated the command bar navigation to include the new Timeline and Investment tabs and with that also created a quicker way to add transactions - To create a transaction quicker, In the command bar all you need to do is type the amount, description and optionally category and account (for example: 9 Breakfast Food Checking). Also, reworked the transaction list and added abilities to select multiple or all transactions and bulk change account, categories, type or bulk delete transactions. Added ability to restore your transaction, if deleted accidentally. Finally, added an ability to duplicate transactions If needed.
Today, I Improved the “Smart Stats” feature with a new “Insights” tab. I didn’t want to create a new tab just for the Insights, so I decided to Implement the new feature in to an already existing one. Insights display your spending pace, give budget warnings, alerts you If your Net Worth & Savings are trending up or down and gives your Goal Projections without you having to navigate to the Goals tab. Also, replaced the default browser confirmation dialogs with custom ones, updated the tabs list design to a bit more modern one and made the tabs list stick so when you are scrolling down, your tabs list will always be accessible. Finally, fixed a few small bugs and a major budget rollover bug that would instantly roll over your budget without checking, if you even had a budget limit previously.
Today, I worked on more Quality of Life features for my app, first of all - Introduced Keyboard Shortcuts, you can open the Command Bar with CTRL + K, add new transactions with ALT + N and switch tabs with ALT + 1 through 6. Created a small dialog that shows all the keyboard shortcuts available. Another feature - Transaction Presets. You can now create a preset for your most used transactions, just fill out the add transaction form as usual and instead of pressing “Save Transaction” just press the new Bookmark icon, then at the top your preset will appear, next time just press on the preset and everything will be filled out for you. Fixed a few tiny UI details, optimized mobile design, fixed a bug where the quick-add suggestion bar hardcoded a $ sign regardless of your selected currency. Finally, when creating a new transaction through the quick-add feature, you must now include a valid category otherwise the app won’t recognize that you are trying to add a transaction.
Worked on a custom date picker for the Timeline, so now instead of being locked into 7-day, 1 or 3 month views, users can now view any custom date they want. Created a financial safety net, where users can set a minimum balance and if your projected balance drops below it, a warning banner appears. Updated the auto-sync feature and made it truly auto, all users now need to do, is just enter a password once. Finally, did a final test of the app, fixed bugs, updated the landing page and the GitHub readme
Ships:
I built DimeTrack, a personal finance & budgeting web app that helps users to track their income, expenses, manage custom spending categories, create budgets & save toward their set goals. The application store data locally, allowing users to use it without creating an account. One of the biggest challenges was managing the app as it grew. Features such as recurring transactions, savings goal contributions, budget tracking & categories all interact with each other. Ensuring that data remained synced required lots of testing. I’m proud that I built DimeTrack to have so many features, I’ve never built anything quite like this. To test DimeTrack: Try to create some categories through the settings menu Add income & expenses Create a savings goal and try to contribute to it Set budget limits Try recurring transactions Search & filter your transactions (transcations can be searched by description, amount or category) Export your transaction data using the CSV export feature (if you only want data from let’s say todays transactions, apply a filter) Refresh the page with all the data, to confirm that everything is saved. No accounts needed!
DimeTrack is an open-source personal finance manager that helps people manage their money entirely in a browser. There are no accounts, subscriptions, servers - everything is stored locally on device. Since my first shipment, the project has grown significantly. It now supports accounts, transfers between them, split purchases, multiple savings goals with contribution history and target dates, budget limits, auto-categorization rules, cash flow calendar with forecasting, monthly spending reports, net worth tracking, customizable categories and accounts, JSON backups, CSV import & export and many other quality of life improvements were made during the many hours spent on this project. The biggest challenge was keeping every feature synced as the project grew. Transactions can affect accounts, budgets, savings goals, recurring payments, reports, charts and basically everything. Adding new functionality means that I have to update existing systems to ensure that everything stays working as intended. But I’m proud to see how much my project has evolved and grown. You should try to: Create multiple accounts and transfer money between them Add income & expense transactions, try the split transaction function Set up a few savings goals with target dates and see how the contribution suggestion feature works Customize categories & accounts with icons and colors Configure budget limits and see the warnings that It gives you when nearing the limits Create an auto-categorization rule Explore the cash flow calendar Try exporting your data to JSON
DimeTrack is an open-source personal finance manager that helps people manage their money entirely in a browser. There are no accounts or subscriptions required and your data is stored locally on your device, with an OPTIONAL cloud sync if you want to access it across devices. Since my second shipment, the project has grown even further. I read every single review and Implemented all the suggestions that were provided. Made an optional cloud syncing feature that allows users to access and use the app across multiple devices. Made a small tutorial/guide that provides a bit more information on how to use DimeTrack. Replaced the Calendar tab with a new Timeline, that shows all your recurring transactions in your selected time interval, your projected balance and an ability to add a safety net and see if your projected balance falls below it in the coming months. Added an ability to manually track your Investments. Even more customization options and many other things. Similar to my previous shipments, the biggest challenge was to keep everything synced. One feature depends on another, so adding new functionality means that I have to update existing systems to ensure that everything stays working. I’ve somehow spent 325 hrs on this project and this will probably be my final shipment. I’ve had a lot of fun working on it and hope to maybe sometime later. For the v3 you should try to: Complete the tutorial (If you have used DimeTrack previously, go to settings -> data -> clear all data or just use incognito window) Add some recurring transactions and test out the Timeline to see your projected balance Explore the new subscriptions tab Set up cloud sync Add some Investments, update their price so see how your portfolio value goes up or down Check out the new financial insights in the Overview tab Use the Command Bar at top middle, you can find some quick actions there, search for any transaction or even create a quick transaction by typing in the search bar - Amount, Description, Existing Category (for example: 5 Coffee Food (must have a category called Food)) Explore the keyboard shortcuts Do a few achievements Create a few transactions and test out the bulk editing options...
|
1792860521.7037585
|
1793724521.7037585
|
|
34143
|
Spectralis by @DeltaVortex | Stardance
|
DeltaVortex
|
2
|
332.84
|
4092
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T05:56:33Z", "hours": 236.0, "multiplier": 16.89, "payout": 3884, "blessing": "neutral", "text": "Spectralis shiplarp 2 — Stardance —wuzzup guys— So much has happened since shiplarp 1 and I cannot wait to not break down what changed. I will. I’m lazy. Not right now though. Cat or dog? redeem_code.claim() —the celebration— We’ve gone through so many changes since last time that it deserves an actual celebration: a very cool, very awesome custom visualizer for Stardance. Claim yours: Help > Manage Visualizers, then redeem stardance-lts-pulp . —found a bug?— Including the dreaded Tim Cook issues — DM me: Discord: @deltav0rtex Slack: deltavortex Can’t wait to hear the feedback and all the bugs you dig up. —this is the end*— *end for now, redeem codes permitting YIPEE!!!", "repo": "https://github.com/Dareto-Dream/Spectralis", "demo": "https://spectralis.deltavdevs.com"}, {"ship_num": 2, "ts": "2026-08-14T06:50:58Z", "hours": 23.0, "multiplier": 12.89, "payout": 208, "blessing": "neutral", "text": "Spectralis shiplarp — v5.3.0 —shipped it— Notepads. A spin wheel. Dead zones that aren’t OBS-only anymore. Playlists that don’t look like a log file. Spotify that actually behaves. That’s the version. —what’s in it— Notepad system: docked panel, tabs, pop-out window, saves to track tags Spin wheel: weighted entries, saved wheel lists, notepad-fed Dead zones now shift the app’s own layout, not just OBS overlays Spotify: playlist sync, queue, pause, and Discord presence all fixed Fixed: playlist rows missing RowBackground (looked like a terminal, my bad) Fixed: nav rebuilding the entire view every click Fixed: library load blocking window open on big libraries Fixed: spectrum bars snapping instead of moving (FFT overlap bumped to 75%) Fixed: soundcloud playhead, word-mode timestamp export, track-switch click/pop —that’s it— PICKLE!!!", "repo": "https://github.com/Dareto-Dream/Spectralis", "demo": "https://spectralis.deltavdevs.com"}]...
|
[{"post_id": 65615, "ts": "202 [{"post_id": 65615, "ts": "2026-09-10T21:10:25Z", "hours": 9.8333, "text": "Spectralis devlog #44 —Hello again proggers— Did it. Fixed a genuine ton of bugs, following through on the mess from devlog #43. Tempted to just drop 6.1.0 right now, but holding off — want to get a few new features in and brainstorm some more QoL first so this actually feels like a finished product, not just a stopgap. Also: finally going to bed. the bar was “fix the bugs” and I cleared it, going higher anyway Cat or dog? sleep(∞) Okay let’s get into it~ —Yap— Real closure on the websocket/CDN/prod chaos from last devlog. Cleared out a lot in one sitting, and instead of rushing 6.1.0 out the door on relief alone, choosing to actually sit with it a bit longer. —The Great Suffering— 1 — The Bug Backlog, Actually Cleared Worked through the fallout from devlog #43 — websocket issues, the CDN backup failures, all of it — and got a genuine ton of it fixed in one real pass instead of piecemeal patching. 2 — Holding Off On 6.1.0, On Purpose Could ship right now. Choosing not to. Want to work in a few new features and brainstorm more QoL first, so the release feels complete rather than just “the bugs are gone, ship it.” Patience over momentum this time. 3 — Finally Going To Bed After devlog #43’s two-days-no-sleep spiral, actually calling it and going to bed now. Today off is finally getting used the way it was supposed to be used. the sleep debt collector finally caught up —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to get real sleep for the first time in a while. Q: Why not just ship 6.1.0 now if the bugs are fixed? A: Because “bug-free” and “actually done” aren’t the same bar, and this one’s worth clearing the second one too. Q: Was this the same chaos from devlog #43? A: Same fires, all put out this round. Q: What kind of new features are being considered? A: Not locked in yet — that brainstorming is the next step, not this devlog. Q: Sleep status, finally? A: Handled. Going now. —This is the end*— *end for now, actual sleep permitting PLAY!!!"}, {"post_id": 65271, "ts": "2026-09-10T08:34:54Z", "hours": 2.5, "text": "Spectralis devlog #43 —Hello again proggers— [2:47am] okay so. websockets again, more of them, and now the CDN backup is failing too which is great, love that for me. on my 4th coffee at this point, energy drink count is starting to get concerning honestly and I’m not gonna pretend it isn’t. pretty sure i debugged the cdn thing at 4am purely out of spite Cat or dog? idk man catch (Exception e) { } at this point Okay let’s get into it, or at least try to~ —Yap— so continuing from devlog #42’s websocket hardening, turns out hardening one part just revealed the next part was also fragile, shocking, anyway. need to push something to prod to actually get it working but can’t do that without interrupting infra which is currently live so that’s a whole separate problem I have to solve first before I can solve the actual problem. love layers. —The Great Suffering— 1 — More Websocket Issues more of them. found while poking at the hardening from last devlog. not sure if figuring this part out took 20 minutes or 3 hours honestly, time’s doing something weird tonight. 2 — CDN Backup Is Failing on top of the websocket stuff, cdn backups just started failing too. not connected to each other as far as i can tell but who knows at this point, everything feels connected at 3am. 3 — Need To Push To Prod, Can’t Without Interrupting Infra the actual fix needs to go to prod but pushing it right now means interrupting live infra, which i don’t want to do blind, so now i need a plan for THAT before the real fix even goes out. process problem wrapped around the actual problem, great. 4 — Shared Play Is Doing The AI-Look Thing Again noticed shared play’s UI is drifting into the same generic-AI-looking territory the main site kept getting flagged for back in devlog #21-#24. damn. gonna have to redo that too. not tonight though, one disaster at a time. 5 — Oh And I Found A Missing Semicolon spent a genuinely embarrassing amount of time on a bug that turned out to be a missing semicolon. send help. actually don’t, just let me suffer, i clearly deserve it at this hour. 6 — No Sleep For 2 Days, Hitting Now it’s catching up. hard. luckily got tomorrow off so plan is stay up tongiht finish this, and just completely pass out tomorrow instead. worth it. probably. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: a human programmer. you. the one reading this at whatever hour you’re reading it, hopefully not also running on 2 days no sleep Q: Is the websocket hardening from #42 actually working? A: mostly? finding more edge cases as i go, which is annoying but also kind of expected honestly Q: Why can’t you just push to prod now? A: because infra’s live and i don’t want to interrupt it blind, need an actual plan for that part first Q: Is shared play getting a full redesign again? A: yeah probably, later though, not adding a 4th fire to tonight Q: Sleep plan? A: none tonight, all of it tomorrow, that’s the whole plan —This is the end — *end for now, semicolons permitting send sleep!!!"}, {"post_id": 65216, "ts": "2026-09-10T06:03:36Z", "hours": 9.7103, "text": "Spectralis devlog #42 —Hello again proggers— Spent this round hardening shared queues, mostly because WebSockets are just genuinely cool and it’s about time they got treated that way in this codebase. a devlog motivated entirely by “websockets are cool” is a valid devlog Cat or dog? ws:// Okay let’s get into it~ —Yap— Shared queues have been functional but not particularly resilient this whole time, riding on shared play’s presence/reactions/queue work from way back in devlog #9. This round was about actually hardening that layer instead of leaving it fragile. —The Great Suffering— 1 — Hardening Shared Queues Went through and shored up a bunch of the underlying bases for shared queues — the stuff that only matters once real connections are dropping, reconnecting, and behaving unpredictably instead of the clean happy-path test case. 2 — Because WebSockets Are Cool Genuinely part of the motivation here. Real-time bidirectional connections are just satisfying to get right, and shared queues are exactly the kind of feature that benefits from taking that layer seriously instead of treating it as plumbing. not every feature needs a dramatic bug story, sometimes it’s just “wanted to do it well” —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hardening infrastructure purely because it’s fun to get right. Q: Is this related to the shared play work from devlog #9? A: Same general system, this round focused specifically on making the queue layer more resilient. Q: What does “hardening” mean here specifically? A: Making the shared queue behavior hold up better under real conditions — drops, reconnects, timing edge cases — rather than just the clean test path. Q: Any bugs found during this pass? A: Nothing dramatic enough to call out individually, mostly proactive resilience work. Q: What’s next? A: Podcast mode and the randomizer work from devlog #41 are both still ongoing threads. —This is the end*— *end for now, dropped connections permitting P_P!!!"}, {"post_id": 64674, "ts": "2026-09-09T08:17:56Z", "hours": 5.2669, "text": "Spectralis devlog #41 —Hello again proggers— Podcast mode’s in the works, with a real new way to actually find saved podcasts instead of digging for them. Also fixed the randomizing tools so they actually help pick a song instead of just existing decoratively. And: class got canceled for a hurricane watch, so tonight’s an all-nighter by default. free 10 hours courtesy of a hurricane, weird way to get them Cat or dog? shuffle(weighted=True) Okay let’s get into it~ —Yap— Two real features this round plus a forced schedule change. Podcast mode’s genuinely new territory for the app, the randomizer fix is a smaller but meaningful UX improvement, and the hurricane watch just handed over a full night that wasn’t originally planned for grinding. —The Great Suffering— 1 — Podcast Mode, In Progress Building out actual podcast support, including a new way to locate saved podcasts rather than just treating them like any other track and hoping they surface in the right place. Real new territory for the app compared to the music-first feature set so far. 2 — Randomizing Tools, Actually Useful Now The shuffle/randomizer tools existed before but weren’t really doing anything meaningful — mostly there in name. Fixed so they actually aid in song selection now instead of just sitting there as a checkbox nobody trusted. a randomizer that doesn’t actually help you pick anything is just decoration 3 — The Hurricane Watch Situation Class got canceled due to a hurricane watch, which means tonight’s turning into a full grind session that wasn’t originally on the calendar. Silver lining of a weather delay, I suppose. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one getting a bonus grind night courtesy of a hurricane watch. Q: Is podcast mode close to done? A: In progress, this devlog’s the early build phase, not the finish line. Q: What was actually wrong with the randomizer before? A: It existed but didn’t meaningfully help pick songs — more decorative than functional. Fixed to actually aid selection now. Q: Is Song Wars rework from devlog #40 still going? A: Ongoing, this devlog’s focus shifted to podcast mode and the randomizer instead. Q: Stay safe with the hurricane watch, by the way. A: Appreciated. Staying inside, staying coding. —This is the end*— *end for now, hurricane watches permitting POOL!!!"}, {"post_id": 64588, "ts": "2026-09-09T03:01:20Z", "hours": 10.0, "text": "Spectralis devlog #40 —Hello again proggers— 10 straight hours, and the highlight is getting tricked by Suno’s own scraper path. There was a decoy path that looked exactly like the real music endpoint, and it just returned forbidden the whole time. Maybe I’m the bot in this scenario. Unclear. got outsmarted by a decoy URL, humbling Cat or dog? 403 Forbidden Okay let’s get into it~ —Yap— Continuing the reverse-engineering grind from devlog #39, Suno specifically threw a curveball this round. Beyond that, spent real time thinking about what the app actually is and why certain features exist, plus started tearing into Song Wars, which has apparently been quietly buggy for a while. —The Great Suffering— 1 — The Suno Decoy Path Suno provides a path that looks exactly like the real music endpoint, structurally identical, right down to how it responds at a glance. In reality it just returns forbidden every time. Spent real time thinking this was progress before realizing it was a dead end dressed up as a working one. maybe im the bot 2 — Actually Fixed It, After Testing Once the decoy was identified for what it was, found the real path and got it working properly. Testing it thoroughly this time before calling it done, given how devlog #39 went. 3 — Identity Of The App Spent real time thinking through what Spectralis actually is at this point, and justifying why certain features exist rather than just accumulating them because they seemed cool at the time. Less code, more “why does this exist and does it still make sense.” 4 — Song Wars Rework, Started Started tearing into Song Wars, which turns out to be hella buggy underneath. Early stages of a rework rather than a patch job, since patching individual bugs in it hasn’t been holding up. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who got fooled by a decoy API path for a while. Q: Was the Suno issue related to the S3 discovery from devlog #38? A: Same general integration, different specific obstacle this round. Q: Is Song Wars getting a full rewrite or just fixes? A: Leaning toward a real rework rather than more patches, given how buggy it’s turned out to be. Q: What does “identity of the app” work actually produce? A: Not code directly — more a filter for which features actually belong and why, going forward. Q: How’s the 10 hour grind treating you? A: Productive despite the decoy detour. Real progress by the end of it. —This is the end*— *end for now, decoy paths permitting PAP!!!"}, {"post_id": 64321, "ts": "2026-09-08T16:38:31Z", "hours": 11.5997, "text": "Spectralis devlog #39 —Hello again proggers— All-nighter, running on 3 Monsters and a Coke Zero. Reverse engineering APIs is hard as hell, and untitled.stream in particular fought back the whole way. Also snuck in a fix for a Spotify library issue on the side. 3 Monsters and a Coke Zero is not a nutrition plan, it’s a battle strategy Cat or dog? 429 Too Many Requests Okay let’s get into it~ —Yap— Following up on devlog #38’s untitled.stream compat work — turns out “working on it” undersold how hard it actually was. Genuinely brutal reverse engineering session, plus a smaller fix that came out of the same stretch of work. —The Great Suffering— 1 — untitled.stream Was Particularly Hard To Crack Chasing this compatibility since devlog #38, and it turned out to be one of the harder reverse-engineering targets yet. No public API to lean on, so it was the usual slow grind of observing behavior and piecing together how it actually works under the hood. some APIs give up easy, this was not one of them 2 — Reverse Engineering APIs In General: Still Hard Not a new lesson given devlog #17’s whole saga, but worth restating: this category of work is consistently the hardest and slowest kind on the whole project. Going in with better patience and verification habits this time though, which helped. 3 — Spotify Library Polling, Increased Bumped how often libraries get polled to account for some Spotify-side issues that were surfacing. Smaller fix, but a real one, found and shipped in the same session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who ran on three energy drinks to crack one integration. Q: Is untitled.stream compat actually working now? A: Meaningfully further along after this session, following up from devlog #38’s start on it. Q: Did this go better than devlog #17’s reverse-engineering disaster? A: Yes — hard and slow, but productive this time rather than a total dead end. Q: What was the Spotify polling issue specifically? A: Library state getting out of sync too easily — more frequent polling keeps it closer to accurate. Q: Sleep status? A: Same as every other all-nighter devlog. Not great. Worth it this time though. —This is the end*— *end for now, rate limits permitting PIPSQUEAK!!!"}, {"post_id": 64034, "ts": "2026-09-08T05:01:47Z", "hours": 9.5333, "text": "Spectralis devlog #38 —Hello again proggers— Suno’s integration broke after their latest TOS update, so that got fixed. Also added Discord Rich Presence control for capsules, started chasing down a batch of connections that quietly broke or got dropped over time, and picked up a fun trivia fact along the way: Suno apparently hosts on AWS S3. a TOS update breaking an integration, name a more classic story Cat or dog? S3:// Okay let’s get into it~ —Yap— Mixed bag this round: one reactive fix from an external platform change, one genuinely new feature, and the start of a cleanup pass on integrations that have been quietly rotting since whenever they last got touched. —The Great Suffering— 1 — Suno Integration, Fixed Suno’s newest TOS update broke the existing integration. Patched it back up to work with the new terms. Reactive fix, not a fun one, but necessary. 2 — Capsule DRPC Control Real new feature: Spectralis capsules can now control Discord Rich Presence, so a capsule can show custom status while it’s playing instead of the app just showing generic now-playing info. 3 — Chasing Down Broken And Dropped Connections Going through existing integrations that broke with newer updates on the other end, or that got dropped along the way and never revisited — untitled.stream compatibility being one specific example. Working through the backlog of “this used to work” one at a time. 4 — Suno Hosts On AWS S3 Small fun discovery while poking around the integration: Suno’s hosting is on AWS S3. Not actionable, just neat to know. 5 — Looking For New Platforms Actively looking for what to integrate with next. Feedback on what platforms people actually want would genuinely help shape this. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose integration broke because someone else updated a TOS page. Q: What’s DRPC? A: Discord Rich Presence — the status shown under someone’s name in Discord. Capsules can now set custom status through it. Q: What’s untitled.stream compat about? A: One of the connections that broke or got left behind at some point — being actively worked back into shape. Q: What platforms are being considered for new integration? A: Not decided yet, genuinely open to suggestions. Q: Was the Suno fix hard? A: Not conceptually, just annoying — an external change forcing reactive work instead of planned work. Q: What’s the image order now? A: Changed my mind again — meme first, app screenshot second this time. The devlog #37 order didn’t stick. —This is the end*— *end for now, TOS updates permitting POP!!!"}, {"post_id": 63804, "ts": "2026-09-07T19:28:07Z", "hours": 15.4, "text": "Spectralis devlog #37 —Hello again proggers— Working through the feedback wave from the ship, including an upcoming maybe-new streaming service integration. Reverse engineering, again, yay. Also completely forgot Hackclub’s 10 hour limit was a thing and ran 5 hours over it. It’s fine. Everything’s fine. last time reverse engineering a streaming service ate 12 hours and produced nothing, so this is either growth or déjà vu Cat or dog? HKEY_LOCAL_MACHINE Okay let’s get into it~ —Yap— Post-ship feedback turned into real changes fast, and one of them’s a streaming service integration that’s back to reverse-engineering territory — hopefully with better luck than the devlog #17 saga. Also, format note: switching up how devlogs get posted going forward. —The Great Suffering— 1 — Maybe New Streaming Service Support Working on possible support for another streaming service, and since it doesn’t have a public API either, that means reverse engineering again. Learned some hard lessons from devlog #17’s all-nighter about this exact kind of work, applying them here — verifying before implementing, checking whether something’s already patched before sinking hours into it. 2 — 15 Hours, Not 10 Completely lost track of Hackclub’s 10 hour session limit and blew past it by 5 hours. Not the plan, happened anyway, no regrets loud enough to stop it from happening again probably. time limits are more of a guideline when you’re mid-flow 3 — A Format Change, By Request People like the meme format but keep asking to actually see the project itself, which is fair — problem is most of what’s happening is engine work, and a screenshot of raw code just doesn’t communicate much on its own. Going to try posting an actual screenshot as the first image and keep the meme as the second, going forward. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just blew past a 10 hour limit by half again as much. Q: Is this streaming integration going to end like devlog #17’s did? A: Hoping not — going in more carefully this time given how that one went. Q: Why not just show code screenshots if people want to see the project? A: Raw engine code doesn’t communicate much visually to most people. Trying to find screenshots that actually show something meaningful instead. Q: Will the meme format go away? A: No, staying as image two. Just adding an actual project screenshot as image one. Q: How’s the feedback wave going overall? A: Productive, this streaming service idea being one direct result of it. —This is the end*— *end for now, session limits permitting POSSIBLE!!!"}, {"post_id": 62666, "ts": "2026-09-06T04:36:39Z", "hours": 9.8669, "text": "Spectralis devlog #36 —Hello again proggers— Last log before 6.0.1 tries to ship to everyone. Except Mac, remember? If anyone — and by anyone I mean basically no one — has the app downloaded already, you should see the update land fairly soon. “anyone” carrying a lot of self-deprecation in that sentence Cat or dog? v6.0.1 Okay let’s get into it~ —Yap— Four things landing in this round: video export from devlog #35 finally patched back in properly, the about page expanded, a real EQ upgrade, and more webview bugs cleared out. Then it’s out the door. —The Great Suffering— 1 — Video Export, Actually Patched In Announced back in devlog #35, and this round it’s actually working and patched into the build for real instead of just existing as a headline feature nobody could touch yet. 2 — About Page, Expanded Grew the about page out — more actual content instead of the bare-minimum version it’s had this whole time. 3 — A Far More Advanced EQ System Real upgrade here: new EQ with envelope styling and a handful of presets. Meaningfully more capable than whatever was there before, for anyone who actually cares about shaping their sound instead of just hitting play. 4 — More Webview Bugs, Patched Following the WebView2Host fast-path fix from devlog #9, a few more webview-related bugs got cleared out this round. Apparently that surface keeps finding new ways to misbehave. webview bugs are the gift that keeps on giving 5 — 6.0.1 Ships, Mac Excluded (Still) Same LTS-only policy from devlog #32 applies — Mac isn’t getting 6.0.1 as a minor. Everyone else should see the update land soon. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to auto-update basically no one to 6.0.1. Q: Why doesn’t Mac get 6.0.1? A: Same policy from devlog #32 — Mac only gets LTS releases, not minors, unless it’s a Mac-specific patch. Q: What’s new in the EQ system specifically? A: Envelope styling plus a set of presets, a real step up from the previous version. Q: Is video export from devlog #35 fully working now? A: Yes, patched in properly this round. Q: When does 6.0.1 land? A: Fairly soon, per this devlog, for anyone who already has the app installed. —This is the end*— *end for now, update pushes permitting PEBBLE!!!"}, {"post_id": 62302, "ts": "2026-09-05T16:34:34Z", "hours": 9.5667, "text": "Spectralis devlog #35 —Hello again proggers— Long way from v5.3.0, that’s for sure. New ship’s cooking, and it’s built directly off the feedback wave from devlog #33 — took what came in and actually built more on top of it. Also, the big one this round: video export is here. 35 devlogs from “last ship” to this Cat or dog? .mp4 Okay let’s get into it~ —Yap— This one’s a real feedback-driven ship, not just internal roadmap stuff. Fed reports and requests all the way back from devlog #2’s post-first-ship feedback into the app, and video export was the headline addition that came out of it. —The Great Suffering— 1 — Feedback Actually Became Features Everything that came in since devlog #2, right after the very first ship, finally got folded back into this release, not just patched as bugs but expanded into more app. Real loop from “here’s what’s wrong/missing” way back then to “here’s it, fixed and built out” now. 2 — Video Export Is Here For music makers who want something to post — YouTube, Klipy, wherever you’re posting cool stuff — Spectralis can now export video directly instead of just playing audio and visualizers live. Been a long time coming given how much the visualizer/capsule work has built up across devlogs #7, #18, #23, and #29-#30. 3 — This Is The New Ship, Not The Finished One Announcing the direction this round more than closing it out — the surprise from devlog #33/#34 still rides along on this too. Full picture coming as it actually ships. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just got a whole export pipeline for their trouble. Q: What can video export actually do? A: Exports your visualizer/capsule output as an actual video file, suited for posting to platforms like YouTube or Klipy. Q: Is this the same ship as the Stardance surprise from devlog #34? A: Same overall release window, yes. Q: How much of this came directly from user feedback? A: A meaningful chunk — some of it going all the way back to devlog #2, right after the very first ship. Q: When’s it actually dropping? A: Still in progress. This is the announcement, not the release. —This is the end*— *end for now, export pipelines permitting PS: couldn’t find a good meme this time, so you get corporate gif slop instead. Enjoy. PICKLE!!!"}, {"post_id": 61350, "ts": "2026-09-04T07:08:42Z", "hours": 7.2333, "text": "Spectralis devlog #34 —Hello again proggers— Still on the devlog commits grind. The surprise from devlog #33 is actually finished now, releasing alongside the next Stardance ship as soon as this current one clears. Meanwhile, spent this round scouring the app for small edge cases and UI stuff that’s been quietly overlooked. the surprise is done, the suspense is not Cat or dog? edge_case.md Okay let’s get into it~ —Yap— Two tracks this devlog: the surprise from last time is locked and ready, waiting on the current ship to clear before it goes out with Stardance. In the meantime, doing a proper sweep for the small stuff — edge cases and UI rough edges that don’t show up unless you’re specifically hunting for them. —The Great Suffering— 1 — The Surprise Is Finished Whatever it is, it’s done. Releasing with the next Stardance ship, not this current one — has to clear first. Still not saying what it is. still not telling you, patience 2 — Scouring For Edge Cases Going through the app specifically looking for edge cases that got missed during normal feature work — the inputs and states nobody thinks to test until something breaks in a very specific, very rare way. 3 — UI Stuff That Got Overlooked Alongside the edge cases, hunting down small UI issues that slipped through — spacing, alignment, states that don’t look quite right, the stuff that’s easy to miss when you’re heads-down building instead of using the app like a regular person would. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hunting edge cases nobody else would think to try. Q: What’s the surprise? A: Patience, my dear child. Q: Why wait for the current ship to clear first? A: Cleaner to let one release settle before stacking the surprise onto the next one. Q: Any specific edge cases found yet? A: Sweep’s ongoing, nothing dramatic enough to call out individually yet. Q: Still not saying what the surprise is? A: Correct. Ask again next devlog. —This is the end*— *end for now, edge cases permitting PERISHABLE!!!"}, {"post_id": 60763, "ts": "2026-09-03T11:03:52Z", "hours": 5.8667, "text": "Spectralis devlog #33 —Hello again proggers— First real wave of feedback since Mac shipped in devlog #32, and it’s been genuinely good. Patching a handful of bugs people actually pointed out, plus one quick clarification for a specific rater who had a question. real users, real feedback, feels different from testing solo Cat or dog? feedback.md Okay let’s get into it~ —Yap— Shipping to actual people instead of just self-testing changes the kind of bugs that surface. Round of patches based directly on what came in, plus a couple of housekeeping notes. —The Great Suffering— 1 — Real Feedback, First Time At This Scale Genuinely solid feedback wave since the Mac release. Different flavor of bug reports than internal testing ever produces — actual usage patterns finding things a solo QA pass wouldn’t. 2 — Patching What Got Pointed Out Working through the specific bugs raised by that feedback. Direct fixes for direct reports, exactly the kind of loop that’s supposed to happen once something’s actually in people’s hands. 3 — Quick Note For A Specific Rater One rater asked about the track used in devlog #1 — it’s a custom remix of “Delete” by Ninjirachi. DM if you want the file. 4 — How To Reach Out For anyone hitting issues with the app: Slack works, or Discord at @deltav0rtex . Genuinely want the reports, keep them coming. 5 — A Surprise Is Coming Next Ship Got something tucked away for the next release that should land well. Not spoiling it here, staying quiet on purpose. Minor patch for this round’s QoL fixes drops within the next two days. teasing it and saying nothing else, that’s the whole bit —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one actually reading feedback instead of guessing what’s broken. Q: How do I report a bug? A: Slack, or Discord — @deltav0rtex . Q: What was that track in devlog #1? A: A custom remix of “Delete” by Ninjirachi. DM for the file if you want it. Q: Is the current bug list from this feedback wave big? A: Manageable, working through it directly rather than batching for a bigger release. Q: Any plans to formalize a feedback/bug channel later? A: Not stated yet, current setup is DMs and Slack for now. Q: What’s the surprise for next ship? A: Not saying. That’s the point of a surprise. Q: When’s the minor QoL patch dropping? A: Within the next two days. —This is the end*— *end for now, bug reports permitting PARABLE!!!"}, {"post_id": 60643, "ts": "2026-09-03T04:06:16Z", "hours": 3.4, "text": "Spectralis devlog #32 —Hello again proggers— Mac’s out. Actually out, actually available, actually done. Took way longer than expected — the site needed updating and every single update script needed fixing before this could actually go out the door clean. “we got mac out” undersells how much site and script work that actually took Cat or dog? .pkg Okay let’s get into it~ —Yap— Closing the loop that started way back in devlog #19 with a borrowed Mac and a hopeful “fingers crossed,” went through the decoding fixes in devlog #28, the platform-assumption hotfix in devlog #26, and now it’s actually shipped. Quick policy reminder while we’re here, since it matters going forward. —The Great Suffering— 1 — The Site Needed Updating First Before Mac could actually go out, the site itself needed real updates to reflect it — new download option, new platform messaging, none of which existed yet. Took a real chunk of the time this release ate. 2 — Every Update Script Needed Fixing Following up on the Windows/Linux-centric script assumptions caught back in devlog #26 — turns out that wasn’t a one-off fix, it touched update scripts broadly. Had to go through and fix them properly for Mac to actually be able to update itself going forward, not just install once. 3 — Mac Is Actually Out After all of that: it’s live. Full journey from borrowed hardware sessions to an actual public release. 4 — Reminder: Mac Only Gets LTS Quick policy note, stated plainly since it matters: Mac only receives LTS releases going forward, not minor updates, unless a minor is a Mac-specific patch. Same access-constraint reasoning from devlog #19 — this isn’t changing anytime soon, so setting the expectation clearly now. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out “ship Mac” secretly meant “rebuild the update pipeline.” Q: Does Mac get every LTS release? A: Yes, every LTS. Just not the minors in between, unless that minor is Mac-specific. Q: Why not give Mac full parity now that it’s out? A: Hardware access is still the bottleneck — same reasoning as devlog #19, testing and building for Mac isn’t a routine, always-available thing yet. Q: What took so long between the decoding fixes in devlog #28 and now? A: Mostly the site and update script work described above — the actual build was closer to ready than the delivery pipeline around it was. Q: Is this the end of the Mac saga? A: The release side, yes. Ongoing maintenance is just going to follow the LTS-only cadence from here. —This is the end*— *end for now, update scripts permitting POP!!!"}, {"post_id": 59211, "ts": "2026-08-31T21:37:18Z", "hours": 9.9, "text": "Spectralis devlog #31 —Hello again proggers— More QoL, a real bug fixed in world editing, and a proper in-depth test run of the whole thing. Honest verdict after actually using it for real: still sucks, still hate it, but it’s at least somewhat usable now. Progress, technically. “somewhat usable” is a real milestone when you started from “actively bad” Cat or dog? node.isCorrupt Okay let’s get into it~ —Yap— World editing’s been the newer, rougher part of the studio since the Godot-inspired redesign in devlog #29. This round was about actually running it through its paces instead of just building on top of it, and that testing found a real problem. —The Great Suffering— 1 — More QoL Another pass of small quality-of-life improvements, continuing the trend from the last couple devlogs. Nothing individually huge, all of it adds up. 2 — The Bad Node Bug Found and fixed a genuinely bad node bug in the world section during testing. The kind of bug that only shows up once you’re actually building real worlds instead of poking at an empty editor. 3 — The In-Depth Test Run Took world editing for a real, thorough run this time instead of a quick sanity check. Built something with actual substance in it and used the tool the way it’s meant to be used. 4 — The Honest Verdict Still sucks. Still hate using it. But after this round of fixes and QoL, it’s crossed into “somewhat usable” territory, which is more than could be said before this session. low bar, cleared, moving on —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just admitted their own tool still sucks and shipped it anyway. Q: Is world editing done now? A: No, “somewhat usable” is the current state, not “finished.” More work ahead. Q: How bad was the node bug? A: Bad enough to matter, found through actual real-world testing rather than a quick check. Q: Is this related to the layer work from devlog #30? A: Different area — that was capsules/timeline, this is world editing specifically. Q: What’s the plan to make world editing not suck? A: Keep testing it for real, keep fixing what that testing turns up. This devlog’s the start of that loop, not the end. —This is the end*— *end for now, corrupted nodes permitting PAPLE!!!"}, {"post_id": 58336, "ts": "2026-08-30T18:33:09Z", "hours": 9.3333, "text": "Spectralis devlog #30 —Hello again proggers— Following up on the studio redesign from last devlog — actually building inside that new layer system now. Lyric importer, a bezier tool that fought back the whole way, and capsules jumped to full HD. 30 devlogs in and the bezier tool still almost won Cat or dog? bezier.controlPoint Okay let’s get into it~ —Yap— Layers from devlog #29’s redesign got real functionality built on top of them this round, plus a genuinely useful new import path and a resolution bump that should’ve probably happened earlier. —The Great Suffering— 1 — Layer Fixes Cleaned up a handful of issues in the new After Effects-style layer system from last devlog — the kind of rough edges that only show up once you’re actually building real content in it instead of just looking at the layout. 2 — Lyric Importer: Auto Vector Layers + Keyframing New importer that takes lyric timing and automatically generates vector layers, keyframed to match. Turns what used to be manual layer-by-layer, keyframe-by-keyframe setup into an actual import step. Big time save for anything lyric-driven, including future capsules like the demo from devlog #18. 3 — A Few More Bugs, Squashed Small round of additional fixes alongside the bigger items, nothing individually dramatic. 4 — Capsule Resolution: Bumped To Full HD Capsules render at full HD now instead of whatever lower resolution they were capped at before. Straightforward upgrade, noticeably better output. 5 — The Bezier Tool (Which Was Hell) Added a real bezier curve tool to the timeline/layer editing. Genuinely brutal to get right — curve math, control point handling, and making it feel intuitive to actually drag are three different hard problems stacked on top of each other. Worth it, but it fought back the whole way. bezier curves: simple in theory, a nightmare in an actual editor UI 6 — Timeline And Tool QoL Assorted quality-of-life improvements across the timeline and tools generally — the small friction-reduction stuff that adds up once you’re using the studio for real work instead of just testing it. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just fought a bezier tool and mostly won. Q: Does the lyric importer work with the demo capsule from devlog #18? A: That one was hand-timed and hand-built before this importer existed — this tool’s for making the next ones faster. Q: Why was the bezier tool specifically so hard? A: Curve math, control point interaction, and UI feel all had to work together, and getting any one of them wrong makes the whole tool feel broken. Q: Is full HD the resolution ceiling now, or is higher coming later? A: Full HD is what shipped this round. No commitment yet on going higher. Q: Is the studio redesign from devlog #29 basically done now? A: Getting real functionality built on it, which is a good sign, but still ongoing. —This is the end*— *end for now, control points permitting PALPABLE!!!"}, {"post_id": 57958, "ts": "2026-08-30T09:12:42Z", "hours": 9.7667, "text": "Spectralis devlog #29 —Hello again proggers— The studio’s finally looking like a real UI tool instead of a collection of windows held together by vibes. Two design references pulled this round: Godot for world editing, and Adobe After Effects for capsules. stealing good ideas from great tools is called “design research,” look it up Cat or dog? Ctrl+Shift+F Okay let’s get into it~ —Yap— Studio’s been the least polished part of the whole app for a while, mostly functional, rarely pretty. This round actually leaned into real interface design instead of just adding buttons where they fit, borrowing structure from two tools that already solved similar problems well. —The Great Suffering— 1 — Godot-Inspired World Editing World editing took cues from Godot’s editor layout — the way it structures a scene tree, viewport, and inspector panel together as one coherent workspace instead of scattered windows. Applying that same structural thinking to world editing here, since worlds are conceptually similar: a tree of pieces you’re arranging in space. 2 — After Effects-Inspired Capsules Capsule editing leaned on After Effects instead, specifically the layer/timeline/composition mental model. Capsules are time-based and layered by nature — a story surface, a visualizer, audio all stacked together — so a timeline-and-layers metaphor fits better than a flat property list ever did. 3 — The Studio Finally Feels Like A Tool Combined, these two reference points are what’s pushing the studio from “internal dev utility” toward something that actually feels designed for someone to sit down and use, not just something built incrementally to unblock whatever feature needed it that week. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing UI patterns from two very different but very good tools. Q: Is this a full rewrite of the studio UI? A: More a restructuring around better mental models than a ground-up rebuild, but it touches a lot of surface area. Q: Why Godot for world editing specifically? A: Scene/viewport/inspector is a well-worn pattern for spatial editing, and worlds are fundamentally a spatial arrangement problem. Q: Why After Effects for capsules? A: Capsules stack time-based layers — story, visualizer, audio — which maps naturally onto a timeline/layers workflow instead of flat settings. Q: Does this connect to the visualizer toolkit grind from devlogs #25-#27? A: Same broader authoring-tools push, yes, this is the UI side catching up to that work. —This is the end*— *end for now, layer panels permitting POP!!!"}, {"post_id": 57408, "ts": "2026-08-29T15:34:29Z", "hours": 8.4333, "text": "Spectralis devlog #28 —Hello again proggers— LTS 6 is out. Genuinely out, not “shipped to nowhere” out like devlog #11. Sleep deprivation’s fully caught up though — first chance I get, I’m passing out on the couch with the cat and that’s non-negotiable at this point. the cat’s getting a co-author credit at this rate Cat or dog? couch, specifically, with the cat, immediately Okay let’s get into it~ —Yap— Long stretch from devlog #26 through here finally paid off. LTS 6 pushed, and the major macOS decoding problems from the borrowed-Mac build sessions actually got fixed. Real progress, real exhaustion, both at once. —The Great Suffering— 1 — LTS 6 Is Out Following the hydra-bug fight in devlog #20, the Electron relearn and Mac hotfix in #26, and the binary format detour in #27 — it’s actually pushed now. Linux and Windows builds are the ones going out first. 2 — Major macOS Decoding Problems, Fixed Following up on the platform-assumption bug from devlog #26, where Windows/Linux-centric scripts choked on Mac being neither — dug into the actual decoding issues on macOS and got the major ones resolved this round. 3 — Mac Release Is Coming, Just Not Today No Mac hardware access again until Monday, so the macOS build follows a bit after Linux/Windows instead of dropping same-day. Same access constraint from devlog #19, still the bottleneck, still the plan. 4 — Sleep Is Winning Officially out of gas. Couch, cat, first available window. This devlog is basically the victory lap before collapsing. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to lose consciousness on a couch next to a cat, mission accomplished. Q: Is LTS 6 out for everyone right now? A: Linux and Windows, yes. macOS is coming shortly after once Mac access is available again Monday. Q: Were the macOS decoding problems from the script issue in devlog #26? A: Related territory, yes — once the platform-assumption bug got flagged, the deeper decoding issues underneath it got found and fixed too. Q: Any concerns going into the Mac release specifically? A: Nothing unresolved as of this devlog, but access is still limited to occasional sessions, so timing’s dependent on that. Q: What’s next after this? A: Sleep. Genuinely, actually sleep, before anything else touches this project. —This is the end*— *end for now, couch naps permitting thud Zzzzzz!!!"}, {"post_id": 56861, "ts": "2026-08-28T20:36:45Z", "hours": 9.3, "text": "Spectralis devlog #27 —Hello again proggers— Still going. Decided mid-grind to switch off JSON-based saving entirely and move to a proper binary streamed format instead — faster save/load, way less CPU overhead. Which sounds like a clean upgrade until you realize it means reading books on binary format design that were probably written before I was. my caffeine and my reading list have diverged wildly tonight Cat or dog? BinaryWriter Okay let’s get into it~ —Yap— The pivot away from JSON wasn’t planned going into tonight, it just became obviously worth it partway through the toolkit grind. Now stuck in the part of the process nobody enjoys: documentation, theory, and CS ideation before any of the actual implementation gets to happen. —The Great Suffering— 1 — JSON’s Getting Replaced Moving off JSON-based saving to a binary streamed format. The reasoning’s simple — faster save/load, meaningfully less CPU usage — but simple reasoning doesn’t mean simple implementation. 2 — Reading Books Older Than Me Digging into binary streaming format theory means reading material that predates this whole project by a wide margin, some of it by a lot more than that. Foundational stuff, just not exactly light reading at this hour. 3 — Documentation And Theory Hell Currently deep in the least glamorous part of any format redesign: reading documentation, working through theory, and CS ideation before writing a single line that actually does anything. Necessary, still miserable at 2am. the implementation is the fun part and it’s still hours away 4 — Sun Came Up, Had A Sandwich, Kept Going Watched the sunrise somewhere in the middle of the theory reading. Had an egg and bacon sandwich for breakfast, genuinely delicious, best part of the night so far. No sleep planned until tonight — just powering through on breakfast fuel instead. breakfast during an all-nighter hits different —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one reading format-design theory older than their own project at 2am. Q: Why move off JSON now, mid-grind? A: Became clear it was the right call while working on the visualizer toolkit — better performance characteristics were worth the detour. Q: Is this related to the toolkit from devlog #25/#26? A: Same overall session, this is a scope addition that came up while working on it. Q: When does actual implementation start? A: Once the theory and documentation phase actually resolves. Not there yet. Q: Is tonight ever going to end? A: Not until tonight, apparently — sun’s already up and there’s no sleep planned before then. —This is the end*— *end for now, binary formats permitting PAM!!!"}, {"post_id": 56521, "ts": "2026-08-28T10:00:04Z", "hours": 2.9008, "text": "Spectralis devlog #26 —Hello again proggers— Still grinding the visualizer toolkit from devlog #25. Fueled up properly this time — favorite tunes on, Coke Zero and a Monster Ultra on deck, going the entire night. Also, small detour: past me apparently gave in and used Electron at some point, so present me now has to relearn it from scratch. past me makes decisions present me has to live with, name a more accurate description of software Cat or dog? require(‘electron’) Okay let’s get into it~ —Yap— Two threads tonight: the toolkit grind continuing from last devlog, and a genuinely surprising discovery on the Mac build front that’s going to need its own hotfix branch. —The Great Suffering— 1 — Relearning Electron Past-me committed to Electron somewhere along the way and current-me forgot most of it. Spending part of tonight just getting back up to speed on something that used to be second nature. Annoying, but at least it’s a known quantity once it clicks back in. 2 — The Toolkit, Still Grinding Same visualizer toolkit as devlog #25. Not done yet, but the night’s young and there’s caffeine involved. Hoping to actually close real ground on it before LTS needs to be ready. 3 — Mac Build Actually Compiles Now Following up on devlog #19’s borrowed-Mac session — got it to build and compile this time. Real progress on a front that’s been genuinely hardware-constrained the whole way. 4 — Turns Out Mac Isn’t Windows Or Linux (Shocking, I Know) Here’s the surprising part: a lot of the build scripts turned out to be Windows/Linux-centric, and Mac is, in fact, neither of those operating systems. Somehow this wasn’t obvious until actually staring at a failing script on real Mac hardware. three major desktop OSes and somehow I only accounted for two of them 5 — Hotfix Branch Incoming Need to spin up a hotfix specifically for the platform-assumption problem in the scripts, and hoping it merges back clean without conflicts. Given tonight’s track record so far, cautiously optimistic. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who forgot their own framework choice from past-self. Q: Why Electron in the first place? A: Decision from before this devlog series apparently, reasons unclear at this hour, dealing with the consequences now regardless. Q: Is the Mac hotfix urgent? A: Ties directly into whether LTS with Mac support actually holds together, so yes, fairly urgent. Q: Was assuming Windows/Linux-only scripts really a mistake nobody caught until now? A: Apparently so. Borrowed-Mac hardware access from devlog #19 finally exposed it. Q: Toolkit status vs. hotfix status tonight — which wins? A: Whichever gets further before the caffeine runs out. Probably both get some progress. —This is the end*— *end for now, merge conflicts permitting PROPER!!!"}, {"post_id": 55615, "ts": "2026-08-27T16:05:39Z", "hours": 9.3964, "text": "Spectralis devlog #25 —Hello again proggers— Short one, I’m about to pass out for real this time. Ground away at the visualizer toolkit for a long stretch and it’s still nowhere near done. another one for the “not as close as I thought” pile Cat or dog? too tired to pick one honestly Okay quick version~ —Yap— Same visualizer editor territory from devlog #23, except the format not-changing this time didn’t mean the finish line got any closer. Long grind, real progress somewhere in there probably, just not a done toolkit at the end of it. —The Great Suffering— 1 — The Toolkit Isn’t Close Put in a long stretch on it and it’s genuinely still far from finished. Not a small gap either, just more scope than one exhausted session could close. 2 — I’m Cooked That’s the whole update. No dramatic bug story tonight, just hours in and not enough left to keep going. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who should probably close the laptop now. Q: Is this the same visualizer editor from devlog #23? A: Same one. Still cooking, longer than expected. Q: Any specific blockers? A: Too tired to write them up properly tonight. Next devlog, probably, once there’s actual sleep behind it. Q: When’s it landing? A: Unknown. Not this session. —This is the end*— *end for now, actually sleeping this time POOL!!!"}, {"post_id": 55404, "ts": "2026-08-27T06:36:57Z", "hours": 2.3342, "text": "Spectralis devlog #24 —Hello again proggers— Rewrote the README a third time. Not because it was wrong, because proper prose and actual formatting apparently reads as “completely AI” to whoever’s judging it, and I’m too burnt out to keep arguing that point. So it just got redone instead. can’t fight the vibes, can only rewrite around them Cat or dog? README.md Okay let’s get into it~ —Yap— Small win buried in the exhaustion: website’s on version 4 now and it didn’t get flagged this time. First one that made it through clean since devlog #21 started this whole saga. Progress, even if the README’s now on its third rewrite for reasons that have nothing to do with whether it’s actually good. —The Great Suffering— 1 — README Rewrite #3 Same content, restructured again, because well-formatted prose keeps getting read as an AI tell regardless of who wrote it or how. Not going to keep relitigating this one, just redid it and moved on. 2 — Website v4 Survived The actual good news. Fourth pass on the site, first one that didn’t get flagged. Whatever combination of changes from devlog #21 onward finally landed right. 3 — Hoping The App Gets Checked Next If the docs and the website keep clearing review, maybe eventually the actual app gets looked at instead of just the surface-level stuff around it. That’s the real hope here — less time defending prose formatting, more time on the thing that actually matters. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose actual writing keeps getting mistaken for a machine’s. Q: Why does formatted prose get flagged as AI? A: Genuinely unclear, and at this point not worth the energy to keep contesting. Rewriting around it was faster than arguing it. Q: Is this the fourth full website redesign? A: Yes — devlog #14, then #21’s rework, and now this pass, landing clean. Q: Has the app itself ever been flagged? A: Not yet, and that’s sort of the point of this devlog — hoping it stays that way, or at least gets a fair look if it comes up. Q: How’s the burnout? A: Present. Noted. Continuing anyway. —This is the end*— *end for now, formatting opinions permitting PEEL!!!"}, {"post_id": 55123, "ts": "2026-08-26T16:10:50Z", "hours": 2.6669, "text": "Spectralis devlog #23 —Hello again proggers— Introducing the visualizer editor. Been sitting on this one for a while without announcing it, for a very specific reason: every single time it felt ready, the format changed again and “ready” moved further away. Think it’s actually real this time. announced it in my head about six times before this devlog Cat or dog? visualizer.format Okay let’s get into it~ —Yap— Grinding all night on this one, branch and v1 dropping tomorrow. No promises beyond that, just the plan and the fact that this has been quietly cooking for way longer than any single devlog has let on. —The Great Suffering— 1 — Why This Wasn’t Announced Sooner Kept hitting the point where the editor felt done, then rethinking the underlying format and starting that part over. Easier to just not announce something that keeps changing shape than to keep walking back a “it’s ready” claim in public. 2 — v1 And The Branch, Tomorrow Committing to it now — v1 and the branch land tomorrow. Whole night’s going toward getting there, which given the last 22 devlogs of this project is either a great sign or a very familiar warning sign. history suggests: could go either way 3 — What The Visualizer Editor Actually Is A real editor for building visualizers instead of the visualizer side of the app staying built-in-only. Ties back to everything from the capsule/worlds work in devlogs #7 and #8 and the custom visualizer built for the demo capsule in devlog #18 — this is the tool version of doing that by hand. 4 — Hackatime Also Just Died (Or My PC Did) On top of everything else, Hackatime seems to be down, or my PC’s cooked, unclear which yet. Either way tracked hours for tonight are now undefined. Yipee. unlogged hours are the best kind of hours, said nobody’s time tracker ever —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to pull yet another all-nighter for a feature reveal. Q: Why did the format keep changing? A: Each pass revealed a new limitation once actually used for real, and fixing that meant reworking the format again rather than shipping something known to be wrong. Q: Is this related to the demo capsule visualizer from devlog #18? A: Same territory. That one was hand-built. This is the editor meant to make building one not require doing it by hand. Q: What’s “v1” mean here specifically? A: First real usable version, branch-only for now, not a full public release yet. Q: Any risk this slips again? A: Always possible given the track record, but committing to tomorrow specifically this time. —This is the end*— *end for now, format stability permitting PEPLE!!!"}, {"post_id": 54323, "ts": "2026-08-25T08:40:49Z", "hours": 4.6333, "text": "Spectralis devlog #22 —Hello again proggers— Posting this before I pass out for real. And no, that wasn’t me faceplanting the keyboard, that was the cat walking across it. Very important distinction. the cat gets a commit credit for that one, honestly Cat or dog? cat, apparently, tonight specifically Okay let’s get into it~ —Yap— Back on the ever-growing pile of bugs and QoL from devlog #20’s hydra fight — turns out killing all the tiny bugs once doesn’t mean they stay dead forever, more just showed up in the meantime. Made real progress anyway. —The Great Suffering— 1 — A Few Spotify Bugs, Actually Squashed Chased down and fixed a handful of Spotify-side bugs this round. Not a full audit like earlier devlogs, just real ground covered on stuff that’s been sitting in the pile. 2 — Resizing QA Went through resizing behavior across the app and did a real QA pass on it — the kind of thing that’s easy to skip until someone resizes a window in a way you never tested and everything looks wrong. 3 — The Multi-Channel Stream Queue Idea Had the idea to implement multi-channel support for Streamer Queue. Started on it, and it’s genuinely probably too big to land fully before LTS ships — most likely going in as a stub for now rather than a finished feature, with the real implementation following after. “horrible idea” is doing some self-aware lifting there and I stand by it —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who mistook a cat for their own exhaustion, and honestly it could’ve gone either way. Q: What’s a “stub” mean for multi-channel here? A: The scaffolding and interface exist, the real functional implementation doesn’t yet. Placeholder with intent, not a real feature. Q: Is this the same bug pile from devlog #20? A: Same pile, refilled since then. Small bugs apparently regenerate on their own schedule, not just when you’re actively fighting them. Q: Why is multi-channel “horrible” if you’re building it anyway? A: Because scope-wise it’s a lot more than it looks like on paper, and admitting that upfront beats pretending it’s simple. Q: Sleep status tonight? A: About to happen, actually, this time. Cat’s taking the credit either way. —This is the end*— *end for now, sleepy cats permitting PEOPLE!!!"}, {"post_id": 54216, "ts": "2026-08-25T03:14:52Z", "hours": 6.1014, "text": "Spectralis devlog #21 —Hello again proggers— Flagged for “AI website” again. By Shipwrights this time. Getting a little tired of this specific accusation, honestly — a commit log sitting right there would show actual work happening over actual time, but apparently that’s a few extra minutes nobody wants to spend. the receipts exist, nobody’s asking to see them Cat or dog? git log –oneline Okay let’s get into it~ —Yap— Third redesign of the site now. Not because the flag was right, but because if this keeps happening it’s worth just making the “looks AI-made” argument harder to make at all, regardless of whether it was ever a fair read in the first place. —The Great Suffering— 1 — Flagged Again Shipwrights flagged the site as AI-generated. Same accusation as the devlog #12-#14 saga, different flagger this time. Slightly more annoying with each repeat, since the actual work history’s right there for anyone willing to look. 2 — The Annoying Part It’s not that the site got flagged, it’s that the disproof is trivially available — commits, timestamps, iterative changes across three separate rebuilds — and checking that apparently isn’t part of the process. Frustrating, not devastating. 3 — Redesigned It A Third Time Rather than fight the flag directly, changed the site again. Third pass now, and it genuinely reads less like generic AI-slop territory than the last version did. Whether that satisfies the next flag or not, it’s a real improvement on its own merits. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s redesigned this website three separate times partly to dodge a false flag. Q: What’s Shipwrights? A: The one doing the flagging this round. Q: Is the flag actually accurate? A: No — there’s a real commit history behind the site across devlogs #12 through #14 and now this one. The flag’s wrong, just annoying to keep disproving. Q: Does this redesign replace the one from devlog #14? A: Yes, third full pass on top of that one. Q: Any plan if it gets flagged a fourth time? A: Probably the same plan: keep the receipts, keep improving the site anyway, move on. —This is the end*— *end for now, false flags permitting PALPABLE!!!"}, {"post_id": 53903, "ts": "2026-08-24T16:41:40Z", "hours": 7.9, "text": "Spectralis devlog #20 —Hello again proggers— Two zero. Milestone devlog, and it’s a good one: LTS is about to actually go out the door, Mac included, today. we made it, barely, on no sleep, as tradition demands Cat or dog? git revert HEAD 7 Okay let’s get into it —Yap— Spent the whole night doing QoL and QA on all the tiny bugs that had been getting pushed aside devlog after devlog. Turns out “small bugs” and “easy to fix” are not the same category, and the whole night proved it the hard way. —The Great Suffering— 1 — Hydra Bugs Every single one of the small deferred bugs got patched, and every single patch spawned about three new ones in its place. Fix one, watch three grow back. Felt less like debugging and more like fighting something with a regeneration mechanic. cut off one head, three more show up, name a more accurate bug report 2 — Tried Claude Code Out Of Exhaustion Got tired enough mid-hydra-fight to set up Claude Code and hand off some of the grind. It did not go well — ended up rearranging the repo and commit layout in ways that made the history a mess, not the bugs. 3 — Had To Undo Its Commits Rolled back what Claude Code did and went back to fixing things manually. Lesson for the night: handing off a messy, deep-in-it repo state to an agent mid-crisis is not the same as handing off a clean one. 4 — Actually Got All The Tiny Bugs Out After all of that, the hydra’s actually dead. Every deferred small bug from the last 19 devlogs finally cleared in one sitting, which is the whole reason today’s release is happening at all. 5 — Mac Release, Today Following up on devlog #19’s borrowed-Mac build attempt — releasing to Mac today alongside everything else. First real payoff from that session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who fought a hydra of bugs all night and won, barely. Q: Did Claude Code actually break anything functional, or just the repo layout? A: Just history and commit structure, nothing shipped broke because of it. Still a mess worth undoing. Q: Is this LTS build the one from devlog #19’s prep? A: Yes, same one. This was the final QA gauntlet before it goes out. Q: Is Mac really getting it today? A: That’s the plan, following through on the borrowed-Mac build session from last devlog. Q: 20 devlogs in, anything you’d do differently? A: Sleep more, probably. Not going to happen, but it’d be the right answer. —This is the end*— *end for now, hydra heads permitting PROPERTY!!!"}, {"post_id": 53619, "ts": "2026-08-24T08:31:21Z", "hours": 4.2003, "text": "Spectralis devlog #19 —Hello again proggers— v6 LTS is on the horizon. Scheduled time with a friend who actually owns a Tim Cook machine, fingers crossed a Mac build comes out the other side of that session actually working. praying to the WWDC gods Cat or dog? arm64 Okay let’s get into it~ —Yap— First real LTS push. Different mindset than the last 18 devlogs of feature work and 3am bug hunts — LTS means stability first, and it also means finally taking a real swing at macOS instead of leaving it as a someday problem. —The Great Suffering— 1 — Prepping For v6 LTS Getting the groundwork in place for the first Long Term Support build. Less “ship the coolest thing,” more “ship the thing that won’t need constant babysitting after release.” 2 — Borrowing A Friend’s Mac Don’t own a Mac. Scheduled dedicated time with a friend’s actual Apple hardware to attempt a real build instead of guessing blind or fighting a CI-only setup with no way to actually test the output. 3 — The Honest Caveat: Mac Support Will Lag Straight talk: limited access to Mac hardware means Mac builds will very likely only get LTS releases going forward, and will land late relative to betas and regular updates on other platforms. Not ideal, but better to say it now than pretend otherwise. can’t test what you can’t touch —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing a friend’s Mac because Apple hardware access is not a given. Q: Will Mac users get every update? A: Realistically, no — LTS builds only for the foreseeable future, and later than other platforms. Access to hardware is the bottleneck, not desire to support it. Q: Why prioritize LTS over a beta cycle right now? A: Stability’s the actual goal for v6. Betas can come later once the LTS foundation’s solid. Q: Is the Mac build guaranteed to work this session? A: No promises. That’s what “fingers crossed” means. Q: What happens if the Mac session doesn’t go well? A: Try again next time hardware access lines up. Not giving up on it, just constrained by it. —This is the end*— *end for now, Tim Cook machines permitting PRINCIPLE!!!"}, {"post_id": 53545, "ts": "2026-08-24T04:19:31Z", "hours": 7.8, "text": "Spectralis devlog #18 —Hello again proggers— First real demo capsule is live. Not a screenshot, not a “trust me it works” — an actual .spectralis file you can grab and open yourself, right after devlog #17’s night of nothing. Felt good to ship something that isn’t a revert for once. redemption arc, one demo file at a time Cat or dog? demo.spectralis Okay let’s get into it~ —Yap— Wanted the first public demo to actually show off what a capsule can do, not just be a proof of concept nobody can open. So it’s a full one: real track, real hand-timed lyrics, and a visualizer built specifically for it instead of a generic default. —The Great Suffering— 1 — The Demo’s Live demo.spectralis is up at cdn.deltavdevs.com now. First capsule anyone outside this devlog series can actually download and open. 2 — The Track And The Lyrics Built around Black Coast’s “TRNDSTTR” (Lucian Remix). Lyrics for it were timed and written into the capsule by hand — not pulled from some export, actually sat down and did the timing work myself. 3 — The Visualizer’s Custom, Not A Default Also built the visualizer specifically for this capsule instead of shipping the demo with a stock one. Wanted the first thing people see from Spectralis to actually demonstrate what the capsule format can do end to end — audio, synced lyrics, and a visual built to match, all in one file. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one downloading the first real capsule demo. Q: Where’s the demo? A: cdn.deltavdevs.com/spectralis/demo.spectralis — direct download, no wrapper page. Q: Did you write the lyrics yourself or pull them from somewhere? A: Wrote and timed them in by hand for this capsule specifically. Q: Is the visualizer reusable for other capsules? A: Built for this one specifically, but nothing stopping it from getting adapted or reused as a base for others later. Q: Is this what stories/capsules from devlog #7-#8 were building toward? A: Exactly that. This is the first one actually finished and out in the world instead of just being tested locally. —This is the end*— *end for now, capsule downloads permitting PARODY!!!"}, {"post_id": 53182, "ts": "2026-08-23T16:54:15Z", "hours": 12.2667, "text": "Spectralis devlog #17 —Hello again proggers— 12 hours. All-nighter. Zero sleep. Feature isn’t in the app. Nothing shipped. This is the devlog where I explain what an entire night of work bought me, and the honest answer is “a very expensive lesson.” worth it? absolutely not. did i learn something? also debatable Cat or dog? catch (ApiDoesNotExistException) Okay let’s get into it~ —Yap— Got ambitious. Decided Spectralis should integrate with everything — Pandora, Amazon Music, a bunch of other big platforms on top of what already works. Turns out “everything” includes a lot of services that simply don’t offer a public API to integrate with in the first place, and finding that out was not the fast part of the night. —The Great Suffering— 1 — The APIs Just Don’t Exist Pandora, Amazon Music, and others: no public API to build against. Not “hard to find,” not “poorly documented,” just not there. Should’ve been step zero, ended up being the thing that derailed the entire night once discovered mid-build instead of before starting. 2 — So I Built Backdoors Instead Spent a huge chunk of the 12 hours reverse-engineering and building unofficial access paths instead, since the front door didn’t exist. This is the kind of work that eats hours and produces nothing you can point to until it’s fully working, if it ever gets there. 3 — Most Of Them Were Already Patched Implemented several of these backdoor approaches only to find out the platforms had already closed the exact gaps being exploited, sometimes before the implementation was even finished. Built things that were dead on arrival by the time they existed. patched before i even shipped it, incredible timing 4 — Asked Claude, Got A Hallucinated Answer, Followed It Anyway At the point of giving up, asked for a way to make it work anyway. Got a confident-sounding approach back that didn’t actually correspond to anything real, and followed it blindly instead of verifying it first, because by that point it was hour 10-something and verifying things sounded like more effort than it was. 5 — Ripped The Whole Feature Out End state: none of it works, none of it can work without real API access that doesn’t exist, so the entire feature attempt got stripped back out of the codebase. 12 hours, one commit’s worth of net progress, and that commit is the revert. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out platforms without public APIs stay that way for a reason. Q: Is any of this coming back later? A: Not until there’s an actual, real, non-reverse-engineered way in. Not chasing patched backdoors again. Q: Should you have asked Claude earlier instead of at hour 10? A: Probably. Should also have double-checked what it said instead of following it blind at 4am. Two separate lessons from one night. Q: Was any of the 12 hours useful? A: Now know definitively which platforms are and aren’t worth attempting. That’s the only thing salvaged. Q: Sleep status? A: Catastrophic. Handling that before touching code again. —This is the end*— *end for now, actual sleep permitting Im gonna go pass out on the couch ADIOS!!!"}, {"post_id": 52796, "ts": "2026-08-23T04:27:01Z", "hours": 0.6667, "text": "Spectralis devlog #16 —Hello again proggers— Short one. Found the website pipeline issue from devlog #15. Cat or dog? sudo —Yap— It wasn’t the code. It was permissions. The site was calling root but never actually had access to root, which is exactly why it worked fine locally and fell over the second it hit deployment. “It woRKS On My macHiNe” — the oldest curse in software, and I said it unironically. classic —This is the end*— *end for now, root access permitting PAPAYA!!!"}, {"post_id": 52775, "ts": "2026-08-23T03:46:04Z", "hours": 2.0667, "text": "Spectralis devlog #15 —Hello again proggers— I lied. Posted devlog #14 saying the site was done and shipped, and the deploy pipeline crashed basically the second it went out. So that’s fun. On the bright side, v5.4.2 also went out this round, and it’s actually solid. “it’s done” is apparently my curse word Cat or dog? dequeue() Okay let’s get into it~ —Yap— Website pipeline ate itself right after devlog #14 posted, which is its own kind of poetic. Meanwhile the app side had a genuinely good run — six real fixes landed, one of them embarrassing enough to name directly. —The Great Suffering— 1 — The Website Pipeline Crashed Right After I Said It Shipped Devlog #14 said done. Pipeline said otherwise, immediately. Working on getting it back up, this is very much a “developing situation” and not a “resolved” one yet. 2 — Listener Requests Auto-Queue Now Requests from listeners now auto-queue instead of needing a manual step to actually land in the queue. 3 — Audio Literally Never Played, Whoops Exactly what it says. Somewhere in there, audio just wasn’t playing. Found and fixed, extremely glad this one got caught. a music player where the music doesn’t play is a bold minimalist statement 4 — Found It: Join Links Were Missing A Slash Root cause of a chunk of shared-play join weirdness — the links were missing a slash. One character. Fixed, join links actually resolve correctly now. 5 — Host Room Button Actually Tells You Something Now The host room button used to just sit there. Now it actually communicates state back to you instead of leaving you guessing whether anything happened. 6 — Host Room Was Dropping Every Tick Forever Host room had a bug where it was dropping on every single tick, indefinitely, rather than staying stable. Fixed so the room actually holds instead of degrading in real time. 7 — yt-dlp Was 5 Months Stale, Updated The bundled yt-dlp from devlog #10 hadn’t been touched in 5 months. Updated. Stale extraction tooling breaking silently is exactly the kind of thing that sneaks up on you. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who called the website shipped and got immediately humbled by CI. Q: Is the website back up yet? A: Working on it. Genuinely not resolved as of this devlog. Q: How long was audio actually broken for? A: Not specified, but “literally never played” is about as bad as this category of bug gets. Fixed now. Q: Was the missing-slash bug related to the join link work from devlog #9? A: Yes, same feature area, this was the actual root cause of some of the lingering weirdness there. Q: Is 5.4.2 stable? A: As far as testing shows. Same disclaimer as always applies. —This is the end*— *end for now, deploy pipelines permitting PARABLE!!!"}, {"post_id": 52728, "ts": "2026-08-23T01:43:09Z", "hours": 2.1678, "text": "Spectralis devlog #14 —Hello again proggers— Site’s done. Actually done. Got it to a place I actually liked instead of just a place I was tired of looking at, and shipped it. Three devlogs of fighting the generic-AI-look problem and it finally landed somewhere that feels like Spectralis instead of every other landing page on the internet. took long enough Cat or dog? git push origin main Okay let’s get into it~ —Yap— After devlog #12 and #13’s whole ordeal of everything converging on the same generic design no matter what got tried, something finally clicked and stuck. Shipped it. Two honest confessions on the way out the door, might as well log them here instead of pretending otherwise. —The Great Suffering— 1 — It’s Live The full rework from the last two devlogs is done and pushed. Went from “everything looks like AI made it” to something that actually feels intentional. Whatever finally broke the streak, it worked. 2 — The Help & Manuals Tab Is A Placebo Button Full transparency: the Help & Manuals tab on the site exists, looks real, sits right where you’d expect it, and does essentially nothing right now. It’s there because a site without one looks incomplete, not because there’s real content behind it yet. Consider it a placeholder wearing a real button’s clothes. it’s not lying, it’s aspirational 3 — I Copied FL Studio’s Homepage. Hard. Not going to pretend otherwise: leaned on FL Studio’s site pretty heavily for structure and layout ideas here. And honestly, that’s just how this works — programming, design, all of it is borrowing from people who borrowed from the people before them. Nobody’s inventing layout from first principles in 2026. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who finally shipped a website after three devlogs of fighting it. Q: Is Help & Manuals actually going to do anything eventually? A: Presumably, someday. Right now it’s a promise the button is making on behalf of a future devlog. Q: Isn’t copying FL Studio’s homepage kind of a big deal? A: Structure and layout inspiration, not a straight copy-paste. And realistically, every site borrows from something — this one’s just being honest about the source. Q: Did the “everything looks like AI” problem from devlog #13 actually get solved? A: Yes, finally. Whatever changed between then and now worked. Q: What’s next now that the site’s shipped? A: I finally get to ship my project without worrying about AI looking websites —This is the end*— *end for now, placebo buttons permitting PLACEBO!!!"}, {"post_id": 52690, "ts": "2026-08-22T23:32:19Z", "hours": 10.1028, "text": "Spectralis devlog #13 —Hello again proggers— Still on the website. Turns out the “make it not look like AI made it” problem does not have an easy exit — everything ends up looking like AI made it no matter what gets tried. Also had to ask Claude how to center a div. Yes, that div. The one every developer has fought since the dawn of CSS. the irony of asking an AI how to make something look less AI-made is not lost on me Cat or dog? display: flex Okay let’s get into it~ —Yap— Round two on the visual rework from last devlog, and the honest update is: it’s harder than expected. Every direction tried still lands somewhere in “generic modern web design,” which might just be what modern web design looks like right now regardless of who’s making it. —The Great Suffering— 1 — Everything Still Looks Like AI Made It Tried multiple directions this round trying to get away from the generic look. Kept landing back in the same neighborhood anyway. Starting to suspect this isn’t a “try harder” problem, it’s just what the current design language space looks like from basically every angle right now. 2 — Had To Ask Claude How To Center A Div The oldest joke in frontend development, still funny because it’s still true. Got stuck on it anyway. Some things never stop being annoying regardless of how many years of CSS have gone by. flexbox has existed for a decade and this is still where we are 3 — Pulled Up W3Schools For The First Time In Forever Dug up an old W3Schools reference mid-debugging, and it is dusty as hell at this point but the information’s still correct. Sometimes the ancient reference site is exactly what’s needed, aesthetics of the source be damned. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who asked an AI to help make something look less like an AI made it. Q: Did the AI-startup look actually get fixed this round? A: Not fully. Still fighting it. That’s most of this devlog. Q: Why does everything converge on the same generic look? A: Best guess: current tools and current design trends both nudge toward the same handful of patterns, so escaping it takes more than just trying different colors. Q: Is W3Schools still reliable? A: Apparently yes. Dated presentation, correct information. Q: When’s the website actually done? A: Closer than devlog #12, not there yet. Ask devlog #14. —This is the end*— *end for now, centered divs permitting PEPPLE!!!"}, {"post_id": 51936, "ts": "2026-08-21T21:25:25Z", "hours": 10.2181, "text": "Spectralis devlog #12 —Hello again proggers— Website’s getting a real pass. Not new copy this time, actual visual identity work, because it currently reads like every AI startup landing page that ever came out of the middle of California, and Spectralis is not that. gradient blob, bold sans headline, “revolutionize your workflow” — no Cat or dog? theme.css Okay let’s get into it~ —Yap— Not released yet, deliberately. This one’s still in progress, but close enough that it’s worth logging before it’s done instead of only after. The goal’s simple to say and annoying to actually do: stop looking generic. —The Great Suffering— 1 — The AI-Startup Look Had To Go Somewhere along the way the site had drifted into the exact aesthetic every seed-stage AI company in the Bay Area ships with — same fonts, same soft gradients, same layout rhythm everyone’s using because everyone else is using it. None of that says anything about what Spectralis actually is. 2 — Actual Visual Identity Work Working through what the site should look like instead of what’s easy to reach for by default. This is the slow part — not writing more copy, actually deciding what the thing looks like and why, instead of inheriting a template’s opinions by accident. 3 — Not Done, Getting Close Deliberately not shipping this mid-rework. Better to land it as one coherent pass than dribble out half-finished visual changes and confuse anyone who lands on the page in between. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one trying to make a music app’s website stop looking like a fundraising deck. Q: What specifically screamed “AI startup”? A: The general vibe more than any one element — the kind of design every YC-adjacent landing page converges on when nobody makes an active choice. Q: Why not ship incrementally instead of waiting? A: A visual identity rework half-applied looks worse than the thing it’s replacing. Waiting for it to be coherent. Q: How close is close? A: Close. Not “next devlog” close necessarily, but visibly closer than devlog #11 left it. Q: Does this touch the changelog-from-backend system from devlog #5? A: No, that infrastructure stays as-is. This is purely visual. —This is the end*— *end for now, gradient blobs permitting POGO!!!"}, {"post_id": 51267, "ts": "2026-08-20T20:03:38Z", "hours": 1.8481, "text": "Spectralis devlog #11 —Hello again proggers— Docs got a full rework this round. Also turns out v5.4.1 went out to nobody, because it never actually got pushed to the CDN. Tagged, released, announced probably, and completely inaccessible the whole time. shipped a release into a void and called it done Cat or dog? docs/ Okay let’s get into it~ —Yap— Started as a documentation pass and ended with the realization that the last release had been sitting local this whole time instead of where anyone could actually get it. Two very different kinds of work, same devlog. —The Great Suffering— 1 — The Entire Doc Rework Not a touch-up, a full rework. Docs, README, and STANDARDS all got restructured rather than patched in place, since patching them individually over the last several devlogs had left them internally inconsistent with each other and with what the app actually does now. 2 — 5.4.1 Never Made It To The CDN The actual headline bug of this devlog. v5.4.1 shipped, in the sense that it was built, tagged, and probably announced somewhere — but never got pushed to the CDN, meaning nobody could actually download it. Public-facing, and it was quietly broken the whole time until someone noticed. a release that ships to nowhere didn’t really ship 3 — Fixed And Actually Pushed Corrected the CDN push so 5.4.1 is genuinely available now, not just tagged in git looking like it is. Also part of why the doc rework mattered — docs referencing a version nobody could download was its own kind of lie. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who tagged a release and forgot the part where people can actually get it. Q: How long was 5.4.1 unavailable? A: Long enough to be embarrassing, short enough to fix before it became a real problem. Caught during this pass. Q: Why redo the docs entirely instead of patching them again? A: Because incremental doc patches across several devlogs had drifted apart from each other and from the app. A full rework got everything back in sync at once. Q: Is this the same CDN that serves changelogs now (devlog #5)? A: Same one. This time the release binary itself was the thing missing, not just content. Q: Anything else quietly broken that hasn’t surfaced yet? A: Unknown by definition. That’s what the next devlog is for. —This is the end*— *end for now, CDN pushes permitting POPPY!!!"}, {"post_id": 51122, "ts": "2026-08-20T16:50:19Z", "hours": 11.1333, "text": "Spectralis devlog #10 —Hello again proggers— 11 hours, zero sleep, and somewhere in the middle of that a full release went out. v5.4.1, then v5.4.1.2 right behind it because apparently one patch release wasn’t enough punishment for one night. sleep is a scheduling conflict I lost Cat or dog? winmm.dll Okay let’s get into it~ —Yap— Started as a normal patch pass and turned into a full Linux compatibility audit at 3am, because it turns out shipping something cross-platform means actually checking what “cross-platform” was quietly lying about. Found four separate ways the app was secretly Windows-only, fixed all of them, shipped twice. —The Great Suffering— 1 — winmm.dll Doesn’t Exist On Linux, Who Knew Something was calling into winmm.dll directly. Which is a Windows multimedia API. Which does not exist on Linux. Genuinely did not know this was happening until it broke loudly. “who knew” is doing a lot of work in that commit message 2 — Shipped A .exe To Linux, My Bad Somewhere in the build/packaging step, a .exe was ending up in the Linux build. An executable format Linux does not run. Not a subtle bug, just an embarrassing one. 3 — Song Wars Closing = Surprise Alt+F4 Closing Song Wars was apparently also closing the entire app, unprompted, no warning. A feature window doubling as a kill switch is not a feature, it’s a trap. 4 — Yeeted yt-dlp + ffmpeg Into Linux Land, Zero Installs Needed The actual fix underneath most of this: bundled yt-dlp and ffmpeg directly for Linux instead of assuming they’d already be installed system-wide, which they very often weren’t. Zero external installs needed now, it just works out of the box. 5 — Last Page Isn’t A Dead End Anymore Merged in from feature/story-pager-finish — reaching the last page of a story used to just… stop. Dead end, nothing to do. Fixed so it actually resolves properly instead of leaving you stranded on the final page. 6 — Two Releases In One Night v5.4.1 went out, then a second pass turned up enough left over that v5.4.1.2 followed right after. Both merged through staging same night, same sleepless stretch. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who found out about winmm.dll at 3am. Q: Was Spectralis actually broken on Linux before this? A: In at least four distinct ways, yes. Missing binaries, a stray .exe, a Windows-only DLL call, and an app-closing bug. Now fixed. Q: Why two patch releases instead of one? A: v5.4.1 went out, more got found immediately after, and waiting felt worse than just shipping v5.4.1.2 same night. Q: Did you actually not sleep? A: Correct. Not recommending it. Doing it anyway next time, probably. Q: Is Linux actually solid now? A: As solid as one very long, very tired night of testing can confirm. Time will tell the rest. —This is the end*— *end for now, sleep schedules permitting PIBBLE!!!"}, {"post_id": 50150, "ts": "2026-08-19T07:58:44Z", "hours": 5.4667, "text": "Spectralis devlog #9 — 5.4.0 is public —Hello again proggers— 5.4.0 is actually out, publicly, in people’s hands. Diffed v5.3.4 through v5.4.0: 40 commits, Aug 16-18, four threads of work. Cat or dog? spectral.resume() —Yap— Shared play became joinable, Streamer Queue and the Discord bot got hardened, story/visualizer bugs got chased down in one sitting, and some platform/perf issues got caught. None of these were small. —The Great Suffering— 1 — Shared Play Can Be Joined Now spectralis://shared-play/join links used to fall through to nothing. Now routed to a real handler. 2 — Streamer Queue: Host Controls + A Bot That Won’t Die Host can add tracks and mark played/skipped directly, no viewer round-trip. Desktop got an add-to-queue button and history panel. Both pollers (desktop + bot) back off dead rooms instead of hammering them. SQ API calls got a 10s timeout + one retry, GETs only — mutating calls don’t retry, to avoid double-submitting on a timed-out-but-successful response. Bot had zero global error handlers before this. One bad promise took the whole process down silently. Now it logs and survives, plus 3-attempt startup retry. 3 — Story Pages vs. Visualizers: Three Bugs, One Afternoon A capsule with both used to have them fight. Story can now queue a surface behind it — TryAdvancePastStory() swaps in the queued surface on spectral.resume(). Audio was starting under the story before the reader finished — now gated on whether a surface is queued. Once queued, picker/prev-next/keyboard could still hijack it — new IsVisualizerLocked blocks all three (user-picked “Special:” visualizers stay switchable). 4 — Platform + Perf Fixes MP3 decoding silently depended on Windows’ ACM codec via Mp3FileReader. Swapped to NLayer, pure managed decoder — MP3s decode on Linux/macOS now too. WebView2Host inline-rendered small visualizers via NavigateToString, which serves from about:blank with no real origin and tanks frame rate — everything goes through the fast file-backed path now. Auto-cycle switching checked IsLoaded/IsPlaying, both false during Spotify playback since Spotify never loads into the local engine — switched to HasTrack/IsPlaying. And: a regex stripping onclick=”…” had no exception, matched JS identifiers like onSomething =, and being quote-unguarded ate everything to the next stray quote anywhere later in the file. Fixed with a -block carve-out. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s been waiting on shared play join links forever. Q: Was shared play really host-only until now? A: Yes. The link existed, it just went nowhere. Q: How bad was the regex bug? A: Silent corruption of unrelated code anywhere later in the file, no error thrown. Very glad it’s found. Q: Is 5.4.0 stable? A: As far as testing shows. That’s what everyone says right before the hotfix. —This is the end*— *end for now, public users permitting PEBBLE!!!"}, {"post_id": 49430, "ts": "2026-08-18T08:25:19Z", "hours": 10.7003, "text": "Spectralis devlog #8 —Hello again proggers— 10 hours 48 minutes. Again. Didn’t plan it, didn’t notice it happening, just looked up and the sun had done a full cycle. This time it was capsules and worlds actually getting built and tested for real instead of just existing in theory. we’ve been here before and we will be here again Cat or dog? Capsule.story + Capsule.visualizer print(f”I try to make stu{2f} which {actually_coexist} {10h48m_later}”) Okay let’s get into it~ —Yap— Stories came back in devlog #7 as a concept. This round was making and testing the first actual .spectralis capsules and worlds built on that concept, which is a different job entirely — turns out “the architecture supports it” and “a real capsule with a real story actually works” are two very different milestones. Also fixed a bug that only shows up once you’re actually testing real capsules instead of imagining them, and a GitHub pull issue that had nothing to do with any of this and ate time anyway. —The Great Suffering— 1 — Building And Testing The First Real Capsules And Worlds Most of the 10 hours 48 minutes, honestly. Going from “stories and worlds work in concept” to actually authoring capsules, loading them, and confirming the hooks — track start, track control, the custom HTML page — behave the way they’re supposed to under real content instead of a test stub. This is the part where theory meets “wait, why is this blank.” 2 — A Story And A Visualizer Couldn’t Both Exist In One Capsule Found this one while testing, not before. A capsule with both a story and a visualizer defined would break, since apparently the two weren’t built to coexist in the same capsule at all. Fixed so a single capsule can hold both without one stepping on the other. the two features that were supposed to be siblings turned out to be enemies 3 — GitHub Was Being Weird About Pulling Somewhere in the middle of all this, git decided pulling wasn’t going to just work. Fixed the pulling issue, which is the kind of fix that has no interesting story attached, it was just broken and then it wasn’t. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who said “quick test” and looked up 10 hours 48 minutes later. Q: Was the story/visualizer bug there since devlog #7? A: Presumably, yes. Nobody had actually tried putting both in one capsule until this round. Q: What does “testing capsules and worlds” actually involve? A: Authoring real ones, loading them in the app, and checking the hooks — track start, track control, custom HTML rendering — behave correctly with actual content, not placeholder data. Q: What was the GitHub pulling issue? A: Not going into detail, it wasn’t interesting, it was just broken. Fixed now. Q: Is this the last capsule/worlds devlog? A: No idea. Ask devlog #9. —This is the end*— *end for now, git remotes permitting PEPPERONI!!!"}, {"post_id": 49210, "ts": "2026-08-17T21:23:21Z", "hours": 10.1667, "text": "Spectralis devlog #7 — welcome 5.4.0 —Hello again proggers— 5.4.0’s out. This one brought back a feature I’d basically buried, hardened two systems that were still a little too trust-me-bro, and finally let shared play open where it should’ve been opening the whole time. Also touched the docs, which I’m choosing to be proud of. Cat or dog? .spectralis print(f”I try to make stu{2f} which {actually_ships} {5.4.0}”) Okay let’s get into it~ —Yap— Big one this round is stories coming back into .spectralis capsules, except not as the thing they used to be — modernized, closer to how album worlds work now, as a proper custom HTML page with real hooks instead of whatever they were before. Rest of the release was hardening and cleanup: Streamer Queue and Discord got a pass to make sure live use doesn’t fall over, shared play finally opens in-app, and the docs stopped lying about what the app actually does. bringing back a feature I killed is a personality trait at this point —The Great Suffering— 1 — Stories Are Back, But Not The Same Stories Old stories concept is back inside .spectralis capsules, rebuilt to match how album worlds work now instead of resurrecting the original implementation as-is. Each one’s a custom HTML page with real hooks into the player — starting tracks, track control, the works — instead of being a static bolt-on. Bringing it back meant actually integrating it with the current architecture, not just copy-pasting the old version back in. 2 — Streamer Queue + Discord Got Hardened Both of these existed and mostly worked, which is different from “survives actually being used live by a streamer with chat moving.” Went through and hardened the interaction between Streamer Queue and the Discord bot — the stuff that only shows up under real load or real edge cases instead of a clean local test run. “mostly works” is doing a lot of lifting in software 3 — Shared Play Opens In App Now Shared play used to need you to go find it. Now there’s an actual open-in-app implementation, so joining a shared room is a real in-app flow instead of a workaround. Small change on paper, but it’s the difference between a feature people use and a feature people forget exists. 4 — Docs, README, and STANDARDS Actually Match Reality Updated the docs, README, and STANDARDS to reflect what’s actually in the app at this point instead of an earlier version of it. Boring work, necessary work, the kind of thing that only gets noticed when it’s wrong. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who buried a feature and then dug it back up two versions later. Q: Why bring stories back instead of leaving them dead? A: Because the concept was good, the old implementation just wasn’t, and album worlds proved the modernized version of the idea actually works. Q: What counts as “hardening” for Streamer Queue and Discord? A: The stuff that only breaks under real conditions — live chat, real timing, real edge cases — not the happy path you get testing solo. Q: Does shared play opening in-app change how sessions work? A: No, same sessions, same presence/reactions/queue from devlog #6. Just a real entry point now instead of a workaround. Q: Anything left over for next time? A: Always. This is a devlog series, not a finish line. —This is the end*— *end for now, capsule hooks permitting 再见!!!"}, {"post_id": 48667, "ts": "2026-08-17T05:02:56Z", "hours": 9.6881, "text": "Spectralis devlog #6 —Hello again proggers— Website stuff wrapped up at the 310ee27 merge, then everything shifted straight into Streamer Queue and shared play. Ten commits deep on dev, plus one fix that’s sitting uncommitted in the working tree because it’s the kind of thing you want to stare at twice before you trust it. Cat or dog? Mp3FileReaderBase print(f”I try to make stu{2f} which {actually_decodes} {cross_platform}”) Okay let’s get into it~ —Yap— Streamer Queue went from “backend endpoints exist” to “actual UI with history and add-to-queue” over the course of ten commits, shared play picked up presence and reactions along the way, and then right at the end I found out the MP3 decoder has been quietly depending on a Windows-only codec this whole time. Great. cross-platform, they said. it’ll be fine, they said —The Great Suffering— 1 — Streamer Queue Backend, Then Actually Wiring It Up 402e2ef–2b74f97 built out the Streamer Queue backend endpoints — host add, mark played, mark skipped — and wired them into the client through a new StreamerQueueViewModel. Backend existing and backend actually being called by anything are two different milestones, and this covered both. 2 — The UI Caught Up 16c4b26 added the add-to-queue button and a history panel, so Streamer Queue stopped being an API you’d have to hit manually and became something that’s actually usable in the app. 3 — Shared Play Learned About Presence and Reactions ecb43e6 and c7a19c2 — shared play now fetches and exposes presence and reaction snapshots straight from the CDN. 7e60e15 then had SharedPlaySessionController pass presence, reactions, and queue through properly instead of any of those three living off on their own. 4 — HostAsync Was Ignoring The Host 92f2079. Found and fixed HostAsync quietly ignoring the host’s actual settings — not great for a feature called “host a shared play session.” the host had opinions the whole time, we just weren’t asking 5 — Preloading and the Full Shared UI 22bc56e preloads the next track into the shared room too, so listeners aren’t waiting on it live. f2df836 (HEAD) rounds it out with listener count, a reactions ticker, and a request list in the shared play UI — the room finally looks like it has people in it. Net diff for this stretch: SectionViewModels.cs (+206), backend/src/main.rs (+103), plus the SharedPlay CDN client/models and StreamerQueueView.axaml. 6 — The Uncommitted One: MP3 Playback Was Windows-Only This Whole Time AudioEngine.cs and VideoExportEngine.cs were both using Mp3FileReader, which under the hood calls Windows’ ACM codec (msacm32.dll) to decompress. Which does not exist on Linux or macOS. Swapping to Mp3FileReaderBase with an NLayer decompressor instead — NLayer.NAudioSupport added to Spectralis.Core.csproj — since NLayer is a pure managed decoder and doesn’t care what OS it’s on. Not committed yet, wanted to sit with it first. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out MP3 playback only worked on one OS. Q: Was Spectralis actually cross-platform before this fix? A: For anything that wasn’t MP3 audio, sure. For MP3 specifically, only on Windows, silently, this whole time. Q: Why leave the audio fix uncommitted? A: Swapping a decoder for something this central deserves a beat of “does this actually sound right” before it goes in, not just “does it build.” Q: What’s the difference between Streamer Queue and the regular request queue? A: Streamer Queue is host-controlled — add, mark played, mark skipped, from the streamer’s side, with its own history panel, separate from the public submission flow. Q: Did shared play or Streamer Queue touch the Discord bot? A: No, this round’s entirely Spectralis.App/Spectralis.Core and the Rust backend. Bot’s untouched. —This is the end*— *end for now, ACM codecs permitting PARROT!!!"}, {"post_id": 48057, "ts": "2026-08-16T10:39:23Z", "hours": 2.2006, "text": "Spectralis devlog #5 —Hello again proggers— This one’s website side, not app side. Less “watches chat and reacts,” more “stop lying to people who land on the page.” Changelogs, copy, and a pile of QoL that all needed doing at once, so they got done at once. Cat or dog? GET /changelog print(f”I try to make stu{2f} which {actually_updates} {2day}”) Okay let’s get into it~ —Yap— The website had drifted into “hardcoded strings and vibes” territory. Changelog was static, copy was doing the thing where every sentence has an exclamation point and says nothing, and a bunch of small friction points had just been sitting there unfixed because none of them were dramatic enough on their own to stop and deal with. death by a thousand papercuts, website edition —The Great Suffering— 1 — Changelogs Moved To The Backend Changelog used to live as static content baked into the site itself, which meant every release meant a redeploy just to update a text block. Now it’s served from the backend, so shipping a new version updates the changelog without touching the frontend at all. Site and release process finally agree with each other. 2 — Marketing Fluff: Removed Went through the copy and cut the stuff that existed to sound exciting instead of to say something. Fewer exclamation points, fewer vague superlatives, more actual sentences about what the thing does. Turns out “it’s fast” means more than “blazingly fast, lightning quick, revolutionary” stacked in one line. RIP to several adjectives, you will not be missed 3 — A Bunch Of Small QoL Fixes The kind of stuff that’s individually boring but collectively the difference between a site that feels maintained and one that doesn’t — broken anchor links, inconsistent spacing that had been “fine for now” for way too long, a couple of buttons that didn’t actually do what their label said, loading states that just weren’t there before. Nothing here gets its own numbered section because none of it deserves one, but all of it needed fixing. 4 — Site and Backend Actually Talk Now With changelogs pulled from the backend, the website stopped being a static artifact that occasionally gets redeployed and started being an actual client of the backend it’s supposed to represent. Small architectural shift, disproportionate amount of relief. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who wrote “blazingly fast” unironically at some point. Q: Why was the changelog static in the first place? A: Because it was easy at the time and “at the time” was a while ago. Q: Is the marketing copy gone entirely now? A: No, just the fluff. The site still has to say what Spectralis does, it just doesn’t need six adjectives to do it. Q: Does this affect the Discord bot or the app? A: No, this one’s website-only. App and bot are untouched this round. Q: What counts as a “small QoL fix” that didn’t get its own section? A: The stuff that’s annoying to list individually but adds up to “the site feels better now.” You’ll notice it without being told what it was. —This is the end*— *end for now, copywriting urges permitting CYA!!!"}, {"post_id": 47986, "ts": "2026-08-16T08:15:58Z", "hours": 11.9667, "text": "Spectralis devlog #4 —Hello again proggers— Uh. So. It’s been 11 hours. We sat down, opened the bot code, and just… didn’t stop. No devlog got posted because posting a devlog requires noticing that time is a thing that’s passing, and that stopped happening somewhere around hour 3. this is fine, this has always been fine Cat or dog? channelLock.ts print(f”I try to make stu{2f} which {actually_locked} {11hrs_later}”) Okay let’s get into it, before I forget more of it~ —Yap— No app changes this round. Zero. Not one line touched in Spectralis.App or Spectralis.Core. This whole stretch was 100% the Discord bot, going from “stubbed slash commands” to “bot that actually watches chat and does something about it.” —The Great Suffering— 1 — Railway Kept Rebuilding Rust For No Reason v5.3.2. Railway was rebuilding the entire backend on every single deploy regardless of whether the Rust actually changed. Pinned the build so it stops doing that. Small fix, saved a genuinely upsetting amount of deploy time. 2 — The Bot Learned to Watch Chat v5.3.3, and the actual reason for the 11 hours. The bot now watches the queue channel and reacts to song submissions as they come in, instead of just sitting there answering slash commands and pretending it doesn’t see anything else happening. 3 — New Files, New Problems messageSubmission.ts showed up to handle reacting to and tracking submitted songs in chat. channelLock.ts showed up next to it to handle locking logic for the watched channel, because a bot watching chat unsupervised is a bot that needs boundaries. 4 — Bot Token Can Now Actually See Things Bumped the bot token’s permissions so it can see and read submissions in the first place, which, in hindsight, was load-bearing for “watches chat and reacts to submissions.” Can’t react to what you can’t read. 5 — New Slash Commands, Existing Ones Got Bigger set-closed-message and set-open-message let streamers customize what shows up when the queue opens or closes instead of eating a hardcoded string. open-queue/close-queue got extended to actually talk to the new messaging and channel-lock logic instead of just flipping a flag and hoping. 6 — Everything Downstream Had to Catch Up db.ts, sqApi.ts, nowPlayingPoller.ts, types.ts, and index.ts all expanded to support the submission-tracking flow end to end. Backend picked up a small related change too, +11/-2 in main.rs, mostly plumbing to support what the bot needed on the other end. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who let this go 11 hours without a devlog. Q: How did 11 hours happen? A: One slash command needed one more file, which needed one more type, which needed the bot to actually be able to read messages, and then the sun came up. Q: Is the C# app okay? A: Untouched and fine. It got the week off. Q: Why does the bot need to watch chat instead of just answering commands? A: Song submissions happen by posting in the channel, not by running a command every time. The bot needed to actually see that to react to and track them. Q: What’s channelLock.ts for? A: Making sure the watched channel behaves predictably while the bot is actively tracking submissions in it, instead of reacting to chaos. Q: Are we caught up on devlogs now? A: This is #4. We are exactly as caught up as we’re going to get. —This is the end*— *end for now, sleep permitting PANCAKES!!!"}, {"post_id": 47399, "ts": "2026-08-15T09:49:05Z", "hours": 5.2097, "text": "Spectralis devlog #3 —Hello again proggers— Back at it. This round wasn’t visualizer polish or UI cleanup, it was Song Wars/SQ backend stuff and a Discord bot that didn’t exist yesterday. Less “make it pretty,” more “make it not lie to people.” Cat or dog? AcceptingSubmissions print(f”I try to make stu{2f} which {actually_closes} {2day}”) Okay let’s get into it~ —Yap— Turns out “turn off the fee toggle” and “actually prevent the fee-gated action” are two different things, and I had only been doing the first one. Also built an entire close-queue flow because apparently streamers want to stop taking requests sometimes, which, fair. And then there’s a Discord bot now. That happened too. scope creep? never heard of her —The Great Suffering— 1 — The Free Skip Loophole Turning off “Skip fee” or “Super Skip fee” removed the option from the public request page (sq.html/sq.js) just fine. What it did NOT do was stop the backend from accepting skip/super-skip attempts anyway — submit, upload, promote, all of it. Toggle says no, server says sure why not. Backend now actually rejects those attempts when the toggle’s off, closing the gap where a disabled tier was quietly still free. the frontend was lying and the backend believed it Still preserved: turning a toggle ON with a $0 amount is a real, intentional free tier. That distinction stays. 2 — Close Queue Didn’t Exist There was a “Queue enabled” toggle, but no way to just… stop taking requests without digging into settings. Added a real AcceptingSubmissions flag, separate from that, plus a one-click “Close Queue”/“Reopen Queue” button right next to “Copy Submit URL” in the header. No settings menu detour required. When closed, the public page still shows now-playing and queue count, just hides the request/skip/super-skip forms behind a “requests are closed” banner. Streamer can keep browsing and playing from the existing queue the whole time, since the app’s queue view was never gated on “enabled” to begin with. 3 — Now Playing Was Just Empty This Whole Time Found this one by accident while wiring Close Queue: the public page’s “Now Playing” section never actually populated for anyone who wasn’t the owner, because the backend just wasn’t sending track info to non-owner viewers. Fixed alongside everything else. 4 — A Discord Bot Shows Up New discord-bot/ folder, Node.js + TypeScript, discord.js, with a full PLANNING.md for the design: PIN-based pairing so the streamer generates a short-lived PIN in-app and runs /link-queue in Discord with no secrets ever touching chat, a scoped bot-token concept kept separate from the full owner token, and a (guildId, channelId) → room mapping so one bot instance can serve many servers. /queue, /request, /skip, /superskip are fully wired against the existing public SQ API and build clean. /link-queue, /close-queue, /open-queue are stubbed with TODOs since they need backend PIN/token endpoints that don’t exist yet, which is now the next backend work item. Everything typechecks and builds clean across the board — Rust release build, Spectralis.App, and the bot’s tsc. —FAQ (no one asked these but they are here)— Q: Why does Spectralis need a Discord bot? A: Because apparently the request queue living only on a web page wasn’t enough surface area. Now it can also live in your server. Q: What’s PIN-based pairing? A: Streamer gets a short-lived PIN in-app, runs one Discord command with it, done. No tokens or secrets ever posted in chat. Q: Anything left over from last devlog? A: Chat template drift is still an EDITH problem, not a Spectralis one. Wrong repo, wrong devlog. —This is the end*— *end for now, PIN endpoints permitting PIZZA!!!"}, {"post_id": 46741, "ts": "2026-08-14T06:44:16Z", "hours": 6.1242, "text": "Spectralis devlog #2 —Hello again proggers— New project, same yapping. This one’s Spectralis — the WinForms-to-Avalonia refugee that somehow ended up with a spin wheel, notepads, dead zones, and Spotify playlist sync bolted onto it. 917 commits deep and counting. Cat or dog? RowBackground print(f”I try to make stu{2f} which {actually_renders} {2day}”) Okay let’s get into it~ —Yap— This stretch was less “one big feature” and more “death by a thousand small horrors,” which honestly might just be what maintaining a music app is. Playlists, now playing, the visualizer pipeline, and a wheel of all things all got touched. a spin wheel. in a music app. sure —The Great Suffering— 1 — Playlists Looked Like a Log File For way too long, the playlist view rendered like plain rows in a terminal instead of, y’know, an app. Turns out library explicitly set RowBackground and playlists just… didn’t. So it fell back to the theme’s default accent-tinted fill on every single row instead of the real styling. One missing property. That’s it. That’s the bug. found staring at my own code for an hour 2 — Every Nav Click Rebuilt The World ContentControl was tearing down and rebuilding the entire section view from scratch on every single navigation click. Fixed by caching views per viewmodel instead of nuking them each time. App feels like it’s not fighting itself anymore. 3 — Library Load Was Blocking the Window From Even Opening Big libraries meant the window just… wouldn’t show up. Load was sitting on the UI thread like it owned the place. Moved off it. Window opens now regardless of how unhinged your library size is. 4 — Spectrum Bars Were Snapping FFT window was running back-to-back instead of overlapping, so spectrum/spectrogram/loudness only actually updated every ~185ms even at 60fps render — bars were snapping to new values instead of moving. Bumped overlap to 75% and eased toward target instead of drawing raw values. Smooth now. Suspiciously smooth. 5 — Notepads and the Wheel Happened Somewhere in here a full notepad feature got built — embed model, tag service, docked panel in now playing, pop-out window, save-to-track-tags — and then immediately got wired into a spin wheel with weighted entries, its own model, and a saved-wheels list. Neither of these were planned at the start of the week. Both exist now. 6 — Spotify Actually Behaves Spotify stopped pausing forever, stopped lying about the queue, stopped refusing to shut up, and playlists now actually sync instead of just vibing. Also Discord presence shows Spotify tracks now instead of just going blank like it forgot what music was. 7 — Small Bugs, Deployed With Extreme Prejudice Soundcloud playhead was showing the previous track’s end position on load, fixed. Word mode wasn’t saving timestamps so exports came out empty, fixed. Track-switch click (and the pop when another app grabs the audio device) got a quick fade instead. Dead zones stopped being OBS-only and now shift the app’s own layout too. —FAQ (no one asked these but they are here)— Q: What is Spectralis? A: A local + Spotify + SoundCloud music player with a visualizer pipeline, OBS integration, and apparently a spin wheel now. Originally WinForms, migrated to Avalonia across 917 commits. Q: Why does a music player need dead zones? A: For OBS overlay layouts — panels and toasts need to know where not to render so they don’t cover your stream elements. It’s a layout constraint system wearing a spooky name. Q: Was the RowBackground bug really just one missing line? A: Yes. I’m still thinking about it. Q: Is the wheel feature load-bearing or a bit? A: Unclear. It has weighted spins, saved wheel lists, and its own viewmodel. Feels load-bearing now. Q: What’s next? A: Whatever the changelog for the version after 5.4.0 ends up needing. Probably something I haven’t broken yet. —This is the end*— *end for now, RowBackground permitting ADIOS!!!😎😎😎😎"}, {"post_id": 27486, "ts": "2026-07-13T02:54:53Z", "hours": 16.6944, "text": "DEVLOG 001 initial setup with hackclub this is the 5th iteration of the spectralis audio visualizer app core features changed: switched from WinForms to AvaloniaUI refined UI design and theming fixed api related issues added streamer support and automated queueing web share audio hosting refinements to the embedded audio visualizer system bug fixes: fixed an issue with the youtube API placeholder fix for Spotify webplayer playback fixed an issue with the viz switcher would “hide” behind the html visualizers"}]...
|
Title: Spectralis by @DeltaVortex | Stardance
Dev Title: Spectralis by @DeltaVortex | Stardance
Devlogs:
DEVLOG 001 initial setup with hackclub this is the 5th iteration of the spectralis audio visualizer app core features changed: switched from WinForms to AvaloniaUI refined UI design and theming fixed api related issues added streamer support and automated queueing web share audio hosting refinements to the embedded audio visualizer system bug fixes: fixed an issue with the youtube API placeholder fix for Spotify webplayer playback fixed an issue with the viz switcher would “hide” behind the html visualizers
Spectralis devlog #2 —Hello again proggers— New project, same yapping. This one’s Spectralis — the WinForms-to-Avalonia refugee that somehow ended up with a spin wheel, notepads, dead zones, and Spotify playlist sync bolted onto it. 917 commits deep and counting. Cat or dog? RowBackground print(f”I try to make stu{2f} which {actually_renders} {2day}”) Okay let’s get into it~ —Yap— This stretch was less “one big feature” and more “death by a thousand small horrors,” which honestly might just be what maintaining a music app is. Playlists, now playing, the visualizer pipeline, and a wheel of all things all got touched. a spin wheel. in a music app. sure —The Great Suffering— 1 — Playlists Looked Like a Log File For way too long, the playlist view rendered like plain rows in a terminal instead of, y’know, an app. Turns out library explicitly set RowBackground and playlists just… didn’t. So it fell back to the theme’s default accent-tinted fill on every single row instead of the real styling. One missing property. That’s it. That’s the bug. found staring at my own code for an hour 2 — Every Nav Click Rebuilt The World ContentControl was tearing down and rebuilding the entire section view from scratch on every single navigation click. Fixed by caching views per viewmodel instead of nuking them each time. App feels like it’s not fighting itself anymore. 3 — Library Load Was Blocking the Window From Even Opening Big libraries meant the window just… wouldn’t show up. Load was sitting on the UI thread like it owned the place. Moved off it. Window opens now regardless of how unhinged your library size is. 4 — Spectrum Bars Were Snapping FFT window was running back-to-back instead of overlapping, so spectrum/spectrogram/loudness only actually updated every ~185ms even at 60fps render — bars were snapping to new values instead of moving. Bumped overlap to 75% and eased toward target instead of drawing raw values. Smooth now. Suspiciously smooth. 5 — Notepads and the Wheel Happened Somewhere in here a full notepad feature got built — embed model, tag service, docked panel in now playing, pop-out window, save-to-track-tags — and then immediately got wired into a spin wheel with weighted entries, its own model, and a saved-wheels list. Neither of these were planned at the start of the week. Both exist now. 6 — Spotify Actually Behaves Spotify stopped pausing forever, stopped lying about the queue, stopped refusing to shut up, and playlists now actually sync instead of just vibing. Also Discord presence shows Spotify tracks now instead of just going blank like it forgot what music was. 7 — Small Bugs, Deployed With Extreme Prejudice Soundcloud playhead was showing the previous track’s end position on load, fixed. Word mode wasn’t saving timestamps so exports came out empty, fixed. Track-switch click (and the pop when another app grabs the audio device) got a quick fade instead. Dead zones stopped being OBS-only and now shift the app’s own layout too. —FAQ (no one asked these but they are here)— Q: What is Spectralis? A: A local + Spotify + SoundCloud music player with a visualizer pipeline, OBS integration, and apparently a spin wheel now. Originally WinForms, migrated to Avalonia across 917 commits. Q: Why does a music player need dead zones? A: For OBS overlay layouts — panels and toasts need to know where not to render so they don’t cover your stream elements. It’s a layout constraint system wearing a spooky name. Q: Was the RowBackground bug really just one missing line? A: Yes. I’m still thinking about it. Q: Is the wheel feature load-bearing or a bit? A: Unclear. It has weighted spins, saved wheel lists, and its own viewmodel. Feels load-bearing now. Q: What’s next? A: Whatever the changelog for the version after 5.4.0 ends up needing. Probably something I haven’t broken yet. —This is the end*— *end for now, RowBackground permitting ADIOS!!!😎😎😎😎
Spectralis devlog #3 —Hello again proggers— Back at it. This round wasn’t visualizer polish or UI cleanup, it was Song Wars/SQ backend stuff and a Discord bot that didn’t exist yesterday. Less “make it pretty,” more “make it not lie to people.” Cat or dog? AcceptingSubmissions print(f”I try to make stu{2f} which {actually_closes} {2day}”) Okay let’s get into it~ —Yap— Turns out “turn off the fee toggle” and “actually prevent the fee-gated action” are two different things, and I had only been doing the first one. Also built an entire close-queue flow because apparently streamers want to stop taking requests sometimes, which, fair. And then there’s a Discord bot now. That happened too. scope creep? never heard of her —The Great Suffering— 1 — The Free Skip Loophole Turning off “Skip fee” or “Super Skip fee” removed the option from the public request page (sq.html/sq.js) just fine. What it did NOT do was stop the backend from accepting skip/super-skip attempts anyway — submit, upload, promote, all of it. Toggle says no, server says sure why not. Backend now actually rejects those attempts when the toggle’s off, closing the gap where a disabled tier was quietly still free. the frontend was lying and the backend believed it Still preserved: turning a toggle ON with a $0 amount is a real, intentional free tier. That distinction stays. 2 — Close Queue Didn’t Exist There was a “Queue enabled” toggle, but no way to just… stop taking requests without digging into settings. Added a real AcceptingSubmissions flag, separate from that, plus a one-click “Close Queue”/“Reopen Queue” button right next to “Copy Submit URL” in the header. No settings menu detour required. When closed, the public page still shows now-playing and queue count, just hides the request/skip/super-skip forms behind a “requests are closed” banner. Streamer can keep browsing and playing from the existing queue the whole time, since the app’s queue view was never gated on “enabled” to begin with. 3 — Now Playing Was Just Empty This Whole Time Found this one by accident while wiring Close Queue: the public page’s “Now Playing” section never actually populated for anyone who wasn’t the owner, because the backend just wasn’t sending track info to non-owner viewers. Fixed alongside everything else. 4 — A Discord Bot Shows Up New discord-bot/ folder, Node.js + TypeScript, discord.js, with a full PLANNING.md for the design: PIN-based pairing so the streamer generates a short-lived PIN in-app and runs /link-queue in Discord with no secrets ever touching chat, a scoped bot-token concept kept separate from the full owner token, and a (guildId, channelId) → room mapping so one bot instance can serve many servers. /queue, /request, /skip, /superskip are fully wired against the existing public SQ API and build clean. /link-queue, /close-queue, /open-queue are stubbed with TODOs since they need backend PIN/token endpoints that don’t exist yet, which is now the next backend work item. Everything typechecks and builds clean across the board — Rust release build, Spectralis.App, and the bot’s tsc. —FAQ (no one asked these but they are here)— Q: Why does Spectralis need a Discord bot? A: Because apparently the request queue living only on a web page wasn’t enough surface area. Now it can also live in your server. Q: What’s PIN-based pairing? A: Streamer gets a short-lived PIN in-app, runs one Discord command with it, done. No tokens or secrets ever posted in chat. Q: Anything left over from last devlog? A: Chat template drift is still an EDITH problem, not a Spectralis one. Wrong repo, wrong devlog. —This is the end*— *end for now, PIN endpoints permitting PIZZA!!!
Spectralis devlog #4 —Hello again proggers— Uh. So. It’s been 11 hours. We sat down, opened the bot code, and just… didn’t stop. No devlog got posted because posting a devlog requires noticing that time is a thing that’s passing, and that stopped happening somewhere around hour 3. this is fine, this has always been fine Cat or dog? channelLock.ts print(f”I try to make stu{2f} which {actually_locked} {11hrs_later}”) Okay let’s get into it, before I forget more of it~ —Yap— No app changes this round. Zero. Not one line touched in Spectralis.App or Spectralis.Core. This whole stretch was 100% the Discord bot, going from “stubbed slash commands” to “bot that actually watches chat and does something about it.” —The Great Suffering— 1 — Railway Kept Rebuilding Rust For No Reason v5.3.2. Railway was rebuilding the entire backend on every single deploy regardless of whether the Rust actually changed. Pinned the build so it stops doing that. Small fix, saved a genuinely upsetting amount of deploy time. 2 — The Bot Learned to Watch Chat v5.3.3, and the actual reason for the 11 hours. The bot now watches the queue channel and reacts to song submissions as they come in, instead of just sitting there answering slash commands and pretending it doesn’t see anything else happening. 3 — New Files, New Problems messageSubmission.ts showed up to handle reacting to and tracking submitted songs in chat. channelLock.ts showed up next to it to handle locking logic for the watched channel, because a bot watching chat unsupervised is a bot that needs boundaries. 4 — Bot Token Can Now Actually See Things Bumped the bot token’s permissions so it can see and read submissions in the first place, which, in hindsight, was load-bearing for “watches chat and reacts to submissions.” Can’t react to what you can’t read. 5 — New Slash Commands, Existing Ones Got Bigger set-closed-message and set-open-message let streamers customize what shows up when the queue opens or closes instead of eating a hardcoded string. open-queue/close-queue got extended to actually talk to the new messaging and channel-lock logic instead of just flipping a flag and hoping. 6 — Everything Downstream Had to Catch Up db.ts, sqApi.ts, nowPlayingPoller.ts, types.ts, and index.ts all expanded to support the submission-tracking flow end to end. Backend picked up a small related change too, +11/-2 in main.rs, mostly plumbing to support what the bot needed on the other end. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who let this go 11 hours without a devlog. Q: How did 11 hours happen? A: One slash command needed one more file, which needed one more type, which needed the bot to actually be able to read messages, and then the sun came up. Q: Is the C# app okay? A: Untouched and fine. It got the week off. Q: Why does the bot need to watch chat instead of just answering commands? A: Song submissions happen by posting in the channel, not by running a command every time. The bot needed to actually see that to react to and track them. Q: What’s channelLock.ts for? A: Making sure the watched channel behaves predictably while the bot is actively tracking submissions in it, instead of reacting to chaos. Q: Are we caught up on devlogs now? A: This is #4. We are exactly as caught up as we’re going to get. —This is the end*— *end for now, sleep permitting PANCAKES!!!
Spectralis devlog #5 —Hello again proggers— This one’s website side, not app side. Less “watches chat and reacts,” more “stop lying to people who land on the page.” Changelogs, copy, and a pile of QoL that all needed doing at once, so they got done at once. Cat or dog? GET /changelog print(f”I try to make stu{2f} which {actually_updates} {2day}”) Okay let’s get into it~ —Yap— The website had drifted into “hardcoded strings and vibes” territory. Changelog was static, copy was doing the thing where every sentence has an exclamation point and says nothing, and a bunch of small friction points had just been sitting there unfixed because none of them were dramatic enough on their own to stop and deal with. death by a thousand papercuts, website edition —The Great Suffering— 1 — Changelogs Moved To The Backend Changelog used to live as static content baked into the site itself, which meant every release meant a redeploy just to update a text block. Now it’s served from the backend, so shipping a new version updates the changelog without touching the frontend at all. Site and release process finally agree with each other. 2 — Marketing Fluff: Removed Went through the copy and cut the stuff that existed to sound exciting instead of to say something. Fewer exclamation points, fewer vague superlatives, more actual sentences about what the thing does. Turns out “it’s fast” means more than “blazingly fast, lightning quick, revolutionary” stacked in one line. RIP to several adjectives, you will not be missed 3 — A Bunch Of Small QoL Fixes The kind of stuff that’s individually boring but collectively the difference between a site that feels maintained and one that doesn’t — broken anchor links, inconsistent spacing that had been “fine for now” for way too long, a couple of buttons that didn’t actually do what their label said, loading states that just weren’t there before. Nothing here gets its own numbered section because none of it deserves one, but all of it needed fixing. 4 — Site and Backend Actually Talk Now With changelogs pulled from the backend, the website stopped being a static artifact that occasionally gets redeployed and started being an actual client of the backend it’s supposed to represent. Small architectural shift, disproportionate amount of relief. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who wrote “blazingly fast” unironically at some point. Q: Why was the changelog static in the first place? A: Because it was easy at the time and “at the time” was a while ago. Q: Is the marketing copy gone entirely now? A: No, just the fluff. The site still has to say what Spectralis does, it just doesn’t need six adjectives to do it. Q: Does this affect the Discord bot or the app? A: No, this one’s website-only. App and bot are untouched this round. Q: What counts as a “small QoL fix” that didn’t get its own section? A: The stuff that’s annoying to list individually but adds up to “the site feels better now.” You’ll notice it without being told what it was. —This is the end*— *end for now, copywriting urges permitting CYA!!!
Spectralis devlog #6 —Hello again proggers— Website stuff wrapped up at the 310ee27 merge, then everything shifted straight into Streamer Queue and shared play. Ten commits deep on dev, plus one fix that’s sitting uncommitted in the working tree because it’s the kind of thing you want to stare at twice before you trust it. Cat or dog? Mp3FileReaderBase print(f”I try to make stu{2f} which {actually_decodes} {cross_platform}”) Okay let’s get into it~ —Yap— Streamer Queue went from “backend endpoints exist” to “actual UI with history and add-to-queue” over the course of ten commits, shared play picked up presence and reactions along the way, and then right at the end I found out the MP3 decoder has been quietly depending on a Windows-only codec this whole time. Great. cross-platform, they said. it’ll be fine, they said —The Great Suffering— 1 — Streamer Queue Backend, Then Actually Wiring It Up 402e2ef–2b74f97 built out the Streamer Queue backend endpoints — host add, mark played, mark skipped — and wired them into the client through a new StreamerQueueViewModel. Backend existing and backend actually being called by anything are two different milestones, and this covered both. 2 — The UI Caught Up 16c4b26 added the add-to-queue button and a history panel, so Streamer Queue stopped being an API you’d have to hit manually and became something that’s actually usable in the app. 3 — Shared Play Learned About Presence and Reactions ecb43e6 and c7a19c2 — shared play now fetches and exposes presence and reaction snapshots straight from the CDN. 7e60e15 then had SharedPlaySessionController pass presence, reactions, and queue through properly instead of any of those three living off on their own. 4 — HostAsync Was Ignoring The Host 92f2079. Found and fixed HostAsync quietly ignoring the host’s actual settings — not great for a feature called “host a shared play session.” the host had opinions the whole time, we just weren’t asking 5 — Preloading and the Full Shared UI 22bc56e preloads the next track into the shared room too, so listeners aren’t waiting on it live. f2df836 (HEAD) rounds it out with listener count, a reactions ticker, and a request list in the shared play UI — the room finally looks like it has people in it. Net diff for this stretch: SectionViewModels.cs (+206), backend/src/main.rs (+103), plus the SharedPlay CDN client/models and StreamerQueueView.axaml. 6 — The Uncommitted One: MP3 Playback Was Windows-Only This Whole Time AudioEngine.cs and VideoExportEngine.cs were both using Mp3FileReader, which under the hood calls Windows’ ACM codec (msacm32.dll) to decompress. Which does not exist on Linux or macOS. Swapping to Mp3FileReaderBase with an NLayer decompressor instead — NLayer.NAudioSupport added to Spectralis.Core.csproj — since NLayer is a pure managed decoder and doesn’t care what OS it’s on. Not committed yet, wanted to sit with it first. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out MP3 playback only worked on one OS. Q: Was Spectralis actually cross-platform before this fix? A: For anything that wasn’t MP3 audio, sure. For MP3 specifically, only on Windows, silently, this whole time. Q: Why leave the audio fix uncommitted? A: Swapping a decoder for something this central deserves a beat of “does this actually sound right” before it goes in, not just “does it build.” Q: What’s the difference between Streamer Queue and the regular request queue? A: Streamer Queue is host-controlled — add, mark played, mark skipped, from the streamer’s side, with its own history panel, separate from the public submission flow. Q: Did shared play or Streamer Queue touch the Discord bot? A: No, this round’s entirely Spectralis.App/Spectralis.Core and the Rust backend. Bot’s untouched. —This is the end*— *end for now, ACM codecs permitting PARROT!!!
Spectralis devlog #7 — welcome 5.4.0 —Hello again proggers— 5.4.0’s out. This one brought back a feature I’d basically buried, hardened two systems that were still a little too trust-me-bro, and finally let shared play open where it should’ve been opening the whole time. Also touched the docs, which I’m choosing to be proud of. Cat or dog? .spectralis print(f”I try to make stu{2f} which {actually_ships} {5.4.0}”) Okay let’s get into it~ —Yap— Big one this round is stories coming back into .spectralis capsules, except not as the thing they used to be — modernized, closer to how album worlds work now, as a proper custom HTML page with real hooks instead of whatever they were before. Rest of the release was hardening and cleanup: Streamer Queue and Discord got a pass to make sure live use doesn’t fall over, shared play finally opens in-app, and the docs stopped lying about what the app actually does. bringing back a feature I killed is a personality trait at this point —The Great Suffering— 1 — Stories Are Back, But Not The Same Stories Old stories concept is back inside .spectralis capsules, rebuilt to match how album worlds work now instead of resurrecting the original implementation as-is. Each one’s a custom HTML page with real hooks into the player — starting tracks, track control, the works — instead of being a static bolt-on. Bringing it back meant actually integrating it with the current architecture, not just copy-pasting the old version back in. 2 — Streamer Queue + Discord Got Hardened Both of these existed and mostly worked, which is different from “survives actually being used live by a streamer with chat moving.” Went through and hardened the interaction between Streamer Queue and the Discord bot — the stuff that only shows up under real load or real edge cases instead of a clean local test run. “mostly works” is doing a lot of lifting in software 3 — Shared Play Opens In App Now Shared play used to need you to go find it. Now there’s an actual open-in-app implementation, so joining a shared room is a real in-app flow instead of a workaround. Small change on paper, but it’s the difference between a feature people use and a feature people forget exists. 4 — Docs, README, and STANDARDS Actually Match Reality Updated the docs, README, and STANDARDS to reflect what’s actually in the app at this point instead of an earlier version of it. Boring work, necessary work, the kind of thing that only gets noticed when it’s wrong. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who buried a feature and then dug it back up two versions later. Q: Why bring stories back instead of leaving them dead? A: Because the concept was good, the old implementation just wasn’t, and album worlds proved the modernized version of the idea actually works. Q: What counts as “hardening” for Streamer Queue and Discord? A: The stuff that only breaks under real conditions — live chat, real timing, real edge cases — not the happy path you get testing solo. Q: Does shared play opening in-app change how sessions work? A: No, same sessions, same presence/reactions/queue from devlog #6. Just a real entry point now instead of a workaround. Q: Anything left over for next time? A: Always. This is a devlog series, not a finish line. —This is the end*— *end for now, capsule hooks permitting 再见!!!
Spectralis devlog #8 —Hello again proggers— 10 hours 48 minutes. Again. Didn’t plan it, didn’t notice it happening, just looked up and the sun had done a full cycle. This time it was capsules and worlds actually getting built and tested for real instead of just existing in theory. we’ve been here before and we will be here again Cat or dog? Capsule.story + Capsule.visualizer print(f”I try to make stu{2f} which {actually_coexist} {10h48m_later}”) Okay let’s get into it~ —Yap— Stories came back in devlog #7 as a concept. This round was making and testing the first actual .spectralis capsules and worlds built on that concept, which is a different job entirely — turns out “the architecture supports it” and “a real capsule with a real story actually works” are two very different milestones. Also fixed a bug that only shows up once you’re actually testing real capsules instead of imagining them, and a GitHub pull issue that had nothing to do with any of this and ate time anyway. —The Great Suffering— 1 — Building And Testing The First Real Capsules And Worlds Most of the 10 hours 48 minutes, honestly. Going from “stories and worlds work in concept” to actually authoring capsules, loading them, and confirming the hooks — track start, track control, the custom HTML page — behave the way they’re supposed to under real content instead of a test stub. This is the part where theory meets “wait, why is this blank.” 2 — A Story And A Visualizer Couldn’t Both Exist In One Capsule Found this one while testing, not before. A capsule with both a story and a visualizer defined would break, since apparently the two weren’t built to coexist in the same capsule at all. Fixed so a single capsule can hold both without one stepping on the other. the two features that were supposed to be siblings turned out to be enemies 3 — GitHub Was Being Weird About Pulling Somewhere in the middle of all this, git decided pulling wasn’t going to just work. Fixed the pulling issue, which is the kind of fix that has no interesting story attached, it was just broken and then it wasn’t. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who said “quick test” and looked up 10 hours 48 minutes later. Q: Was the story/visualizer bug there since devlog #7? A: Presumably, yes. Nobody had actually tried putting both in one capsule until this round. Q: What does “testing capsules and worlds” actually involve? A: Authoring real ones, loading them in the app, and checking the hooks — track start, track control, custom HTML rendering — behave correctly with actual content, not placeholder data. Q: What was the GitHub pulling issue? A: Not going into detail, it wasn’t interesting, it was just broken. Fixed now. Q: Is this the last capsule/worlds devlog? A: No idea. Ask devlog #9. —This is the end*— *end for now, git remotes permitting PEPPERONI!!!
Spectralis devlog #9 — 5.4.0 is public —Hello again proggers— 5.4.0 is actually out, publicly, in people’s hands. Diffed v5.3.4 through v5.4.0: 40 commits, Aug 16-18, four threads of work. Cat or dog? spectral.resume() —Yap— Shared play became joinable, Streamer Queue and the Discord bot got hardened, story/visualizer bugs got chased down in one sitting, and some platform/perf issues got caught. None of these were small. —The Great Suffering— 1 — Shared Play Can Be Joined Now spectralis://shared-play/join links used to fall through to nothing. Now routed to a real handler. 2 — Streamer Queue: Host Controls + A Bot That Won’t Die Host can add tracks and mark played/skipped directly, no viewer round-trip. Desktop got an add-to-queue button and history panel. Both pollers (desktop + bot) back off dead rooms instead of hammering them. SQ API calls got a 10s timeout + one retry, GETs only — mutating calls don’t retry, to avoid double-submitting on a timed-out-but-successful response. Bot had zero global error handlers before this. One bad promise took the whole process down silently. Now it logs and survives, plus 3-attempt startup retry. 3 — Story Pages vs. Visualizers: Three Bugs, One Afternoon A capsule with both used to have them fight. Story can now queue a surface behind it — TryAdvancePastStory() swaps in the queued surface on spectral.resume(). Audio was starting under the story before the reader finished — now gated on whether a surface is queued. Once queued, picker/prev-next/keyboard could still hijack it — new IsVisualizerLocked blocks all three (user-picked “Special:” visualizers stay switchable). 4 — Platform + Perf Fixes MP3 decoding silently depended on Windows’ ACM codec via Mp3FileReader. Swapped to NLayer, pure managed decoder — MP3s decode on Linux/macOS now too. WebView2Host inline-rendered small visualizers via NavigateToString, which serves from about:blank with no real origin and tanks frame rate — everything goes through the fast file-backed path now. Auto-cycle switching checked IsLoaded/IsPlaying, both false during Spotify playback since Spotify never loads into the local engine — switched to HasTrack/IsPlaying. And: a regex stripping onclick=”…” had no exception, matched JS identifiers like onSomething =, and being quote-unguarded ate everything to the next stray quote anywhere later in the file. Fixed with a -block carve-out. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s been waiting on shared play join links forever. Q: Was shared play really host-only until now? A: Yes. The link existed, it just went nowhere. Q: How bad was the regex bug? A: Silent corruption of unrelated code anywhere later in the file, no error thrown. Very glad it’s found. Q: Is 5.4.0 stable? A: As far as testing shows. That’s what everyone says right before the hotfix. —This is the end*— *end for now, public users permitting PEBBLE!!!
Spectralis devlog #10 —Hello again proggers— 11 hours, zero sleep, and somewhere in the middle of that a full release went out. v5.4.1, then v5.4.1.2 right behind it because apparently one patch release wasn’t enough punishment for one night. sleep is a scheduling conflict I lost Cat or dog? winmm.dll Okay let’s get into it~ —Yap— Started as a normal patch pass and turned into a full Linux compatibility audit at 3am, because it turns out shipping something cross-platform means actually checking what “cross-platform” was quietly lying about. Found four separate ways the app was secretly Windows-only, fixed all of them, shipped twice. —The Great Suffering— 1 — winmm.dll Doesn’t Exist On Linux, Who Knew Something was calling into winmm.dll directly. Which is a Windows multimedia API. Which does not exist on Linux. Genuinely did not know this was happening until it broke loudly. “who knew” is doing a lot of work in that commit message 2 — Shipped A .exe To Linux, My Bad Somewhere in the build/packaging step, a .exe was ending up in the Linux build. An executable format Linux does not run. Not a subtle bug, just an embarrassing one. 3 — Song Wars Closing = Surprise Alt+F4 Closing Song Wars was apparently also closing the entire app, unprompted, no warning. A feature window doubling as a kill switch is not a feature, it’s a trap. 4 — Yeeted yt-dlp + ffmpeg Into Linux Land, Zero Installs Needed The actual fix underneath most of this: bundled yt-dlp and ffmpeg directly for Linux instead of assuming they’d already be installed system-wide, which they very often weren’t. Zero external installs needed now, it just works out of the box. 5 — Last Page Isn’t A Dead End Anymore Merged in from feature/story-pager-finish — reaching the last page of a story used to just… stop. Dead end, nothing to do. Fixed so it actually resolves properly instead of leaving you stranded on the final page. 6 — Two Releases In One Night v5.4.1 went out, then a second pass turned up enough left over that v5.4.1.2 followed right after. Both merged through staging same night, same sleepless stretch. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who found out about winmm.dll at 3am. Q: Was Spectralis actually broken on Linux before this? A: In at least four distinct ways, yes. Missing binaries, a stray .exe, a Windows-only DLL call, and an app-closing bug. Now fixed. Q: Why two patch releases instead of one? A: v5.4.1 went out, more got found immediately after, and waiting felt worse than just shipping v5.4.1.2 same night. Q: Did you actually not sleep? A: Correct. Not recommending it. Doing it anyway next time, probably. Q: Is Linux actually solid now? A: As solid as one very long, very tired night of testing can confirm. Time will tell the rest. —This is the end*— *end for now, sleep schedules permitting PIBBLE!!!
Spectralis devlog #11 —Hello again proggers— Docs got a full rework this round. Also turns out v5.4.1 went out to nobody, because it never actually got pushed to the CDN. Tagged, released, announced probably, and completely inaccessible the whole time. shipped a release into a void and called it done Cat or dog? docs/ Okay let’s get into it~ —Yap— Started as a documentation pass and ended with the realization that the last release had been sitting local this whole time instead of where anyone could actually get it. Two very different kinds of work, same devlog. —The Great Suffering— 1 — The Entire Doc Rework Not a touch-up, a full rework. Docs, README, and STANDARDS all got restructured rather than patched in place, since patching them individually over the last several devlogs had left them internally inconsistent with each other and with what the app actually does now. 2 — 5.4.1 Never Made It To The CDN The actual headline bug of this devlog. v5.4.1 shipped, in the sense that it was built, tagged, and probably announced somewhere — but never got pushed to the CDN, meaning nobody could actually download it. Public-facing, and it was quietly broken the whole time until someone noticed. a release that ships to nowhere didn’t really ship 3 — Fixed And Actually Pushed Corrected the CDN push so 5.4.1 is genuinely available now, not just tagged in git looking like it is. Also part of why the doc rework mattered — docs referencing a version nobody could download was its own kind of lie. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who tagged a release and forgot the part where people can actually get it. Q: How long was 5.4.1 unavailable? A: Long enough to be embarrassing, short enough to fix before it became a real problem. Caught during this pass. Q: Why redo the docs entirely instead of patching them again? A: Because incremental doc patches across several devlogs had drifted apart from each other and from the app. A full rework got everything back in sync at once. Q: Is this the same CDN that serves changelogs now (devlog #5)? A: Same one. This time the release binary itself was the thing missing, not just content. Q: Anything else quietly broken that hasn’t surfaced yet? A: Unknown by definition. That’s what the next devlog is for. —This is the end*— *end for now, CDN pushes permitting POPPY!!!
Spectralis devlog #12 —Hello again proggers— Website’s getting a real pass. Not new copy this time, actual visual identity work, because it currently reads like every AI startup landing page that ever came out of the middle of California, and Spectralis is not that. gradient blob, bold sans headline, “revolutionize your workflow” — no Cat or dog? theme.css Okay let’s get into it~ —Yap— Not released yet, deliberately. This one’s still in progress, but close enough that it’s worth logging before it’s done instead of only after. The goal’s simple to say and annoying to actually do: stop looking generic. —The Great Suffering— 1 — The AI-Startup Look Had To Go Somewhere along the way the site had drifted into the exact aesthetic every seed-stage AI company in the Bay Area ships with — same fonts, same soft gradients, same layout rhythm everyone’s using because everyone else is using it. None of that says anything about what Spectralis actually is. 2 — Actual Visual Identity Work Working through what the site should look like instead of what’s easy to reach for by default. This is the slow part — not writing more copy, actually deciding what the thing looks like and why, instead of inheriting a template’s opinions by accident. 3 — Not Done, Getting Close Deliberately not shipping this mid-rework. Better to land it as one coherent pass than dribble out half-finished visual changes and confuse anyone who lands on the page in between. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one trying to make a music app’s website stop looking like a fundraising deck. Q: What specifically screamed “AI startup”? A: The general vibe more than any one element — the kind of design every YC-adjacent landing page converges on when nobody makes an active choice. Q: Why not ship incrementally instead of waiting? A: A visual identity rework half-applied looks worse than the thing it’s replacing. Waiting for it to be coherent. Q: How close is close? A: Close. Not “next devlog” close necessarily, but visibly closer than devlog #11 left it. Q: Does this touch the changelog-from-backend system from devlog #5? A: No, that infrastructure stays as-is. This is purely visual. —This is the end*— *end for now, gradient blobs permitting POGO!!!
Spectralis devlog #13 —Hello again proggers— Still on the website. Turns out the “make it not look like AI made it” problem does not have an easy exit — everything ends up looking like AI made it no matter what gets tried. Also had to ask Claude how to center a div. Yes, that div. The one every developer has fought since the dawn of CSS. the irony of asking an AI how to make something look less AI-made is not lost on me Cat or dog? display: flex Okay let’s get into it~ —Yap— Round two on the visual rework from last devlog, and the honest update is: it’s harder than expected. Every direction tried still lands somewhere in “generic modern web design,” which might just be what modern web design looks like right now regardless of who’s making it. —The Great Suffering— 1 — Everything Still Looks Like AI Made It Tried multiple directions this round trying to get away from the generic look. Kept landing back in the same neighborhood anyway. Starting to suspect this isn’t a “try harder” problem, it’s just what the current design language space looks like from basically every angle right now. 2 — Had To Ask Claude How To Center A Div The oldest joke in frontend development, still funny because it’s still true. Got stuck on it anyway. Some things never stop being annoying regardless of how many years of CSS have gone by. flexbox has existed for a decade and this is still where we are 3 — Pulled Up W3Schools For The First Time In Forever Dug up an old W3Schools reference mid-debugging, and it is dusty as hell at this point but the information’s still correct. Sometimes the ancient reference site is exactly what’s needed, aesthetics of the source be damned. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who asked an AI to help make something look less like an AI made it. Q: Did the AI-startup look actually get fixed this round? A: Not fully. Still fighting it. That’s most of this devlog. Q: Why does everything converge on the same generic look? A: Best guess: current tools and current design trends both nudge toward the same handful of patterns, so escaping it takes more than just trying different colors. Q: Is W3Schools still reliable? A: Apparently yes. Dated presentation, correct information. Q: When’s the website actually done? A: Closer than devlog #12, not there yet. Ask devlog #14. —This is the end*— *end for now, centered divs permitting PEPPLE!!!
Spectralis devlog #14 —Hello again proggers— Site’s done. Actually done. Got it to a place I actually liked instead of just a place I was tired of looking at, and shipped it. Three devlogs of fighting the generic-AI-look problem and it finally landed somewhere that feels like Spectralis instead of every other landing page on the internet. took long enough Cat or dog? git push origin main Okay let’s get into it~ —Yap— After devlog #12 and #13’s whole ordeal of everything converging on the same generic design no matter what got tried, something finally clicked and stuck. Shipped it. Two honest confessions on the way out the door, might as well log them here instead of pretending otherwise. —The Great Suffering— 1 — It’s Live The full rework from the last two devlogs is done and pushed. Went from “everything looks like AI made it” to something that actually feels intentional. Whatever finally broke the streak, it worked. 2 — The Help & Manuals Tab Is A Placebo Button Full transparency: the Help & Manuals tab on the site exists, looks real, sits right where you’d expect it, and does essentially nothing right now. It’s there because a site without one looks incomplete, not because there’s real content behind it yet. Consider it a placeholder wearing a real button’s clothes. it’s not lying, it’s aspirational 3 — I Copied FL Studio’s Homepage. Hard. Not going to pretend otherwise: leaned on FL Studio’s site pretty heavily for structure and layout ideas here. And honestly, that’s just how this works — programming, design, all of it is borrowing from people who borrowed from the people before them. Nobody’s inventing layout from first principles in 2026. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who finally shipped a website after three devlogs of fighting it. Q: Is Help & Manuals actually going to do anything eventually? A: Presumably, someday. Right now it’s a promise the button is making on behalf of a future devlog. Q: Isn’t copying FL Studio’s homepage kind of a big deal? A: Structure and layout inspiration, not a straight copy-paste. And realistically, every site borrows from something — this one’s just being honest about the source. Q: Did the “everything looks like AI” problem from devlog #13 actually get solved? A: Yes, finally. Whatever changed between then and now worked. Q: What’s next now that the site’s shipped? A: I finally get to ship my project without worrying about AI looking websites —This is the end*— *end for now, placebo buttons permitting PLACEBO!!!
Spectralis devlog #15 —Hello again proggers— I lied. Posted devlog #14 saying the site was done and shipped, and the deploy pipeline crashed basically the second it went out. So that’s fun. On the bright side, v5.4.2 also went out this round, and it’s actually solid. “it’s done” is apparently my curse word Cat or dog? dequeue() Okay let’s get into it~ —Yap— Website pipeline ate itself right after devlog #14 posted, which is its own kind of poetic. Meanwhile the app side had a genuinely good run — six real fixes landed, one of them embarrassing enough to name directly. —The Great Suffering— 1 — The Website Pipeline Crashed Right After I Said It Shipped Devlog #14 said done. Pipeline said otherwise, immediately. Working on getting it back up, this is very much a “developing situation” and not a “resolved” one yet. 2 — Listener Requests Auto-Queue Now Requests from listeners now auto-queue instead of needing a manual step to actually land in the queue. 3 — Audio Literally Never Played, Whoops Exactly what it says. Somewhere in there, audio just wasn’t playing. Found and fixed, extremely glad this one got caught. a music player where the music doesn’t play is a bold minimalist statement 4 — Found It: Join Links Were Missing A Slash Root cause of a chunk of shared-play join weirdness — the links were missing a slash. One character. Fixed, join links actually resolve correctly now. 5 — Host Room Button Actually Tells You Something Now The host room button used to just sit there. Now it actually communicates state back to you instead of leaving you guessing whether anything happened. 6 — Host Room Was Dropping Every Tick Forever Host room had a bug where it was dropping on every single tick, indefinitely, rather than staying stable. Fixed so the room actually holds instead of degrading in real time. 7 — yt-dlp Was 5 Months Stale, Updated The bundled yt-dlp from devlog #10 hadn’t been touched in 5 months. Updated. Stale extraction tooling breaking silently is exactly the kind of thing that sneaks up on you. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who called the website shipped and got immediately humbled by CI. Q: Is the website back up yet? A: Working on it. Genuinely not resolved as of this devlog. Q: How long was audio actually broken for? A: Not specified, but “literally never played” is about as bad as this category of bug gets. Fixed now. Q: Was the missing-slash bug related to the join link work from devlog #9? A: Yes, same feature area, this was the actual root cause of some of the lingering weirdness there. Q: Is 5.4.2 stable? A: As far as testing shows. Same disclaimer as always applies. —This is the end*— *end for now, deploy pipelines permitting PARABLE!!!
Spectralis devlog #16 —Hello again proggers— Short one. Found the website pipeline issue from devlog #15. Cat or dog? sudo —Yap— It wasn’t the code. It was permissions. The site was calling root but never actually had access to root, which is exactly why it worked fine locally and fell over the second it hit deployment. “It woRKS On My macHiNe” — the oldest curse in software, and I said it unironically. classic —This is the end*— *end for now, root access permitting PAPAYA!!!
Spectralis devlog #17 —Hello again proggers— 12 hours. All-nighter. Zero sleep. Feature isn’t in the app. Nothing shipped. This is the devlog where I explain what an entire night of work bought me, and the honest answer is “a very expensive lesson.” worth it? absolutely not. did i learn something? also debatable Cat or dog? catch (ApiDoesNotExistException) Okay let’s get into it~ —Yap— Got ambitious. Decided Spectralis should integrate with everything — Pandora, Amazon Music, a bunch of other big platforms on top of what already works. Turns out “everything” includes a lot of services that simply don’t offer a public API to integrate with in the first place, and finding that out was not the fast part of the night. —The Great Suffering— 1 — The APIs Just Don’t Exist Pandora, Amazon Music, and others: no public API to build against. Not “hard to find,” not “poorly documented,” just not there. Should’ve been step zero, ended up being the thing that derailed the entire night once discovered mid-build instead of before starting. 2 — So I Built Backdoors Instead Spent a huge chunk of the 12 hours reverse-engineering and building unofficial access paths instead, since the front door didn’t exist. This is the kind of work that eats hours and produces nothing you can point to until it’s fully working, if it ever gets there. 3 — Most Of Them Were Already Patched Implemented several of these backdoor approaches only to find out the platforms had already closed the exact gaps being exploited, sometimes before the implementation was even finished. Built things that were dead on arrival by the time they existed. patched before i even shipped it, incredible timing 4 — Asked Claude, Got A Hallucinated Answer, Followed It Anyway At the point of giving up, asked for a way to make it work anyway. Got a confident-sounding approach back that didn’t actually correspond to anything real, and followed it blindly instead of verifying it first, because by that point it was hour 10-something and verifying things sounded like more effort than it was. 5 — Ripped The Whole Feature Out End state: none of it works, none of it can work without real API access that doesn’t exist, so the entire feature attempt got stripped back out of the codebase. 12 hours, one commit’s worth of net progress, and that commit is the revert. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out platforms without public APIs stay that way for a reason. Q: Is any of this coming back later? A: Not until there’s an actual, real, non-reverse-engineered way in. Not chasing patched backdoors again. Q: Should you have asked Claude earlier instead of at hour 10? A: Probably. Should also have double-checked what it said instead of following it blind at 4am. Two separate lessons from one night. Q: Was any of the 12 hours useful? A: Now know definitively which platforms are and aren’t worth attempting. That’s the only thing salvaged. Q: Sleep status? A: Catastrophic. Handling that before touching code again. —This is the end*— *end for now, actual sleep permitting Im gonna go pass out on the couch ADIOS!!!
Spectralis devlog #18 —Hello again proggers— First real demo capsule is live. Not a screenshot, not a “trust me it works” — an actual .spectralis file you can grab and open yourself, right after devlog #17’s night of nothing. Felt good to ship something that isn’t a revert for once. redemption arc, one demo file at a time Cat or dog? demo.spectralis Okay let’s get into it~ —Yap— Wanted the first public demo to actually show off what a capsule can do, not just be a proof of concept nobody can open. So it’s a full one: real track, real hand-timed lyrics, and a visualizer built specifically for it instead of a generic default. —The Great Suffering— 1 — The Demo’s Live demo.spectralis is up at cdn.deltavdevs.com now. First capsule anyone outside this devlog series can actually download and open. 2 — The Track And The Lyrics Built around Black Coast’s “TRNDSTTR” (Lucian Remix). Lyrics for it were timed and written into the capsule by hand — not pulled from some export, actually sat down and did the timing work myself. 3 — The Visualizer’s Custom, Not A Default Also built the visualizer specifically for this capsule instead of shipping the demo with a stock one. Wanted the first thing people see from Spectralis to actually demonstrate what the capsule format can do end to end — audio, synced lyrics, and a visual built to match, all in one file. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one downloading the first real capsule demo. Q: Where’s the demo? A: cdn.deltavdevs.com/spectralis/demo.spectralis — direct download, no wrapper page. Q: Did you write the lyrics yourself or pull them from somewhere? A: Wrote and timed them in by hand for this capsule specifically. Q: Is the visualizer reusable for other capsules? A: Built for this one specifically, but nothing stopping it from getting adapted or reused as a base for others later. Q: Is this what stories/capsules from devlog #7-#8 were building toward? A: Exactly that. This is the first one actually finished and out in the world instead of just being tested locally. —This is the end*— *end for now, capsule downloads permitting PARODY!!!
Spectralis devlog #19 —Hello again proggers— v6 LTS is on the horizon. Scheduled time with a friend who actually owns a Tim Cook machine, fingers crossed a Mac build comes out the other side of that session actually working. praying to the WWDC gods Cat or dog? arm64 Okay let’s get into it~ —Yap— First real LTS push. Different mindset than the last 18 devlogs of feature work and 3am bug hunts — LTS means stability first, and it also means finally taking a real swing at macOS instead of leaving it as a someday problem. —The Great Suffering— 1 — Prepping For v6 LTS Getting the groundwork in place for the first Long Term Support build. Less “ship the coolest thing,” more “ship the thing that won’t need constant babysitting after release.” 2 — Borrowing A Friend’s Mac Don’t own a Mac. Scheduled dedicated time with a friend’s actual Apple hardware to attempt a real build instead of guessing blind or fighting a CI-only setup with no way to actually test the output. 3 — The Honest Caveat: Mac Support Will Lag Straight talk: limited access to Mac hardware means Mac builds will very likely only get LTS releases going forward, and will land late relative to betas and regular updates on other platforms. Not ideal, but better to say it now than pretend otherwise. can’t test what you can’t touch —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing a friend’s Mac because Apple hardware access is not a given. Q: Will Mac users get every update? A: Realistically, no — LTS builds only for the foreseeable future, and later than other platforms. Access to hardware is the bottleneck, not desire to support it. Q: Why prioritize LTS over a beta cycle right now? A: Stability’s the actual goal for v6. Betas can come later once the LTS foundation’s solid. Q: Is the Mac build guaranteed to work this session? A: No promises. That’s what “fingers crossed” means. Q: What happens if the Mac session doesn’t go well? A: Try again next time hardware access lines up. Not giving up on it, just constrained by it. —This is the end*— *end for now, Tim Cook machines permitting PRINCIPLE!!!
Spectralis devlog #20 —Hello again proggers— Two zero. Milestone devlog, and it’s a good one: LTS is about to actually go out the door, Mac included, today. we made it, barely, on no sleep, as tradition demands Cat or dog? git revert HEAD 7 Okay let’s get into it —Yap— Spent the whole night doing QoL and QA on all the tiny bugs that had been getting pushed aside devlog after devlog. Turns out “small bugs” and “easy to fix” are not the same category, and the whole night proved it the hard way. —The Great Suffering— 1 — Hydra Bugs Every single one of the small deferred bugs got patched, and every single patch spawned about three new ones in its place. Fix one, watch three grow back. Felt less like debugging and more like fighting something with a regeneration mechanic. cut off one head, three more show up, name a more accurate bug report 2 — Tried Claude Code Out Of Exhaustion Got tired enough mid-hydra-fight to set up Claude Code and hand off some of the grind. It did not go well — ended up rearranging the repo and commit layout in ways that made the history a mess, not the bugs. 3 — Had To Undo Its Commits Rolled back what Claude Code did and went back to fixing things manually. Lesson for the night: handing off a messy, deep-in-it repo state to an agent mid-crisis is not the same as handing off a clean one. 4 — Actually Got All The Tiny Bugs Out After all of that, the hydra’s actually dead. Every deferred small bug from the last 19 devlogs finally cleared in one sitting, which is the whole reason today’s release is happening at all. 5 — Mac Release, Today Following up on devlog #19’s borrowed-Mac build attempt — releasing to Mac today alongside everything else. First real payoff from that session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who fought a hydra of bugs all night and won, barely. Q: Did Claude Code actually break anything functional, or just the repo layout? A: Just history and commit structure, nothing shipped broke because of it. Still a mess worth undoing. Q: Is this LTS build the one from devlog #19’s prep? A: Yes, same one. This was the final QA gauntlet before it goes out. Q: Is Mac really getting it today? A: That’s the plan, following through on the borrowed-Mac build session from last devlog. Q: 20 devlogs in, anything you’d do differently? A: Sleep more, probably. Not going to happen, but it’d be the right answer. —This is the end*— *end for now, hydra heads permitting PROPERTY!!!
Spectralis devlog #21 —Hello again proggers— Flagged for “AI website” again. By Shipwrights this time. Getting a little tired of this specific accusation, honestly — a commit log sitting right there would show actual work happening over actual time, but apparently that’s a few extra minutes nobody wants to spend. the receipts exist, nobody’s asking to see them Cat or dog? git log –oneline Okay let’s get into it~ —Yap— Third redesign of the site now. Not because the flag was right, but because if this keeps happening it’s worth just making the “looks AI-made” argument harder to make at all, regardless of whether it was ever a fair read in the first place. —The Great Suffering— 1 — Flagged Again Shipwrights flagged the site as AI-generated. Same accusation as the devlog #12-#14 saga, different flagger this time. Slightly more annoying with each repeat, since the actual work history’s right there for anyone willing to look. 2 — The Annoying Part It’s not that the site got flagged, it’s that the disproof is trivially available — commits, timestamps, iterative changes across three separate rebuilds — and checking that apparently isn’t part of the process. Frustrating, not devastating. 3 — Redesigned It A Third Time Rather than fight the flag directly, changed the site again. Third pass now, and it genuinely reads less like generic AI-slop territory than the last version did. Whether that satisfies the next flag or not, it’s a real improvement on its own merits. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who’s redesigned this website three separate times partly to dodge a false flag. Q: What’s Shipwrights? A: The one doing the flagging this round. Q: Is the flag actually accurate? A: No — there’s a real commit history behind the site across devlogs #12 through #14 and now this one. The flag’s wrong, just annoying to keep disproving. Q: Does this redesign replace the one from devlog #14? A: Yes, third full pass on top of that one. Q: Any plan if it gets flagged a fourth time? A: Probably the same plan: keep the receipts, keep improving the site anyway, move on. —This is the end*— *end for now, false flags permitting PALPABLE!!!
Spectralis devlog #22 —Hello again proggers— Posting this before I pass out for real. And no, that wasn’t me faceplanting the keyboard, that was the cat walking across it. Very important distinction. the cat gets a commit credit for that one, honestly Cat or dog? cat, apparently, tonight specifically Okay let’s get into it~ —Yap— Back on the ever-growing pile of bugs and QoL from devlog #20’s hydra fight — turns out killing all the tiny bugs once doesn’t mean they stay dead forever, more just showed up in the meantime. Made real progress anyway. —The Great Suffering— 1 — A Few Spotify Bugs, Actually Squashed Chased down and fixed a handful of Spotify-side bugs this round. Not a full audit like earlier devlogs, just real ground covered on stuff that’s been sitting in the pile. 2 — Resizing QA Went through resizing behavior across the app and did a real QA pass on it — the kind of thing that’s easy to skip until someone resizes a window in a way you never tested and everything looks wrong. 3 — The Multi-Channel Stream Queue Idea Had the idea to implement multi-channel support for Streamer Queue. Started on it, and it’s genuinely probably too big to land fully before LTS ships — most likely going in as a stub for now rather than a finished feature, with the real implementation following after. “horrible idea” is doing some self-aware lifting there and I stand by it —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who mistook a cat for their own exhaustion, and honestly it could’ve gone either way. Q: What’s a “stub” mean for multi-channel here? A: The scaffolding and interface exist, the real functional implementation doesn’t yet. Placeholder with intent, not a real feature. Q: Is this the same bug pile from devlog #20? A: Same pile, refilled since then. Small bugs apparently regenerate on their own schedule, not just when you’re actively fighting them. Q: Why is multi-channel “horrible” if you’re building it anyway? A: Because scope-wise it’s a lot more than it looks like on paper, and admitting that upfront beats pretending it’s simple. Q: Sleep status tonight? A: About to happen, actually, this time. Cat’s taking the credit either way. —This is the end*— *end for now, sleepy cats permitting PEOPLE!!!
Spectralis devlog #23 —Hello again proggers— Introducing the visualizer editor. Been sitting on this one for a while without announcing it, for a very specific reason: every single time it felt ready, the format changed again and “ready” moved further away. Think it’s actually real this time. announced it in my head about six times before this devlog Cat or dog? visualizer.format Okay let’s get into it~ —Yap— Grinding all night on this one, branch and v1 dropping tomorrow. No promises beyond that, just the plan and the fact that this has been quietly cooking for way longer than any single devlog has let on. —The Great Suffering— 1 — Why This Wasn’t Announced Sooner Kept hitting the point where the editor felt done, then rethinking the underlying format and starting that part over. Easier to just not announce something that keeps changing shape than to keep walking back a “it’s ready” claim in public. 2 — v1 And The Branch, Tomorrow Committing to it now — v1 and the branch land tomorrow. Whole night’s going toward getting there, which given the last 22 devlogs of this project is either a great sign or a very familiar warning sign. history suggests: could go either way 3 — What The Visualizer Editor Actually Is A real editor for building visualizers instead of the visualizer side of the app staying built-in-only. Ties back to everything from the capsule/worlds work in devlogs #7 and #8 and the custom visualizer built for the demo capsule in devlog #18 — this is the tool version of doing that by hand. 4 — Hackatime Also Just Died (Or My PC Did) On top of everything else, Hackatime seems to be down, or my PC’s cooked, unclear which yet. Either way tracked hours for tonight are now undefined. Yipee. unlogged hours are the best kind of hours, said nobody’s time tracker ever —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to pull yet another all-nighter for a feature reveal. Q: Why did the format keep changing? A: Each pass revealed a new limitation once actually used for real, and fixing that meant reworking the format again rather than shipping something known to be wrong. Q: Is this related to the demo capsule visualizer from devlog #18? A: Same territory. That one was hand-built. This is the editor meant to make building one not require doing it by hand. Q: What’s “v1” mean here specifically? A: First real usable version, branch-only for now, not a full public release yet. Q: Any risk this slips again? A: Always possible given the track record, but committing to tomorrow specifically this time. —This is the end*— *end for now, format stability permitting PEPLE!!!
Spectralis devlog #24 —Hello again proggers— Rewrote the README a third time. Not because it was wrong, because proper prose and actual formatting apparently reads as “completely AI” to whoever’s judging it, and I’m too burnt out to keep arguing that point. So it just got redone instead. can’t fight the vibes, can only rewrite around them Cat or dog? README.md Okay let’s get into it~ —Yap— Small win buried in the exhaustion: website’s on version 4 now and it didn’t get flagged this time. First one that made it through clean since devlog #21 started this whole saga. Progress, even if the README’s now on its third rewrite for reasons that have nothing to do with whether it’s actually good. —The Great Suffering— 1 — README Rewrite #3 Same content, restructured again, because well-formatted prose keeps getting read as an AI tell regardless of who wrote it or how. Not going to keep relitigating this one, just redid it and moved on. 2 — Website v4 Survived The actual good news. Fourth pass on the site, first one that didn’t get flagged. Whatever combination of changes from devlog #21 onward finally landed right. 3 — Hoping The App Gets Checked Next If the docs and the website keep clearing review, maybe eventually the actual app gets looked at instead of just the surface-level stuff around it. That’s the real hope here — less time defending prose formatting, more time on the thing that actually matters. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose actual writing keeps getting mistaken for a machine’s. Q: Why does formatted prose get flagged as AI? A: Genuinely unclear, and at this point not worth the energy to keep contesting. Rewriting around it was faster than arguing it. Q: Is this the fourth full website redesign? A: Yes — devlog #14, then #21’s rework, and now this pass, landing clean. Q: Has the app itself ever been flagged? A: Not yet, and that’s sort of the point of this devlog — hoping it stays that way, or at least gets a fair look if it comes up. Q: How’s the burnout? A: Present. Noted. Continuing anyway. —This is the end*— *end for now, formatting opinions permitting PEEL!!!
Spectralis devlog #25 —Hello again proggers— Short one, I’m about to pass out for real this time. Ground away at the visualizer toolkit for a long stretch and it’s still nowhere near done. another one for the “not as close as I thought” pile Cat or dog? too tired to pick one honestly Okay quick version~ —Yap— Same visualizer editor territory from devlog #23, except the format not-changing this time didn’t mean the finish line got any closer. Long grind, real progress somewhere in there probably, just not a done toolkit at the end of it. —The Great Suffering— 1 — The Toolkit Isn’t Close Put in a long stretch on it and it’s genuinely still far from finished. Not a small gap either, just more scope than one exhausted session could close. 2 — I’m Cooked That’s the whole update. No dramatic bug story tonight, just hours in and not enough left to keep going. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who should probably close the laptop now. Q: Is this the same visualizer editor from devlog #23? A: Same one. Still cooking, longer than expected. Q: Any specific blockers? A: Too tired to write them up properly tonight. Next devlog, probably, once there’s actual sleep behind it. Q: When’s it landing? A: Unknown. Not this session. —This is the end*— *end for now, actually sleeping this time POOL!!!
Spectralis devlog #26 —Hello again proggers— Still grinding the visualizer toolkit from devlog #25. Fueled up properly this time — favorite tunes on, Coke Zero and a Monster Ultra on deck, going the entire night. Also, small detour: past me apparently gave in and used Electron at some point, so present me now has to relearn it from scratch. past me makes decisions present me has to live with, name a more accurate description of software Cat or dog? require(‘electron’) Okay let’s get into it~ —Yap— Two threads tonight: the toolkit grind continuing from last devlog, and a genuinely surprising discovery on the Mac build front that’s going to need its own hotfix branch. —The Great Suffering— 1 — Relearning Electron Past-me committed to Electron somewhere along the way and current-me forgot most of it. Spending part of tonight just getting back up to speed on something that used to be second nature. Annoying, but at least it’s a known quantity once it clicks back in. 2 — The Toolkit, Still Grinding Same visualizer toolkit as devlog #25. Not done yet, but the night’s young and there’s caffeine involved. Hoping to actually close real ground on it before LTS needs to be ready. 3 — Mac Build Actually Compiles Now Following up on devlog #19’s borrowed-Mac session — got it to build and compile this time. Real progress on a front that’s been genuinely hardware-constrained the whole way. 4 — Turns Out Mac Isn’t Windows Or Linux (Shocking, I Know) Here’s the surprising part: a lot of the build scripts turned out to be Windows/Linux-centric, and Mac is, in fact, neither of those operating systems. Somehow this wasn’t obvious until actually staring at a failing script on real Mac hardware. three major desktop OSes and somehow I only accounted for two of them 5 — Hotfix Branch Incoming Need to spin up a hotfix specifically for the platform-assumption problem in the scripts, and hoping it merges back clean without conflicts. Given tonight’s track record so far, cautiously optimistic. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who forgot their own framework choice from past-self. Q: Why Electron in the first place? A: Decision from before this devlog series apparently, reasons unclear at this hour, dealing with the consequences now regardless. Q: Is the Mac hotfix urgent? A: Ties directly into whether LTS with Mac support actually holds together, so yes, fairly urgent. Q: Was assuming Windows/Linux-only scripts really a mistake nobody caught until now? A: Apparently so. Borrowed-Mac hardware access from devlog #19 finally exposed it. Q: Toolkit status vs. hotfix status tonight — which wins? A: Whichever gets further before the caffeine runs out. Probably both get some progress. —This is the end*— *end for now, merge conflicts permitting PROPER!!!
Spectralis devlog #27 —Hello again proggers— Still going. Decided mid-grind to switch off JSON-based saving entirely and move to a proper binary streamed format instead — faster save/load, way less CPU overhead. Which sounds like a clean upgrade until you realize it means reading books on binary format design that were probably written before I was. my caffeine and my reading list have diverged wildly tonight Cat or dog? BinaryWriter Okay let’s get into it~ —Yap— The pivot away from JSON wasn’t planned going into tonight, it just became obviously worth it partway through the toolkit grind. Now stuck in the part of the process nobody enjoys: documentation, theory, and CS ideation before any of the actual implementation gets to happen. —The Great Suffering— 1 — JSON’s Getting Replaced Moving off JSON-based saving to a binary streamed format. The reasoning’s simple — faster save/load, meaningfully less CPU usage — but simple reasoning doesn’t mean simple implementation. 2 — Reading Books Older Than Me Digging into binary streaming format theory means reading material that predates this whole project by a wide margin, some of it by a lot more than that. Foundational stuff, just not exactly light reading at this hour. 3 — Documentation And Theory Hell Currently deep in the least glamorous part of any format redesign: reading documentation, working through theory, and CS ideation before writing a single line that actually does anything. Necessary, still miserable at 2am. the implementation is the fun part and it’s still hours away 4 — Sun Came Up, Had A Sandwich, Kept Going Watched the sunrise somewhere in the middle of the theory reading. Had an egg and bacon sandwich for breakfast, genuinely delicious, best part of the night so far. No sleep planned until tonight — just powering through on breakfast fuel instead. breakfast during an all-nighter hits different —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one reading format-design theory older than their own project at 2am. Q: Why move off JSON now, mid-grind? A: Became clear it was the right call while working on the visualizer toolkit — better performance characteristics were worth the detour. Q: Is this related to the toolkit from devlog #25/#26? A: Same overall session, this is a scope addition that came up while working on it. Q: When does actual implementation start? A: Once the theory and documentation phase actually resolves. Not there yet. Q: Is tonight ever going to end? A: Not until tonight, apparently — sun’s already up and there’s no sleep planned before then. —This is the end*— *end for now, binary formats permitting PAM!!!
Spectralis devlog #28 —Hello again proggers— LTS 6 is out. Genuinely out, not “shipped to nowhere” out like devlog #11. Sleep deprivation’s fully caught up though — first chance I get, I’m passing out on the couch with the cat and that’s non-negotiable at this point. the cat’s getting a co-author credit at this rate Cat or dog? couch, specifically, with the cat, immediately Okay let’s get into it~ —Yap— Long stretch from devlog #26 through here finally paid off. LTS 6 pushed, and the major macOS decoding problems from the borrowed-Mac build sessions actually got fixed. Real progress, real exhaustion, both at once. —The Great Suffering— 1 — LTS 6 Is Out Following the hydra-bug fight in devlog #20, the Electron relearn and Mac hotfix in #26, and the binary format detour in #27 — it’s actually pushed now. Linux and Windows builds are the ones going out first. 2 — Major macOS Decoding Problems, Fixed Following up on the platform-assumption bug from devlog #26, where Windows/Linux-centric scripts choked on Mac being neither — dug into the actual decoding issues on macOS and got the major ones resolved this round. 3 — Mac Release Is Coming, Just Not Today No Mac hardware access again until Monday, so the macOS build follows a bit after Linux/Windows instead of dropping same-day. Same access constraint from devlog #19, still the bottleneck, still the plan. 4 — Sleep Is Winning Officially out of gas. Couch, cat, first available window. This devlog is basically the victory lap before collapsing. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to lose consciousness on a couch next to a cat, mission accomplished. Q: Is LTS 6 out for everyone right now? A: Linux and Windows, yes. macOS is coming shortly after once Mac access is available again Monday. Q: Were the macOS decoding problems from the script issue in devlog #26? A: Related territory, yes — once the platform-assumption bug got flagged, the deeper decoding issues underneath it got found and fixed too. Q: Any concerns going into the Mac release specifically? A: Nothing unresolved as of this devlog, but access is still limited to occasional sessions, so timing’s dependent on that. Q: What’s next after this? A: Sleep. Genuinely, actually sleep, before anything else touches this project. —This is the end*— *end for now, couch naps permitting thud Zzzzzz!!!
Spectralis devlog #29 —Hello again proggers— The studio’s finally looking like a real UI tool instead of a collection of windows held together by vibes. Two design references pulled this round: Godot for world editing, and Adobe After Effects for capsules. stealing good ideas from great tools is called “design research,” look it up Cat or dog? Ctrl+Shift+F Okay let’s get into it~ —Yap— Studio’s been the least polished part of the whole app for a while, mostly functional, rarely pretty. This round actually leaned into real interface design instead of just adding buttons where they fit, borrowing structure from two tools that already solved similar problems well. —The Great Suffering— 1 — Godot-Inspired World Editing World editing took cues from Godot’s editor layout — the way it structures a scene tree, viewport, and inspector panel together as one coherent workspace instead of scattered windows. Applying that same structural thinking to world editing here, since worlds are conceptually similar: a tree of pieces you’re arranging in space. 2 — After Effects-Inspired Capsules Capsule editing leaned on After Effects instead, specifically the layer/timeline/composition mental model. Capsules are time-based and layered by nature — a story surface, a visualizer, audio all stacked together — so a timeline-and-layers metaphor fits better than a flat property list ever did. 3 — The Studio Finally Feels Like A Tool Combined, these two reference points are what’s pushing the studio from “internal dev utility” toward something that actually feels designed for someone to sit down and use, not just something built incrementally to unblock whatever feature needed it that week. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one borrowing UI patterns from two very different but very good tools. Q: Is this a full rewrite of the studio UI? A: More a restructuring around better mental models than a ground-up rebuild, but it touches a lot of surface area. Q: Why Godot for world editing specifically? A: Scene/viewport/inspector is a well-worn pattern for spatial editing, and worlds are fundamentally a spatial arrangement problem. Q: Why After Effects for capsules? A: Capsules stack time-based layers — story, visualizer, audio — which maps naturally onto a timeline/layers workflow instead of flat settings. Q: Does this connect to the visualizer toolkit grind from devlogs #25-#27? A: Same broader authoring-tools push, yes, this is the UI side catching up to that work. —This is the end*— *end for now, layer panels permitting POP!!!
Spectralis devlog #30 —Hello again proggers— Following up on the studio redesign from last devlog — actually building inside that new layer system now. Lyric importer, a bezier tool that fought back the whole way, and capsules jumped to full HD. 30 devlogs in and the bezier tool still almost won Cat or dog? bezier.controlPoint Okay let’s get into it~ —Yap— Layers from devlog #29’s redesign got real functionality built on top of them this round, plus a genuinely useful new import path and a resolution bump that should’ve probably happened earlier. —The Great Suffering— 1 — Layer Fixes Cleaned up a handful of issues in the new After Effects-style layer system from last devlog — the kind of rough edges that only show up once you’re actually building real content in it instead of just looking at the layout. 2 — Lyric Importer: Auto Vector Layers + Keyframing New importer that takes lyric timing and automatically generates vector layers, keyframed to match. Turns what used to be manual layer-by-layer, keyframe-by-keyframe setup into an actual import step. Big time save for anything lyric-driven, including future capsules like the demo from devlog #18. 3 — A Few More Bugs, Squashed Small round of additional fixes alongside the bigger items, nothing individually dramatic. 4 — Capsule Resolution: Bumped To Full HD Capsules render at full HD now instead of whatever lower resolution they were capped at before. Straightforward upgrade, noticeably better output. 5 — The Bezier Tool (Which Was Hell) Added a real bezier curve tool to the timeline/layer editing. Genuinely brutal to get right — curve math, control point handling, and making it feel intuitive to actually drag are three different hard problems stacked on top of each other. Worth it, but it fought back the whole way. bezier curves: simple in theory, a nightmare in an actual editor UI 6 — Timeline And Tool QoL Assorted quality-of-life improvements across the timeline and tools generally — the small friction-reduction stuff that adds up once you’re using the studio for real work instead of just testing it. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just fought a bezier tool and mostly won. Q: Does the lyric importer work with the demo capsule from devlog #18? A: That one was hand-timed and hand-built before this importer existed — this tool’s for making the next ones faster. Q: Why was the bezier tool specifically so hard? A: Curve math, control point interaction, and UI feel all had to work together, and getting any one of them wrong makes the whole tool feel broken. Q: Is full HD the resolution ceiling now, or is higher coming later? A: Full HD is what shipped this round. No commitment yet on going higher. Q: Is the studio redesign from devlog #29 basically done now? A: Getting real functionality built on it, which is a good sign, but still ongoing. —This is the end*— *end for now, control points permitting PALPABLE!!!
Spectralis devlog #31 —Hello again proggers— More QoL, a real bug fixed in world editing, and a proper in-depth test run of the whole thing. Honest verdict after actually using it for real: still sucks, still hate it, but it’s at least somewhat usable now. Progress, technically. “somewhat usable” is a real milestone when you started from “actively bad” Cat or dog? node.isCorrupt Okay let’s get into it~ —Yap— World editing’s been the newer, rougher part of the studio since the Godot-inspired redesign in devlog #29. This round was about actually running it through its paces instead of just building on top of it, and that testing found a real problem. —The Great Suffering— 1 — More QoL Another pass of small quality-of-life improvements, continuing the trend from the last couple devlogs. Nothing individually huge, all of it adds up. 2 — The Bad Node Bug Found and fixed a genuinely bad node bug in the world section during testing. The kind of bug that only shows up once you’re actually building real worlds instead of poking at an empty editor. 3 — The In-Depth Test Run Took world editing for a real, thorough run this time instead of a quick sanity check. Built something with actual substance in it and used the tool the way it’s meant to be used. 4 — The Honest Verdict Still sucks. Still hate using it. But after this round of fixes and QoL, it’s crossed into “somewhat usable” territory, which is more than could be said before this session. low bar, cleared, moving on —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just admitted their own tool still sucks and shipped it anyway. Q: Is world editing done now? A: No, “somewhat usable” is the current state, not “finished.” More work ahead. Q: How bad was the node bug? A: Bad enough to matter, found through actual real-world testing rather than a quick check. Q: Is this related to the layer work from devlog #30? A: Different area — that was capsules/timeline, this is world editing specifically. Q: What’s the plan to make world editing not suck? A: Keep testing it for real, keep fixing what that testing turns up. This devlog’s the start of that loop, not the end. —This is the end*— *end for now, corrupted nodes permitting PAPLE!!!
Spectralis devlog #32 —Hello again proggers— Mac’s out. Actually out, actually available, actually done. Took way longer than expected — the site needed updating and every single update script needed fixing before this could actually go out the door clean. “we got mac out” undersells how much site and script work that actually took Cat or dog? .pkg Okay let’s get into it~ —Yap— Closing the loop that started way back in devlog #19 with a borrowed Mac and a hopeful “fingers crossed,” went through the decoding fixes in devlog #28, the platform-assumption hotfix in devlog #26, and now it’s actually shipped. Quick policy reminder while we’re here, since it matters going forward. —The Great Suffering— 1 — The Site Needed Updating First Before Mac could actually go out, the site itself needed real updates to reflect it — new download option, new platform messaging, none of which existed yet. Took a real chunk of the time this release ate. 2 — Every Update Script Needed Fixing Following up on the Windows/Linux-centric script assumptions caught back in devlog #26 — turns out that wasn’t a one-off fix, it touched update scripts broadly. Had to go through and fix them properly for Mac to actually be able to update itself going forward, not just install once. 3 — Mac Is Actually Out After all of that: it’s live. Full journey from borrowed hardware sessions to an actual public release. 4 — Reminder: Mac Only Gets LTS Quick policy note, stated plainly since it matters: Mac only receives LTS releases going forward, not minor updates, unless a minor is a Mac-specific patch. Same access-constraint reasoning from devlog #19 — this isn’t changing anytime soon, so setting the expectation clearly now. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just found out “ship Mac” secretly meant “rebuild the update pipeline.” Q: Does Mac get every LTS release? A: Yes, every LTS. Just not the minors in between, unless that minor is Mac-specific. Q: Why not give Mac full parity now that it’s out? A: Hardware access is still the bottleneck — same reasoning as devlog #19, testing and building for Mac isn’t a routine, always-available thing yet. Q: What took so long between the decoding fixes in devlog #28 and now? A: Mostly the site and update script work described above — the actual build was closer to ready than the delivery pipeline around it was. Q: Is this the end of the Mac saga? A: The release side, yes. Ongoing maintenance is just going to follow the LTS-only cadence from here. —This is the end*— *end for now, update scripts permitting POP!!!
Spectralis devlog #33 —Hello again proggers— First real wave of feedback since Mac shipped in devlog #32, and it’s been genuinely good. Patching a handful of bugs people actually pointed out, plus one quick clarification for a specific rater who had a question. real users, real feedback, feels different from testing solo Cat or dog? feedback.md Okay let’s get into it~ —Yap— Shipping to actual people instead of just self-testing changes the kind of bugs that surface. Round of patches based directly on what came in, plus a couple of housekeeping notes. —The Great Suffering— 1 — Real Feedback, First Time At This Scale Genuinely solid feedback wave since the Mac release. Different flavor of bug reports than internal testing ever produces — actual usage patterns finding things a solo QA pass wouldn’t. 2 — Patching What Got Pointed Out Working through the specific bugs raised by that feedback. Direct fixes for direct reports, exactly the kind of loop that’s supposed to happen once something’s actually in people’s hands. 3 — Quick Note For A Specific Rater One rater asked about the track used in devlog #1 — it’s a custom remix of “Delete” by Ninjirachi. DM if you want the file. 4 — How To Reach Out For anyone hitting issues with the app: Slack works, or Discord at @deltav0rtex . Genuinely want the reports, keep them coming. 5 — A Surprise Is Coming Next Ship Got something tucked away for the next release that should land well. Not spoiling it here, staying quiet on purpose. Minor patch for this round’s QoL fixes drops within the next two days. teasing it and saying nothing else, that’s the whole bit —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one actually reading feedback instead of guessing what’s broken. Q: How do I report a bug? A: Slack, or Discord — @deltav0rtex . Q: What was that track in devlog #1? A: A custom remix of “Delete” by Ninjirachi. DM for the file if you want it. Q: Is the current bug list from this feedback wave big? A: Manageable, working through it directly rather than batching for a bigger release. Q: Any plans to formalize a feedback/bug channel later? A: Not stated yet, current setup is DMs and Slack for now. Q: What’s the surprise for next ship? A: Not saying. That’s the point of a surprise. Q: When’s the minor QoL patch dropping? A: Within the next two days. —This is the end*— *end for now, bug reports permitting PARABLE!!!
Spectralis devlog #34 —Hello again proggers— Still on the devlog commits grind. The surprise from devlog #33 is actually finished now, releasing alongside the next Stardance ship as soon as this current one clears. Meanwhile, spent this round scouring the app for small edge cases and UI stuff that’s been quietly overlooked. the surprise is done, the suspense is not Cat or dog? edge_case.md Okay let’s get into it~ —Yap— Two tracks this devlog: the surprise from last time is locked and ready, waiting on the current ship to clear before it goes out with Stardance. In the meantime, doing a proper sweep for the small stuff — edge cases and UI rough edges that don’t show up unless you’re specifically hunting for them. —The Great Suffering— 1 — The Surprise Is Finished Whatever it is, it’s done. Releasing with the next Stardance ship, not this current one — has to clear first. Still not saying what it is. still not telling you, patience 2 — Scouring For Edge Cases Going through the app specifically looking for edge cases that got missed during normal feature work — the inputs and states nobody thinks to test until something breaks in a very specific, very rare way. 3 — UI Stuff That Got Overlooked Alongside the edge cases, hunting down small UI issues that slipped through — spacing, alignment, states that don’t look quite right, the stuff that’s easy to miss when you’re heads-down building instead of using the app like a regular person would. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hunting edge cases nobody else would think to try. Q: What’s the surprise? A: Patience, my dear child. Q: Why wait for the current ship to clear first? A: Cleaner to let one release settle before stacking the surprise onto the next one. Q: Any specific edge cases found yet? A: Sweep’s ongoing, nothing dramatic enough to call out individually yet. Q: Still not saying what the surprise is? A: Correct. Ask again next devlog. —This is the end*— *end for now, edge cases permitting PERISHABLE!!!
Spectralis devlog #35 —Hello again proggers— Long way from v5.3.0, that’s for sure. New ship’s cooking, and it’s built directly off the feedback wave from devlog #33 — took what came in and actually built more on top of it. Also, the big one this round: video export is here. 35 devlogs from “last ship” to this Cat or dog? .mp4 Okay let’s get into it~ —Yap— This one’s a real feedback-driven ship, not just internal roadmap stuff. Fed reports and requests all the way back from devlog #2’s post-first-ship feedback into the app, and video export was the headline addition that came out of it. —The Great Suffering— 1 — Feedback Actually Became Features Everything that came in since devlog #2, right after the very first ship, finally got folded back into this release, not just patched as bugs but expanded into more app. Real loop from “here’s what’s wrong/missing” way back then to “here’s it, fixed and built out” now. 2 — Video Export Is Here For music makers who want something to post — YouTube, Klipy, wherever you’re posting cool stuff — Spectralis can now export video directly instead of just playing audio and visualizers live. Been a long time coming given how much the visualizer/capsule work has built up across devlogs #7, #18, #23, and #29-#30. 3 — This Is The New Ship, Not The Finished One Announcing the direction this round more than closing it out — the surprise from devlog #33/#34 still rides along on this too. Full picture coming as it actually ships. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just got a whole export pipeline for their trouble. Q: What can video export actually do? A: Exports your visualizer/capsule output as an actual video file, suited for posting to platforms like YouTube or Klipy. Q: Is this the same ship as the Stardance surprise from devlog #34? A: Same overall release window, yes. Q: How much of this came directly from user feedback? A: A meaningful chunk — some of it going all the way back to devlog #2, right after the very first ship. Q: When’s it actually dropping? A: Still in progress. This is the announcement, not the release. —This is the end*— *end for now, export pipelines permitting PS: couldn’t find a good meme this time, so you get corporate gif slop instead. Enjoy. PICKLE!!!
Spectralis devlog #36 —Hello again proggers— Last log before 6.0.1 tries to ship to everyone. Except Mac, remember? If anyone — and by anyone I mean basically no one — has the app downloaded already, you should see the update land fairly soon. “anyone” carrying a lot of self-deprecation in that sentence Cat or dog? v6.0.1 Okay let’s get into it~ —Yap— Four things landing in this round: video export from devlog #35 finally patched back in properly, the about page expanded, a real EQ upgrade, and more webview bugs cleared out. Then it’s out the door. —The Great Suffering— 1 — Video Export, Actually Patched In Announced back in devlog #35, and this round it’s actually working and patched into the build for real instead of just existing as a headline feature nobody could touch yet. 2 — About Page, Expanded Grew the about page out — more actual content instead of the bare-minimum version it’s had this whole time. 3 — A Far More Advanced EQ System Real upgrade here: new EQ with envelope styling and a handful of presets. Meaningfully more capable than whatever was there before, for anyone who actually cares about shaping their sound instead of just hitting play. 4 — More Webview Bugs, Patched Following the WebView2Host fast-path fix from devlog #9, a few more webview-related bugs got cleared out this round. Apparently that surface keeps finding new ways to misbehave. webview bugs are the gift that keeps on giving 5 — 6.0.1 Ships, Mac Excluded (Still) Same LTS-only policy from devlog #32 applies — Mac isn’t getting 6.0.1 as a minor. Everyone else should see the update land soon. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to auto-update basically no one to 6.0.1. Q: Why doesn’t Mac get 6.0.1? A: Same policy from devlog #32 — Mac only gets LTS releases, not minors, unless it’s a Mac-specific patch. Q: What’s new in the EQ system specifically? A: Envelope styling plus a set of presets, a real step up from the previous version. Q: Is video export from devlog #35 fully working now? A: Yes, patched in properly this round. Q: When does 6.0.1 land? A: Fairly soon, per this devlog, for anyone who already has the app installed. —This is the end*— *end for now, update pushes permitting PEBBLE!!!
Spectralis devlog #37 —Hello again proggers— Working through the feedback wave from the ship, including an upcoming maybe-new streaming service integration. Reverse engineering, again, yay. Also completely forgot Hackclub’s 10 hour limit was a thing and ran 5 hours over it. It’s fine. Everything’s fine. last time reverse engineering a streaming service ate 12 hours and produced nothing, so this is either growth or déjà vu Cat or dog? HKEY_LOCAL_MACHINE Okay let’s get into it~ —Yap— Post-ship feedback turned into real changes fast, and one of them’s a streaming service integration that’s back to reverse-engineering territory — hopefully with better luck than the devlog #17 saga. Also, format note: switching up how devlogs get posted going forward. —The Great Suffering— 1 — Maybe New Streaming Service Support Working on possible support for another streaming service, and since it doesn’t have a public API either, that means reverse engineering again. Learned some hard lessons from devlog #17’s all-nighter about this exact kind of work, applying them here — verifying before implementing, checking whether something’s already patched before sinking hours into it. 2 — 15 Hours, Not 10 Completely lost track of Hackclub’s 10 hour session limit and blew past it by 5 hours. Not the plan, happened anyway, no regrets loud enough to stop it from happening again probably. time limits are more of a guideline when you’re mid-flow 3 — A Format Change, By Request People like the meme format but keep asking to actually see the project itself, which is fair — problem is most of what’s happening is engine work, and a screenshot of raw code just doesn’t communicate much on its own. Going to try posting an actual screenshot as the first image and keep the meme as the second, going forward. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who just blew past a 10 hour limit by half again as much. Q: Is this streaming integration going to end like devlog #17’s did? A: Hoping not — going in more carefully this time given how that one went. Q: Why not just show code screenshots if people want to see the project? A: Raw engine code doesn’t communicate much visually to most people. Trying to find screenshots that actually show something meaningful instead. Q: Will the meme format go away? A: No, staying as image two. Just adding an actual project screenshot as image one. Q: How’s the feedback wave going overall? A: Productive, this streaming service idea being one direct result of it. —This is the end*— *end for now, session limits permitting POSSIBLE!!!
Spectralis devlog #38 —Hello again proggers— Suno’s integration broke after their latest TOS update, so that got fixed. Also added Discord Rich Presence control for capsules, started chasing down a batch of connections that quietly broke or got dropped over time, and picked up a fun trivia fact along the way: Suno apparently hosts on AWS S3. a TOS update breaking an integration, name a more classic story Cat or dog? S3:// Okay let’s get into it~ —Yap— Mixed bag this round: one reactive fix from an external platform change, one genuinely new feature, and the start of a cleanup pass on integrations that have been quietly rotting since whenever they last got touched. —The Great Suffering— 1 — Suno Integration, Fixed Suno’s newest TOS update broke the existing integration. Patched it back up to work with the new terms. Reactive fix, not a fun one, but necessary. 2 — Capsule DRPC Control Real new feature: Spectralis capsules can now control Discord Rich Presence, so a capsule can show custom status while it’s playing instead of the app just showing generic now-playing info. 3 — Chasing Down Broken And Dropped Connections Going through existing integrations that broke with newer updates on the other end, or that got dropped along the way and never revisited — untitled.stream compatibility being one specific example. Working through the backlog of “this used to work” one at a time. 4 — Suno Hosts On AWS S3 Small fun discovery while poking around the integration: Suno’s hosting is on AWS S3. Not actionable, just neat to know. 5 — Looking For New Platforms Actively looking for what to integrate with next. Feedback on what platforms people actually want would genuinely help shape this. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one whose integration broke because someone else updated a TOS page. Q: What’s DRPC? A: Discord Rich Presence — the status shown under someone’s name in Discord. Capsules can now set custom status through it. Q: What’s untitled.stream compat about? A: One of the connections that broke or got left behind at some point — being actively worked back into shape. Q: What platforms are being considered for new integration? A: Not decided yet, genuinely open to suggestions. Q: Was the Suno fix hard? A: Not conceptually, just annoying — an external change forcing reactive work instead of planned work. Q: What’s the image order now? A: Changed my mind again — meme first, app screenshot second this time. The devlog #37 order didn’t stick. —This is the end*— *end for now, TOS updates permitting POP!!!
Spectralis devlog #39 —Hello again proggers— All-nighter, running on 3 Monsters and a Coke Zero. Reverse engineering APIs is hard as hell, and untitled.stream in particular fought back the whole way. Also snuck in a fix for a Spotify library issue on the side. 3 Monsters and a Coke Zero is not a nutrition plan, it’s a battle strategy Cat or dog? 429 Too Many Requests Okay let’s get into it~ —Yap— Following up on devlog #38’s untitled.stream compat work — turns out “working on it” undersold how hard it actually was. Genuinely brutal reverse engineering session, plus a smaller fix that came out of the same stretch of work. —The Great Suffering— 1 — untitled.stream Was Particularly Hard To Crack Chasing this compatibility since devlog #38, and it turned out to be one of the harder reverse-engineering targets yet. No public API to lean on, so it was the usual slow grind of observing behavior and piecing together how it actually works under the hood. some APIs give up easy, this was not one of them 2 — Reverse Engineering APIs In General: Still Hard Not a new lesson given devlog #17’s whole saga, but worth restating: this category of work is consistently the hardest and slowest kind on the whole project. Going in with better patience and verification habits this time though, which helped. 3 — Spotify Library Polling, Increased Bumped how often libraries get polled to account for some Spotify-side issues that were surfacing. Smaller fix, but a real one, found and shipped in the same session. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who ran on three energy drinks to crack one integration. Q: Is untitled.stream compat actually working now? A: Meaningfully further along after this session, following up from devlog #38’s start on it. Q: Did this go better than devlog #17’s reverse-engineering disaster? A: Yes — hard and slow, but productive this time rather than a total dead end. Q: What was the Spotify polling issue specifically? A: Library state getting out of sync too easily — more frequent polling keeps it closer to accurate. Q: Sleep status? A: Same as every other all-nighter devlog. Not great. Worth it this time though. —This is the end*— *end for now, rate limits permitting PIPSQUEAK!!!
Spectralis devlog #40 —Hello again proggers— 10 straight hours, and the highlight is getting tricked by Suno’s own scraper path. There was a decoy path that looked exactly like the real music endpoint, and it just returned forbidden the whole time. Maybe I’m the bot in this scenario. Unclear. got outsmarted by a decoy URL, humbling Cat or dog? 403 Forbidden Okay let’s get into it~ —Yap— Continuing the reverse-engineering grind from devlog #39, Suno specifically threw a curveball this round. Beyond that, spent real time thinking about what the app actually is and why certain features exist, plus started tearing into Song Wars, which has apparently been quietly buggy for a while. —The Great Suffering— 1 — The Suno Decoy Path Suno provides a path that looks exactly like the real music endpoint, structurally identical, right down to how it responds at a glance. In reality it just returns forbidden every time. Spent real time thinking this was progress before realizing it was a dead end dressed up as a working one. maybe im the bot 2 — Actually Fixed It, After Testing Once the decoy was identified for what it was, found the real path and got it working properly. Testing it thoroughly this time before calling it done, given how devlog #39 went. 3 — Identity Of The App Spent real time thinking through what Spectralis actually is at this point, and justifying why certain features exist rather than just accumulating them because they seemed cool at the time. Less code, more “why does this exist and does it still make sense.” 4 — Song Wars Rework, Started Started tearing into Song Wars, which turns out to be hella buggy underneath. Early stages of a rework rather than a patch job, since patching individual bugs in it hasn’t been holding up. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one who got fooled by a decoy API path for a while. Q: Was the Suno issue related to the S3 discovery from devlog #38? A: Same general integration, different specific obstacle this round. Q: Is Song Wars getting a full rewrite or just fixes? A: Leaning toward a real rework rather than more patches, given how buggy it’s turned out to be. Q: What does “identity of the app” work actually produce? A: Not code directly — more a filter for which features actually belong and why, going forward. Q: How’s the 10 hour grind treating you? A: Productive despite the decoy detour. Real progress by the end of it. —This is the end*— *end for now, decoy paths permitting PAP!!!
Spectralis devlog #41 —Hello again proggers— Podcast mode’s in the works, with a real new way to actually find saved podcasts instead of digging for them. Also fixed the randomizing tools so they actually help pick a song instead of just existing decoratively. And: class got canceled for a hurricane watch, so tonight’s an all-nighter by default. free 10 hours courtesy of a hurricane, weird way to get them Cat or dog? shuffle(weighted=True) Okay let’s get into it~ —Yap— Two real features this round plus a forced schedule change. Podcast mode’s genuinely new territory for the app, the randomizer fix is a smaller but meaningful UX improvement, and the hurricane watch just handed over a full night that wasn’t originally planned for grinding. —The Great Suffering— 1 — Podcast Mode, In Progress Building out actual podcast support, including a new way to locate saved podcasts rather than just treating them like any other track and hoping they surface in the right place. Real new territory for the app compared to the music-first feature set so far. 2 — Randomizing Tools, Actually Useful Now The shuffle/randomizer tools existed before but weren’t really doing anything meaningful — mostly there in name. Fixed so they actually aid in song selection now instead of just sitting there as a checkbox nobody trusted. a randomizer that doesn’t actually help you pick anything is just decoration 3 — The Hurricane Watch Situation Class got canceled due to a hurricane watch, which means tonight’s turning into a full grind session that wasn’t originally on the calendar. Silver lining of a weather delay, I suppose. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one getting a bonus grind night courtesy of a hurricane watch. Q: Is podcast mode close to done? A: In progress, this devlog’s the early build phase, not the finish line. Q: What was actually wrong with the randomizer before? A: It existed but didn’t meaningfully help pick songs — more decorative than functional. Fixed to actually aid selection now. Q: Is Song Wars rework from devlog #40 still going? A: Ongoing, this devlog’s focus shifted to podcast mode and the randomizer instead. Q: Stay safe with the hurricane watch, by the way. A: Appreciated. Staying inside, staying coding. —This is the end*— *end for now, hurricane watches permitting POOL!!!
Spectralis devlog #42 —Hello again proggers— Spent this round hardening shared queues, mostly because WebSockets are just genuinely cool and it’s about time they got treated that way in this codebase. a devlog motivated entirely by “websockets are cool” is a valid devlog Cat or dog? ws:// Okay let’s get into it~ —Yap— Shared queues have been functional but not particularly resilient this whole time, riding on shared play’s presence/reactions/queue work from way back in devlog #9. This round was about actually hardening that layer instead of leaving it fragile. —The Great Suffering— 1 — Hardening Shared Queues Went through and shored up a bunch of the underlying bases for shared queues — the stuff that only matters once real connections are dropping, reconnecting, and behaving unpredictably instead of the clean happy-path test case. 2 — Because WebSockets Are Cool Genuinely part of the motivation here. Real-time bidirectional connections are just satisfying to get right, and shared queues are exactly the kind of feature that benefits from taking that layer seriously instead of treating it as plumbing. not every feature needs a dramatic bug story, sometimes it’s just “wanted to do it well” —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one hardening infrastructure purely because it’s fun to get right. Q: Is this related to the shared play work from devlog #9? A: Same general system, this round focused specifically on making the queue layer more resilient. Q: What does “hardening” mean here specifically? A: Making the shared queue behavior hold up better under real conditions — drops, reconnects, timing edge cases — rather than just the clean test path. Q: Any bugs found during this pass? A: Nothing dramatic enough to call out individually, mostly proactive resilience work. Q: What’s next? A: Podcast mode and the randomizer work from devlog #41 are both still ongoing threads. —This is the end*— *end for now, dropped connections permitting P_P!!!
Spectralis devlog #43 —Hello again proggers— [2:47am] okay so. websockets again, more of them, and now the CDN backup is failing too which is great, love that for me. on my 4th coffee at this point, energy drink count is starting to get concerning honestly and I’m not gonna pretend it isn’t. pretty sure i debugged the cdn thing at 4am purely out of spite Cat or dog? idk man catch (Exception e) { } at this point Okay let’s get into it, or at least try to~ —Yap— so continuing from devlog #42’s websocket hardening, turns out hardening one part just revealed the next part was also fragile, shocking, anyway. need to push something to prod to actually get it working but can’t do that without interrupting infra which is currently live so that’s a whole separate problem I have to solve first before I can solve the actual problem. love layers. —The Great Suffering— 1 — More Websocket Issues more of them. found while poking at the hardening from last devlog. not sure if figuring this part out took 20 minutes or 3 hours honestly, time’s doing something weird tonight. 2 — CDN Backup Is Failing on top of the websocket stuff, cdn backups just started failing too. not connected to each other as far as i can tell but who knows at this point, everything feels connected at 3am. 3 — Need To Push To Prod, Can’t Without Interrupting Infra the actual fix needs to go to prod but pushing it right now means interrupting live infra, which i don’t want to do blind, so now i need a plan for THAT before the real fix even goes out. process problem wrapped around the actual problem, great. 4 — Shared Play Is Doing The AI-Look Thing Again noticed shared play’s UI is drifting into the same generic-AI-looking territory the main site kept getting flagged for back in devlog #21-#24. damn. gonna have to redo that too. not tonight though, one disaster at a time. 5 — Oh And I Found A Missing Semicolon spent a genuinely embarrassing amount of time on a bug that turned out to be a missing semicolon. send help. actually don’t, just let me suffer, i clearly deserve it at this hour. 6 — No Sleep For 2 Days, Hitting Now it’s catching up. hard. luckily got tomorrow off so plan is stay up tongiht finish this, and just completely pass out tomorrow instead. worth it. probably. —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: a human programmer. you. the one reading this at whatever hour you’re reading it, hopefully not also running on 2 days no sleep Q: Is the websocket hardening from #42 actually working? A: mostly? finding more edge cases as i go, which is annoying but also kind of expected honestly Q: Why can’t you just push to prod now? A: because infra’s live and i don’t want to interrupt it blind, need an actual plan for that part first Q: Is shared play getting a full redesign again? A: yeah probably, later though, not adding a 4th fire to tonight Q: Sleep plan? A: none tonight, all of it tomorrow, that’s the whole plan —This is the end — *end for now, semicolons permitting send sleep!!!
Spectralis devlog #44 —Hello again proggers— Did it. Fixed a genuine ton of bugs, following through on the mess from devlog #43. Tempted to just drop 6.1.0 right now, but holding off — want to get a few new features in and brainstorm some more QoL first so this actually feels like a finished product, not just a stopgap. Also: finally going to bed. the bar was “fix the bugs” and I cleared it, going higher anyway Cat or dog? sleep(∞) Okay let’s get into it~ —Yap— Real closure on the websocket/CDN/prod chaos from last devlog. Cleared out a lot in one sitting, and instead of rushing 6.1.0 out the door on relief alone, choosing to actually sit with it a bit longer. —The Great Suffering— 1 — The Bug Backlog, Actually Cleared Worked through the fallout from devlog #43 — websocket issues, the CDN backup failures, all of it — and got a genuine ton of it fixed in one real pass instead of piecemeal patching. 2 — Holding Off On 6.1.0, On Purpose Could ship right now. Choosing not to. Want to work in a few new features and brainstorm more QoL first, so the release feels complete rather than just “the bugs are gone, ship it.” Patience over momentum this time. 3 — Finally Going To Bed After devlog #43’s two-days-no-sleep spiral, actually calling it and going to bed now. Today off is finally getting used the way it was supposed to be used. the sleep debt collector finally caught up —FAQ (no one asked these but they are here)— Q: What is a “progger”? A: A human programmer. You. The one about to get real sleep for the first time in a while. Q: Why not just ship 6.1.0 now if the bugs are fixed? A: Because “bug-free” and “actually done” aren’t the same bar, and this one’s worth clearing the second one too. Q: Was this the same chaos from devlog #43? A: Same fires, all put out this round. Q: What kind of new features are being considered? A: Not locked in yet — that brainstorming is the next step, not this devlog. Q: Sleep status, finally? A: Handled. Going now. —This is the end*— *end for now, actual sleep permitting PLAY!!!
Ships:
Spectralis shiplarp — v5.3.0 —shipped it— Notepads. A spin wheel. Dead zones that aren’t OBS-only anymore. Playlists that don’t look like a log file. Spotify that actually behaves. That’s the version. —what’s in it— Notepad system: docked panel, tabs, pop-out window, saves to track tags Spin wheel: weighted entries, saved wheel lists, notepad-fed Dead zones now shift the app’s own layout, not just OBS overlays Spotify: playlist sync, queue, pause, and Discord presence all fixed Fixed: playlist rows missing RowBackground (looked like a terminal, my bad) Fixed: nav rebuilding the entire view every click Fixed: library load blocking window open on big libraries Fixed: spectrum bars snapping instead of moving (FFT overlap bumped to 75%) Fixed: soundcloud playhead, word-mode timestamp export, track-switch click/pop —that’s it— PICKLE!!!
Spectralis shiplarp 2 — Stardance —wuzzup guys— So much has happened since shiplarp 1 and I cannot wait to not break down what changed. I will. I’m lazy. Not right now though. Cat or dog? redeem_code.claim() —the celebration— We’ve gone through so many changes since last time that it deserves an actual celebration: a very cool, very awesome custom visualizer for Stardance. Claim yours: Help > Manage Visualizers, then redeem stardance-lts-pulp . —found a bug?— Including the dreaded Tim Cook issues — DM me: Discord: @deltav0rtex Slack: deltavortex Can’t wait to hear the feedback and all the bugs you dig up. —this is the end*— *end for now, redeem codes permitting YIPEE!!!...
|
1792878434.706125
|
1793742434.706125
|
|
23703
|
Corranzo by @joedesmos | Stardance
|
joedesmos
|
2
|
337.47
|
326
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T18:08:59Z", "hours": 19.0, "multiplier": 16.55, "payout": 217, "blessing": "neutral", "text": "NEW FEATURES ADDED - Added OMR so that you can just upload a pdf and it will automatically made the midi and mxl/xml file for you! This saves lots of time and allows you to just upload any sheet music you want without the worries of extra steps. Also added a tutorial of how to use the app as well as simplified some the the UI. Lastly, overall just improved the user experience and made things easier to use as well as fixed some bugs. This is Ship #2 as the first ship was more of an MVP while this is a working product now. Website: Corranzo.com", "repo": "https://github.com/joedesmos-co/Corranzo", "demo": "https://corranzo.com"}, {"ship_num": 2, "ts": "2026-06-24T16:42:18Z", "hours": 7.0, "multiplier": 15.92, "payout": 109, "blessing": "neutral", "text": "I made a music app called Corranzo. You can import YOUR OWN sheet music which you can annotate on. This all saves locally to the browser so you can comeback anytime. But, what makes Corranzo be different and stand out is its wait for you mode. You can plug in a midi keyboard or just use the mic on your laptop, phone, etc. and it will help you to learn the piece you want to learn by waiting for you to play the next note(s) in the piece. To activate this you need to upload the sheet music, the mxl/xml, and a midi file of the piece. Along with this, there is also playback mode where you can hear and see your piece in action. Thank you for testing my project!!", "repo": "https://github.com/joedesmos-co/Corranzo", "demo": "https://corranzo.com"}]...
|
[{"post_id": 80805, "ts": "202 [{"post_id": 80805, "ts": "2026-10-18T20:43:23Z", "hours": 48.3214, "text": "working on fixing bugs"}, {"post_id": 78523, "ts": "2026-10-11T02:44:14Z", "hours": 12.3525, "text": "continued to work on a NEW FEATURE super super cool i will talk all about it in the next log. the pictures are kinda boring my bad. idk what else to put"}, {"post_id": 78154, "ts": "2026-10-09T20:12:04Z", "hours": 22.7408, "text": "more behind the scenes stuff. wait for you mode was kinda messed up so fixing that"}, {"post_id": 77556, "ts": "2026-10-07T12:58:16Z", "hours": 23.2825, "text": "new ui fixes and other behind the scenes stuff"}, {"post_id": 75015, "ts": "2026-09-28T21:16:51Z", "hours": 9.2719, "text": "New ui finally done after forever"}, {"post_id": 72161, "ts": "2026-09-22T10:50:41Z", "hours": 20.0517, "text": "More UI stuff and just waiting for the ai to finish training it takes a while"}, {"post_id": 69374, "ts": "2026-09-16T22:31:30Z", "hours": 49.67, "text": "I have been training the ai for 50 hours. it is still not done. I think I need to optimize this thing more lol also working on ui updates and making it look nice while the ai is cooking :)"}, {"post_id": 63373, "ts": "2026-09-07T04:59:38Z", "hours": 9.6072, "text": "Training the AI on 50 ish thousand different scores. Currently making a database of all the scores and turning them into training data then when it is done (soon as you can see in the pic) I will use the dataset to train the AI"}, {"post_id": 61041, "ts": "2026-09-03T19:04:35Z", "hours": 74.1122, "text": "It has been a while but I have been working a long time. So basically I have continued to work on omr and have also worked on some ui things. Omr has now gotta a full ai that looks at scores to generate the practice scene. Also, the visual practice area is now transformed to match the score exactly instead of guessing where the notes are."}, {"post_id": 36674, "ts": "2026-07-28T21:44:52Z", "hours": 10.7281, "text": "MAJOR OMR UPGRADES and a lot of bug fixes and also some ui / ux improvements and just made the app look a lil nicer. Also I realized that I never said what OMR was so basically OMR is short for optical music recognition. So in Corranzo you need to upload a pdf, midi file, and mxl / xml file. The mxl / xml file and midi allow the song to be heard and also the scorefollow and the wait for you mode to work. What OMR does is it allows you to just have a pdf and the OMR will recognize symbols, notation, measures, beats, etc. and make the mxl / xml and midi file for you so all you need is a pdf. It is very challenging to get right and a lot of times it is plain wrong so right now what ive just been doing for around 20 - 30 ish hours of this time is just improving the OMR because its kind of what makes this product real."}, {"post_id": 30319, "ts": "2026-07-17T19:33:59Z", "hours": 10.2422, "text": "I am working on improving OMR and Mic quality I have successfully improved mic quality for checking if you play the correct notes but OMR is proving to be very difficult."}, {"post_id": 24457, "ts": "2026-07-08T01:08:29Z", "hours": 3.2911, "text": "Improved Chord recognition and issues with playing more than 1 note at a time using mic detection."}, {"post_id": 23135, "ts": "2026-07-05T22:15:29Z", "hours": 0.8031, "text": "Added a practice library that includes some songs you can play."}, {"post_id": 23099, "ts": "2026-07-05T20:53:43Z", "hours": 16.9911, "text": "Added guitar to the app. So you can now practice guitar and also practice piano. Also added a visual practice mode now so you can see the notes closer up and it just makes it a lot easier to practice. Also improved the omr and the mic detection for wait for you mode."}, {"post_id": 20143, "ts": "2026-07-01T18:05:59Z", "hours": 15.6933, "text": "NEW FEATURES - Added OMR so that you can just upload a pdf and it will automatically made the midi and mxl/xml file for you! This saves lots of time and allows you to just upload any sheet music you want without the worries of extra steps. Also added a tutorial of how to use the app as well as simplified some the the UI. Lastly, overall just improved the user experience and made things easier to use as well as fixed some bugs. Website: Corranzo.com"}, {"post_id": 16346, "ts": "2026-06-26T16:23:32Z", "hours": 3.0986, "text": "Majorly updated the ui and also improved some of the engines and added a debug feature. Along with this your music if it is rotated or weridly shaped / moved it will auto rotate and fix itself."}, {"post_id": 15138, "ts": "2026-06-24T16:25:08Z", "hours": 6.8275, "text": "I released Corranzo v0.1 as it is now ready for public beta. I have been working on polishing the app and making sure that the score follow works well as before it was a little inaccurate. I would really appreciate people testing it and giving me feedback thank you! Website: https://corranzo.com"}]...
|
Title: Corranzo by @joedesmos | Stardance
Devlogs Title: Corranzo by @joedesmos | Stardance
Devlogs:
I released Corranzo v0.1 as it is now ready for public beta. I have been working on polishing the app and making sure that the score follow works well as before it was a little inaccurate. I would really appreciate people testing it and giving me feedback thank you! Website: https://corranzo.com
Majorly updated the ui and also improved some of the engines and added a debug feature. Along with this your music if it is rotated or weridly shaped / moved it will auto rotate and fix itself.
NEW FEATURES - Added OMR so that you can just upload a pdf and it will automatically made the midi and mxl/xml file for you! This saves lots of time and allows you to just upload any sheet music you want without the worries of extra steps. Also added a tutorial of how to use the app as well as simplified some the the UI. Lastly, overall just improved the user experience and made things easier to use as well as fixed some bugs. Website: Corranzo.com
Added guitar to the app. So you can now practice guitar and also practice piano. Also added a visual practice mode now so you can see the notes closer up and it just makes it a lot easier to practice. Also improved the omr and the mic detection for wait for you mode.
Added a practice library that includes some songs you can play.
Improved Chord recognition and issues with playing more than 1 note at a time using mic detection.
I am working on improving OMR and Mic quality I have successfully improved mic quality for checking if you play the correct notes but OMR is proving to be very difficult.
MAJOR OMR UPGRADES and a lot of bug fixes and also some ui / ux improvements and just made the app look a lil nicer. Also I realized that I never said what OMR was so basically OMR is short for optical music recognition. So in Corranzo you need to upload a pdf, midi file, and mxl / xml file. The mxl / xml file and midi allow the song to be heard and also the scorefollow and the wait for you mode to work. What OMR does is it allows you to just have a pdf and the OMR will recognize symbols, notation, measures, beats, etc. and make the mxl / xml and midi file for you so all you need is a pdf. It is very challenging to get right and a lot of times it is plain wrong so right now what ive just been doing for around 20 - 30 ish hours of this time is just improving the OMR because its kind of what makes this product real.
It has been a while but I have been working a long time. So basically I have continued to work on omr and have also worked on some ui things. Omr has now gotta a full ai that looks at scores to generate the practice scene. Also, the visual practice area is now transformed to match the score exactly instead of guessing where the notes are.
Training the AI on 50 ish thousand different scores. Currently making a database of all the scores and turning them into training data then when it is done (soon as you can see in the pic) I will use the dataset to train the AI
I have been training the ai for 50 hours. it is still not done. I think I need to optimize this thing more lol also working on ui updates and making it look nice while the ai is cooking :)
More UI stuff and just waiting for the ai to finish training it takes a while
New ui finally done after forever
new ui fixes and other behind the scenes stuff
more behind the scenes stuff. wait for you mode was kinda messed up so fixing that
continued to work on a NEW FEATURE super super cool i will talk all about it in the next log. the pictures are kinda boring my bad. idk what else to put
working on fixing bugs
Ships:
I made a music app called Corranzo. You can import YOUR OWN sheet music which you can annotate on. This all saves locally to the browser so you can comeback anytime. But, what makes Corranzo be different and stand out is its wait for you mode. You can plug in a midi keyboard or just use the mic on your laptop, phone, etc. and it will help you to learn the piece you want to learn by waiting for you to play the next note(s) in the piece. To activate this you need to upload the sheet music, the mxl/xml, and a midi file of the piece. Along with this, there is also playback mode where you can hear and see your piece in action. Thank you for testing my project!!
NEW FEATURES ADDED - Added OMR so that you can just upload a pdf and it will automatically made the midi and mxl/xml file for you! This saves lots of time and allows you to just upload any sheet music you want without the worries of extra steps. Also added a tutorial of how to use the app as well as simplified some the the UI. Lastly, overall just improved the user experience and made things easier to use as well as fixed some bugs. This is Ship #2 as the first ship was more of an MVP while this is a working product now. Website: Corranzo.com...
|
1792810390.4009109
|
1792896790.4009109
|
|
14130
|
Immortal Cultivation Mod (修仙) by @m3e660 | Stardan Immortal Cultivation Mod (修仙) by @m3e660 | Stardance...
|
m3e660
|
4
|
345.45
|
3100
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T17:07:11Z", "hours": 76.0, "multiplier": 18.81, "payout": 1254, "blessing": "neutral", "text": "I WANT MY POLAROID GO GEN 3 PLSSSSS I AM JUST A TINY BIT AWAY", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 2, "ts": "2026-08-23T01:53:50Z", "hours": 96.0, "multiplier": 15.99, "payout": 1340, "blessing": "neutral", "text": "I want my VR ahaahahahahah plssss Nothing much to say here just look at the images and video in the previous logs", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 3, "ts": "2026-07-11T00:52:33Z", "hours": 44.0, "multiplier": 18.82, "payout": 297, "blessing": "neutral", "text": "This update adds a huge amount of new content! You can now explore newly added structures, use new spells, control and evolve zombies through the new 怨气 and 控尸 systems, and wear new design accessories. The 金丹 system has also been remade with its own pocket dimension, breakthrough system, and new mechanics. Spell casting has been reworked, flying swords are now fully usable, and a complete forging system lets you craft weapons using materials, molds, purity, and temperature. There are also plenty of new items, crops, effects, and fixes to improve the overall experience!", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 4, "ts": "2026-06-16T02:19:15Z", "hours": 23.0, "multiplier": 10.72, "payout": 209, "blessing": "neutral", "text": "Getting Started The first steps of cultivation. Enlightenment Pill Use an Enlightenment Pill to step from mortal life into Qi Refining. The stat menu shows qi, realm, max health, max age, luck, moral, soul, thoughts, spirit roots, and cultivation progress. Spells Fireball (Lianqi Early, Fire, 10 Qi) Shoots a fireball that deals damage and ignites targets. Lingbeng (Lianqi Late, Thunder, 50 Qi) Enter a breaking-force state. Punch a block or entity to release an explosion. Recasting stacks the explosion radius. Regeneration (Lianqi Middle, Wood, 20 Qi) Restores health with a short healing effect. Beam (Lianqi Early, Light, 30 Qi) Allows you to sense nearby entities. Earth Escape (Lianqi Late, Earth) Sink underground. Move faster while underground. Consumes Qi over time until you surface. Cleanse (Lianqi Early, Water, 10 Qi) Removes harmful effects from yourself. Qi Gathering (Lianqi Early, Wind, 0 Qi) Greatly increases Qi regeneration. You cannot attack or block while active. Damage taken is tripled. Ignite Flare (Lianqi Early, Fire, 10 Qi) Fires a straight flare. Ignites the block it hits. Spirit Sight (Lianqi Early, Light, 5 Qi/sec) Grants night vision while active. Zhenshan Palm (Foundation Establishment Middle, Earth, 130 Qi) Releases a giant hand-shaped earth wave for 3 seconds. Destroys blocks touched by the palm. Light Ball (Foundation Establishment Late, Light, 30 Qi summon, 10 Qi per shot) Summons 6 light balls in a hexagon behind you. Can stack up to 3 rings. Punch to fire one ball. Shift-punch to fire all balls. Each shot deals 50 damage. Each shot can break through up to 24 blocks.", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}]...
|
[{"post_id": 81380, "ts": "202 [{"post_id": 81380, "ts": "2026-10-21T02:39:43Z", "hours": 10.3219, "text": "Devlog #33** A shentong ability:湮灭未尽之人 and a dummy for testing purposes A lot of bug fixing and small thing like better formatting of the gui etc"}, {"post_id": 80679, "ts": "2026-10-18T13:51:12Z", "hours": 8.0572, "text": "Devlog #32 Added new effect in domain like abilities: Lilies, ice, big space warp (don’t yell at this devlog, I wrote it on the phone)"}, {"post_id": 80384, "ts": "2026-10-17T14:03:45Z", "hours": 10.4, "text": "Devlog #31 Added BLAST QI, where you can BLAST YOUR QI in your enemies face and be cool And fix the flying sword thing And fix a whole a lot of fix"}, {"post_id": 79682, "ts": "2026-10-15T01:38:45Z", "hours": 8.0478, "text": "Devlog #30 Remaking the whole life sim system adding new event (making them actually have somewhat of a story) added new battle system and more small thing to better help the experience And ton of bugs"}, {"post_id": 79208, "ts": "2026-10-13T01:21:10Z", "hours": 9.6014, "text": "Devlog #29 Remake all the magic circle texture and automated it (tool here https://m3e66.github.io/xiuxian-circle-generator/ ) Optimize all the code Added new body types 赤炎灵体 — Crimson Flame Body +25% fire damage; burning enemies take 10% extra damage from you 玄冰灵体 — Profound Ice Body +25% ice damage; attacks build Frost, briefly freezing enemies after 5 stacks 紫霄雷体 — Violet Thunder Body +25% lightning damage; every fifth lightning attack summons an extra thunderbolt dealing 50% damage 青木长生体 — Evergreen Longevity Body +15% maximum HP; +25% natural HP regeneration; +10% healing effectiveness 厚土玄体 — Profound Earth Body +20% armor; standing still for 3s grants an additional 10% damage reduction until moving 庚金剑体 — Geng Metal Sword Body +20% sword damage; +10% sword attack speed; sword strikes ignore 10% armor 沧海灵体 — Vast Sea Body +20% water damage; +20% maximum Qi; water spells cost 15% less Qi 逐风灵体 — Windchaser Body +20% movement speed; +15% attack speed; dodging grants +10% damage for 3s 先天道体 — Innate Dao Body +15% cultivation gain; all spells cost 10% less Qi; +5% all elemental damage 无垢灵体 — Immaculate Spirit Body +30% negative-effect resistance; debuffs last 25% less time; +15% healing received 九窍玲珑体 — Nine-Orifice Exquisite Body +25% Qi regeneration; +10% maximum Qi; spell cooldowns reduced by 10% 万毒之体 — Myriad Poison Body Immune to poison; poison attacks deal +25% damage; poisoned enemies restore 1% max Qi when killed 血煞魔体 — Blood Fiend Body +20% melee damage; heal for 5% of melee damage dealt; healing from pills reduced by 20% 不灭金身 — Imperishable Golden Body +15% maximum HP; +15% damage reduction; when HP falls below 20%, gain 30% damage reduction for 5s 吞灵之体 — Spirit-Devouring Body Killing an enemy restores 5% max Qi; attacks against shields and Qi barriers deal +20% damage 荒古圣体 — Ancient Desolate Sacred Body +25% maximum HP; +20% physical damage; +15% armor; Qi regeneration reduced by 15% 太阴神体 — Supreme Yin Divine Body +30% dark and ice damage; +20% Qi regeneration at night; sunlight reduces Qi regeneration by 15% 太阳神体 — Solar Divine Body +30% fire and light damage; immune to burning; +20% HP regeneration in sunlight"}, {"post_id": 78918, "ts": "2026-10-12T01:31:10Z", "hours": 10.5922, "text": "Devlog #28 Added 8 guide books for different part of the mod Added new bear model"}, {"post_id": 78651, "ts": "2026-10-11T05:20:58Z", "hours": 10.4994, "text": "Devlog #27 Improve overall guidance and improve existing model"}, {"post_id": 77981, "ts": "2026-10-09T03:03:43Z", "hours": 9.3439, "text": "Devlog #26 I going to improve the overall survivability of the mod: So there is going to be like more guides book in coming And more item that were creative only now actually getting ways to get the items"}, {"post_id": 76814, "ts": "2026-10-04T17:37:22Z", "hours": 9.2553, "text": "Devlog #25 Add a lot of new weapons A lot of new fire And more clothes"}, {"post_id": 75392, "ts": "2026-09-29T22:21:34Z", "hours": 9.3814, "text": "Devlog #24 121 NEW SPELL ICONSSS MY SOULLLSLLSLSLLS I pick the best 20 icon i love"}, {"post_id": 72892, "ts": "2026-09-23T23:37:48Z", "hours": 10.9486, "text": "Devlog #23 REVISE MOSTLY OF THE VFX AND ADD ALOTTTTT OF DRIP"}, {"post_id": 67505, "ts": "2026-09-13T17:02:49Z", "hours": 8.2731, "text": "Devlog #22 Not much like I said school started, it was more planning and stuff, revised npc battle logic"}, {"post_id": 64408, "ts": "2026-09-08T19:30:48Z", "hours": 15.1625, "text": "Devlog #21 Added whip physics Added new item mechinacs Added straw doll Added a luck system"}, {"post_id": 61873, "ts": "2026-09-05T01:00:25Z", "hours": 12.3611, "text": "Devlog #20 School is starting and college stuff is like piling on so my brain is slowing down, so there isnt much stuff i did when you compare it to the hours in this devlog. Mirror Thingy It is like a shield can absorb some dmg Straw Doll Like a totem of undying Jei Compatibility You can see the forging recipes in Jei now!"}, {"post_id": 59887, "ts": "2026-09-01T21:31:56Z", "hours": 11.3725, "text": "Devlog #19 Some mobs, yea that is really it"}, {"post_id": 59086, "ts": "2026-08-31T18:20:43Z", "hours": 10.5844, "text": "Devlog #18 Working on flying boat or valkyrie skies like things, I dont think that is copyright as it is not the main part of my mod, if it is tell me in the comments thanks Flying Boats Four core tiers control maximum capture size: Low: 100×100×100 Medium: 200×200×200 High: 400×400×400 Sect: 800×800×800 Existing ships can still be minimized into an item and placed again later The lingzhou core GUI is where you manage the ship. It shows the ship’s status, tier, size, fuel/灵气, current pilot, permissions, settings, movement mode, anchor controls, shutdown, and storage Fuel use is based on how many blocks the ship actually has and what it is doing. Hovering uses fuel, while an anchored ship does not The ship helm is used to pilot the lingzhou. While controlling it, the mouse wheel can be used to change the ship’s speed Autopilot lets you enter destination coordinates and have the ship travel toward them automatically Players and other entities move together with the ship. You can walk around the deck, jump, climb stairs, and move around normally while the ship is flying If part of the ship gets disconnected, that section is no longer supported by the lingzhou and falls back into the world as normal blocks Turning off the lingzhou core removes the ship’s magical lift. The ship keeps whatever momentum it already had and begins falling under gravity Etc Fix system prices Fix textures Fix names of items Added JEI compatibility for 鼎 forging Added recipes for a lot of weapons Removed combo system Added a fox beast"}, {"post_id": 55551, "ts": "2026-08-27T14:05:21Z", "hours": 9.8333, "text": "Devlog #17 MORE STRUCTURES i got into the phase of building so more structres!"}, {"post_id": 54475, "ts": "2026-08-25T14:27:13Z", "hours": 8.5392, "text": "Devlog #16 Did some structures, and there is the talisman data like I said Talismans Tier 1 清尘符 — Dust-Cleansing: Extinguishes fire and removes blindness and darkness 微光符 — Dim-Light: Creates light ball for 2–3 minutes, hold while aiming at a block to anchor it, you can use water extinguishes it 敛声符 — Sound-Gathering: For 25 seconds, nearby mobs lose you as their target when more than 2.5 blocks away 火球符 — Fireball: Fires 8 fireballs. Each deals 10 damage in a 2.4 block explosion 风刃符 — Wind-Blade: Fires 3 wind blades dealing 11 damage each and pushing targets backward Tier 2 星火符 — Sparkfire: Fires 5 flames dealing 30 damage each and igniting for 4 seconds 薄金护符 — Thin-Gold Protection: Give shield worth 200 + 1% maximum HP for 15 seconds 缠丝困符 — Spirit-Silk Binding: Fires 6 strands dealing 1 damage each. Strands stack slowness for 5 seconds and 4+ strands nearly immobilize the target 短途神行符 — Short-Journey Divine-Step: Give speed VIII and jump boost III for 30 seconds 传音符 — Voice-Transmission: Sends a written message to another player with in 100 blocks in the same dimension 修复符 — Repair: Repairs the damaged item held in the opposite hand Tier 3 避邪安魂符 — Evil-Warding Soul-Calming: Evil ward for 5 minutes, clears and prevents darkness/nausea, and restores 1% maximum Thoughts each second for 3 minutes 镇扰符 — Disturbance-Suppressing: Hostile mobs within a certain range get slowness II 爆风符 — Blast-Wind: Produces a blast dealing 50 damage, applying daze, and deflecting projectiles 火狱焚邪符 — Evil-Burning Fire-Prison: Creates a 10-block explosion, deals 50 area damage 五雷小伐符 — Lesser Five-Thunder: Deals 40 damage and give slowness III for 1.75 seconds 标记符 — Marking: Permanently marks a entity up to 300 blocks away for owner,and marked mobs are also prevented from naturally despawning 遁空符 — Void-Escape: Teleports in the direction you are looking, normally up to 20 blocks. Repeated uses within 5 seconds lower the maximum to 17, 14, then 12 blocks 化兵符 — Weapon-Manifestation: Creates an owner only temporary sword lasting 25 seconds Tier 4 金光护体符 — Golden-Light Body Protection: Adds a shield worth 600 + 1% maximum HP for 25 seconds 封灵符 — Spirit-Sealing: Seals everyone’s qi within 3 blocks of impact, interrupts casting 破障开山符 — Barrier-Breaking Mountain-Opening: Creates a massive 20-block explosion dealing 500 area damage Tier 5 千里传讯符 — Thousand-Li Message: Long range version of the Voice Transmission Talisman, but it is 1,000 blocks in the same dimension Tier 6 玄焰焚界符 — World-Scorching Black Flame: Creates a black-flame domain that grows from a 5 block radius and deals 100 damage per second. It destroys terrain, consumes dropped items and projectiles, and grows by consuming matter and victims, potentially reaching 48 blocks 五岳辟厄符 — Five-Mountains Calamity-Warding: Grants luck for 10 minutes and stacks three times: +15, then +7, then +3 Ancient 禁空符 — Forbidden-Air: Places a field 24-block radius lasts 8 seconds. It suppresses jumping and flight, and pulls flyingentities downward"}, {"post_id": 52657, "ts": "2026-08-22T22:04:35Z", "hours": 10.8006, "text": "Devlog #15 Uhm a lot of update and unfinished things so it is more of a sneak peek so, there not going to be a long devlog, maybe i am just lazy :). Cosmic Void New dimension that is like space use for mostly travel and battles Talismans A lot I added a lot but it is for later show you guys some pics tho"}, {"post_id": 46112, "ts": "2026-08-13T03:24:25Z", "hours": 11.3525, "text": "Devlog #14 Hmmm why does the picture devlog get more view than the videos, let this be a test then Added: Tutorial System Qi Sensing Thingy Remake Spatial Pouch and like 20 new spells and 4 new method Remake Spatial Pouch Replace the whole backpack like spatial pouch system to a pocket like dimension (in the in the picture) you can place all functionable block and still use it by left clicking it and double click to remove it. (oh and redstone work :) i know there is people that can do smth op with redstone) Tutorial System Full tutorial system that guide you through everything, because so much people said there is a big learning curve, so boom :) Qi Sensing Thingy You can sense entities, items and qi ahhhhh there is not too much stuff or maybe i am too lazy…. definitely not that trust"}, {"post_id": 44036, "ts": "2026-08-09T15:23:44Z", "hours": 11.2058, "text": "Devlog #13 Sooo, did a few entities and most important zhenpan and flags for the magic circle. Zhenpan When empty shift right click to store a magic center When full shift right click to place a magic center back down When store magic center the radius of the magic center is changed to 5 if higher When right click summon a temp magic center of the radius 5 that appear for 20 sec The cost is calculated based on the spirit stones in inventory first then player’s qi Flags Now in the magic center there is a new tab with a gui (in the pics) where you can put flags, they modified the effect of your magic circle. But each newly added flag will increase the cost of the magic center by 1.3x, so the cost can reach to 2693457 qi when using a maxed out zhenpan. Formation Flag Effects Blank Formation Flag — No active effect, used to forge specialized flags Duration Flag — Adds 3 seconds to a temporary Magic Center’s lifetime per flag Amplifier Flag — Adds 1 extra attack whenever an formation triggers Spirit Gathering Flag — Reduces formation fuel/energy consumption by 25% per flag, it does not add the normal ×1.5 flag cost Swift Formation Flag — Makes normal formation effects trigger 30% faster per flag and increases fuel consumption by 30% Qi Return Flag — Restores 10 Qi per flag when a player kills an enemy inside the formation"}, {"post_id": 39851, "ts": "2026-08-03T03:24:18Z", "hours": 12.4425, "text": "Devlog #13 Oops, I got the 8 hours warning and I forgot about it and not I have 12 hours…. sigh. So this update I mainly update the magic ritual mod I have before, and before you ask yes this is the right project, I merge the magic ritual mod with this mod and then revamped the whole thing. This devlog is kinda short because I am getting lazy. Magic Ritual Combo system The Ritual Dagger is your primary tool for creating and managing magic rituals. Right-click with the dagger to open the Magic Circle Selection screen, where you can choose a magic circle type to place at your feet. Shift + Right-click to open the Radius Selection screen, where you can place a Magic Center Block with a chosen radius Attack Red - Grants Strength I Defense Blue - Grants Resistance I Regeneration Green - Grants Regeneration I There are certain pattern for special effect after putting it in its pattern you can punch the center with the dagger and the new magic center is formed Combo visuals and glyph behavior Basic center have one image pattern Combo center have two image pattern If glyph mode is turned off, there is an entering animation"}, {"post_id": 37945, "ts": "2026-07-30T23:57:05Z", "hours": 10.8044, "text": "Devlog #12 A bit in a rush so no video this time, but i added pics so it should be fine. Battle System 战斗状态/Battle Mode: activates when hitting something, or dmg from players, cultivators, or mobs counts too, normally lasts 15 seconds Manual mode: press Y to lock combat mode on until pressed again it can be disabled in settings Normal attacks (left click just normal attack) Heavy attacks (hold attack for 0.5 seconds, then release, normal heavy attacks deal 120% weapon dmg) Blocking (hold left and right click together you dont take dmg, but the weapon loses durability and the blocked dmg harms posture) 架势/Posture: maximum posture is 100 + Physical Attack × 100 + Max HP ÷ 2. It regenerates by 1% each second 破势/Zero Posture: at zero posture, the player is stunned for 1.5 seconds, cannot block, takes 25% more dmg, and loses their current spell charge 外放灵气/External qi: qi injected weapons can release long, straight qi slashes, with the dmg, width, and range scaling with injected qi amount Recent Weapons 精铁枪: A 14 dmg spear normal attacks is like normal, while heavy attacks use a thrust animation and forms a qi cone shaped thingy 铁骨扇: Shift right click switches forms: closed form deals 3 dmg and uses a cone heavy attack and open form deals 5 dmg and uses slash attacks 拂尘: Deals 7 dmg normal attacks is normal too, but its heavy attack spins five times in front of the player, damaging everything within 3 blocks. Right click binds a physically weaker target within 5 blocks for 3 seconds, with a 10 second cooldown 飞刀: Deals 4 dmg and you can stack 5 more all together into one. Right click throws normally and heavy attacks throw a faster knife that can break five blocks before exploding. 飞针 and 袖箭: 飞针 deals 4 dmg, has 1,000 durability, and consumes 10 durability per shot. 袖箭 can be held or equipped in a back accessory slot. Normal attacks fire ordinary needles but heavy attacks fire qi powered explosive needles Etc Added more English Remake some gui Remake some models"}, {"post_id": 35415, "ts": "2026-07-26T20:10:28Z", "hours": 11.2708, "text": "Devlog #11 Sorry for the quality of the video, the quality had to be sacrifice for the length I have formed a habit of writing random thoughts I had, so here is more: wow I kinda hate the 10 hours devlog maybe it is because I am working on a big update orrrr I am just too lazy Revamp Update (plus other stuff (it is more of a random update)): More quest for all of the identity Giving a use for the jindan quality Added 烬火心燎 (mental attack kinda) Added 碎轨星陨 (big boom) Added 洞天借灵 (restore alot of qi) Added 时序迟流 (time slow zone) Added a soul system (when npc or player die there are a soul) Added 炼神术 (increase thoughts stat) Added DunWu Stele (can be used to crave spells into it so for spells like 炼神术 that have no spell item you can learn it like this) Added 噬魂幡 (cool stuff too much so just watch the video) Added 怨魂瓶 (used to store soul) New identity 邪修 功法 improvement (when use qi there is new particle effects) Etc (gui update and others) Config There is a new config button: Auto inject qi into weapon Outside qi (when in new battle system when swing your weapon it shoot out qi slash breaking blocks and killing enemies) New battle system Jindan creative flight New Puzzle Update 灵枢算盘 (the minigame to crave 禁制) it is use to upgrade weapons and eventually evolving it 灵脉六角阵 (the minigame that the player encounters when breaking through jindan) 灵气轨迹 (the minigame when learning spells) 雷劫 (Heavenly Tribulation for jindan) Strike 1 — A thin white-blue bolt 50 dmg Strike 2 — Two branching bolts 100 dmg Strike 3 — Three quick lightning 50 each hit Strike 4 — A thicker blue-white bolt 100 and take 30 dmg per sec for 5 sec Strike 5 — Lightning strikes the ground in eight positions around the player 300 dmg Strike 6 — Several smaller bolts repeatedly strike the player for three seconds 30 each Strike 7 — A massive branching bolt 400 dmg Strike 8 — Purple heavenly lightning 50 dmg per sec for 5 sec Strike 9 — Four bolts strike the north, south, east, and west sides of the player, followed by one direct central strike 400 dmg Strike 10 — A continuous pillar of lightning 100 per 3 sec Strike 11 — Golden lightning begins appearing inside the storm, six golden-white bolts rapidly strike around and directly onto the player 80 each Strike 12 — A giant bolt splits into twelve branches before all branches converge on the player’s position 300 dmg Strike 13 — Lightning repeatedly strikes the player 50 each Strike 14 — A ring of lightning forms in the clouds and releases a rain of dozens of smaller lightning bolts 50 per 3 sec Strike 15 — Nine rapid strikes hit the player in succession 2/4/8/16/32/64/128/256/512 Strike 16 — Every lightning arc inside the clouds gathers into one enormous golden-white tribulation bolt 1000 dmg Easy Mode Acheivement “You Are Really Bad” Get this when you die 10 times in 20 mins Get a hat curio called “Noob Hat” All puzzle are easier by a level"}, {"post_id": 33331, "ts": "2026-07-23T04:32:21Z", "hours": 12.9683, "text": "Devlog #10 Ok so I have work on more than what is showed in the video but this feature is very big so the smaller thing can be talked about in the later devlog Restriction Enchantment Thingy Update 禁制 replaces normal enchantment levels for weapons and artifacts. Every artifact can contain multiple Restriction Layers: 1重禁制 2重禁制 3重禁制 …… 36重禁制 72重禁制 Each successfully engraved layer improves the weapon. Higher layers become progressively harder, more expensive, and more dangerous to refine. After reaching 72重禁制, the weapon can evolve into the next level Rules Controls Click a row to select its node. Click to the left or right of the bead, or use the < and > buttons, to move it. Use W/S or the Up/Down Arrow keys to change the selected node. Use A/D or the Left/Right Arrow keys to move the selected bead. Each bead has a Qi value ranging from 0 to 6 . The golden diamond shows the target value. When every node matches its target value at the same time, the formation is completed and all selected Restrictions are engraved onto the artifact. Moving one bead may also affect linked nodes. Nodes Types Normal Node A standard node that can be moved directly. The node turns gold when its value matches its target. Forward Golden Formation Line Linked beads move in the same direction. For example, moving one bead to the right also moves the connected bead to the right. Reversed Cyan Formation Line A cyan formation line marked with a “−” symbol. Linked beads move in opposite directions. For example, moving one bead to the right moves the connected bead to the left. Locked Node A gray node that cannot be moved directly. The player must move connected nodes to push it into the correct position. Locked nodes begin appearing from a total of 46 Restriction layers . Unstable Node A pulsating red-jade bead. It moves automatically after its displayed action interval and may also affect linked nodes. Unstable nodes begin appearing from Restriction layer 55 . Hidden Node Its target value is displayed as “?” The player must determine the correct target by observing the formation’s behavior or by using a hint. Hidden targets and move limits begin appearing from Restriction layer 73 ."}, {"post_id": 31014, "ts": "2026-07-19T02:14:35Z", "hours": 3.8225, "text": "Devlog #9 Ok so after some ratings and feedbacks I have decided to write better devlogs with more explaining and thoughts. Update: NPC I was working on npc on the last update and decided to further more finish this feature with adding a nice feature of … IDENTITY All Npc will all spawn with a random identity 散修 - Rogue Cultivator 剑修 - Sword Cultivator 刀修 - Saber Cultivator 魔修 - Demonic Cultivator 器修 - Artifact Cultivator 尸修 - Corpse Cultivator 世家子弟 - Noble Clan Disciple 皇族 - Royalty 通缉犯 - Wanted Criminal 体修 - Body Cultivator (Yes I actually added translation for chinese things now) This identity feature not only completes the Npc’s personality but for each identity they have there own special items (which really helps my mod’s survivability, adding a way to obtain items now) They also have their own personal dialogue based on their identity. Jindan Added a new breakthrough screen for zhuji to jindan, and a new dimension for your own personal jindan (like a new world you can channel 2000 qi in the center and you can build chunks in your own world) (see pics) Plans: I was going to further improve the Npcs but after adding a hole a lot of new items for each identity, I realized that I have a other system and features I didnt make (pill making system and more higher level spells)"}, {"post_id": 28609, "ts": "2026-07-14T23:19:52Z", "hours": 11.3969, "text": "New NPC Update The NPC system has been expanded into a full cultivation-style character system. NPCs now have random names, gender, identity, cultivation realm, attributes, spiritual roots, methods, spells, personality, inventory, relationship values, and persistent memory-style data. NPCs can now behave differently depending on personality, identity and relationship with the player. They can fight, flee, use spells, heal, trade, give quests, spar, and interact through a new dialogue screen. (PS the gui shown in the pic is only temporay) Major additions include: Talk, Interact, Trade, Quest, Teach/Learn, Inventory, About, Spar, Invite to Sect, Master/Disciple, and Dao Companion. Relationship stats: friendship, trust, affection, hatred Social actions like praise, joke, insult, threaten, and gifting NPCs can follow, stay, join sects, become master/disciple, or become Dao Companion if requirements are met. New NPC identities were added, with identity-based starting items and loot: 散修 剑修 刀修 魔修 器修 尸修 世家子弟 皇族 通缉犯 体修"}, {"post_id": 26263, "ts": "2026-07-10T23:12:53Z", "hours": 37.7453, "text": "Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure When real death occur spawn a corpse of the player containing all the data of the past player Added attribute 怨气 to all zombie and corpse The longer they exist in the world higher the 怨气 attribute (1000 tick is one 怨气) When right click a zombie with a 镇尸符 stop them from moving When right click a corpse the corpse will stand up with the arm straight up like a zombie add exact 镇尸符 sprite on the corpse face and the corpse stop moving Right click them with a empty hand to take the 镇尸符 off 镇魂铃 when right click will heal 5% of the max hp of your zombie a 5 block radius cooldown 2 seconds 引魂锣 when holding will have a red point only visible to the player and when right click on a block your zombie will jump to that block and if punch a entity the zombie will attack the entity The range of the red particle laser is based on the player’s block reach Added 控尸术 Types of zombie and corpse 怨气 = 100; 白僵 怨气 = 500; 黑僵 怨气 = 2,500; 跳僵 怨气 = 12,500; 飞僵 怨气 = 62,500; 游尸 怨气 = 312,500; 伏尸 怨气 = 1,562,500; 不化骨 怨气 = 7,812,500; 旱魃 When right clicking a zombie with blood they can drink it and give +1 怨气 After getting to 1000 怨气 cant consume anymore Shift right click to feed all of blood in the hand Different modes for zombies attack all hostile (in 5 block radius) defensive (attack all mob that attack owner) Added coffin item, shift right click to store a zombie Added 道服 Added a 血晶, crafted by 9 blood, can feed to all zombie and corpse in all levels, each one is +5 Added Curios slots hair, hair accessory, head accessory, neck accessory, inner clothes, cloak, back accessory, waist accessory Moved coffin to back accessory support, including Curios rendering Added blindfold, blindfold2, straw hat, jade pendant, zhenhun bell, and yinhun gong as wearable accessories Added inventory sprites for accessories and fixed missing textures/positioning Made waist tools cycle with V while held/equipped Added jade pendant meditation speed bonus and tooltip Added 道服 chestplate and worked through texture/model binding fixes Added 血晶 from 9 blood, with zombie/corpse feeding support Added custom spawn egg textures where needed Added/updated English and Chinese translations for missing content Added Jindan dimension entry from stat menu Added 金丹 entity in the Jindan world and normal-world player clone Added Jindan breakthrough screen Added particle effects during breakthrough Added shift-right-click 金丹 entity to spend qi and replicate overworld chunks into the Jindan world Reworked spell selection GUI Added spell wheel ordering and remembered toggles Added selected-spell + R cast flow with charging bar Added/updated several spell scaling effects and combo casting behavior Added flying sword weapon/entity logic Added release, recall, control, shoot, ride, and pickup behavior Added qi cost for controlling/shooting Added flying sword FX when shooting Added zombie/corpse grudge progression and ranks Added higher-rank zombie effects like 尸毒, flying, 阴气 area, drought/dry area Added 鼎 forging GUI with temperature bar, material slots, 玉简 slot, result slot, progress bar, and start button Added forging recipes through 玉简, including 飞剑玉简 and 精铁刀玉简 Added mold items: 剑胚, 刀胚, 枪胚, 武器胚 Added weapon materials Added material purity system and tooltip display Added forging temperature/quality logic, average temp/purity tracking, and failure still producing a mold Added tempering by dropping mold into water, with smoke particles Added 灵火 support from Ignite Flare and normal fire support Added blockgen fixes and custom geo block rendering fixes Added forging system: 玉简, materials, temperature GUI, molds, quality/purity/tooltips Added new crops/items like 糯米 seed/plant, 糯米粥, 墨斗线, 桃木剑, 铜钱剑"}, {"post_id": 12339, "ts": "2026-06-20T03:56:26Z", "hours": 0.4739, "text": "There was more than 4 pictures in the post below so here is the others After use a spell one time +1 proficiency Spell proficiency 入门:after learning the spell get to this level 小成:100 need to get to this level 大成: 500 need to get to this level 圆满:1000 need to get to this level 登峰造极:10000 need to get to this level"}, {"post_id": 12304, "ts": "2026-06-20T02:31:23Z", "hours": 5.2906, "text": "Custom combo system (Where you can make your own custom combo system) Add a zhuji level entity (with its own ai) zhuji1 logic when qi low and enemy 15 blocks away use qi gathering when hp low use regeneration when enemy 10 blocks away use fireball when enemy 5 or lower blocks away use lingbeng and punch them, if qi and hp are all 75 percent or higher then can choose to use lingbeng more time before punch when hp low use wind step to run away when enemy 11 block or higher away and hp high, use wind step to chase the enemy Add a jindan level entity (with its own ai) jidan1 logic same spells as zhuji1 but no lingbeng add a zhenshanplam spell inject qi into weapons keybind v to inject qi into any weapons including modded ones cost 1% of max qi after the injecting the amount of qi injected is add to the tooltip of the weapon amount of qi / 10 = the dmg dealt when attack with this weapon after attack use up amount of qi / 10 of the qi in the weapon base dmg of the weapon x 100 = x(the extra qi / 100 ) x 10 = y if the amount of qi in a weapon is bigger then x then weapon -y durability every sec until not overflow Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure"}, {"post_id": 9608, "ts": "2026-06-16T00:23:52Z", "hours": 3.5289, "text": "See the toggle spells list that you toggled In spell selection screen you can press the spell to see description Remake spiritual roots Remade ui"}, {"post_id": 8409, "ts": "2026-06-13T23:43:00Z", "hours": 5.0458, "text": "Added lightning effect for lingbeng Remade ZhenshanPalmEntity Added a passive spell 威压 Change the stats (Hp, Qi, Age, and Progress) Change spell’s cost and damage Added command to modified players stats Removed stat cap Fixed loot tables Added 轮回真决 Added 定身咒 Added 引雷诀 Added 五雷正法 Added 御风诀 Added 吞天魔功"}, {"post_id": 7205, "ts": "2026-06-12T01:03:44Z", "hours": 2.4225, "text": "Look at what your boy cooked up in the lab!!!"}, {"post_id": 6577, "ts": "2026-06-11T01:41:07Z", "hours": 12.0342, "text": "WOW SO MUCH STUFF (look at the pics!!!)"}]...
|
Title: Immortal Cultivation Mod (修仙) by @m3e660 | Title: Immortal Cultivation Mod (修仙) by @m3e660 | Stardance
Devlogs:
WOW SO MUCH STUFF (look at the pics!!!)
Look at what your boy cooked up in the lab!!!
Added lightning effect for lingbeng Remade ZhenshanPalmEntity Added a passive spell 威压 Change the stats (Hp, Qi, Age, and Progress) Change spell’s cost and damage Added command to modified players stats Removed stat cap Fixed loot tables Added 轮回真决 Added 定身咒 Added 引雷诀 Added 五雷正法 Added 御风诀 Added 吞天魔功
See the toggle spells list that you toggled In spell selection screen you can press the spell to see description Remake spiritual roots Remade ui
Custom combo system (Where you can make your own custom combo system) Add a zhuji level entity (with its own ai) zhuji1 logic when qi low and enemy 15 blocks away use qi gathering when hp low use regeneration when enemy 10 blocks away use fireball when enemy 5 or lower blocks away use lingbeng and punch them, if qi and hp are all 75 percent or higher then can choose to use lingbeng more time before punch when hp low use wind step to run away when enemy 11 block or higher away and hp high, use wind step to chase the enemy Add a jindan level entity (with its own ai) jidan1 logic same spells as zhuji1 but no lingbeng add a zhenshanplam spell inject qi into weapons keybind v to inject qi into any weapons including modded ones cost 1% of max qi after the injecting the amount of qi injected is add to the tooltip of the weapon amount of qi / 10 = the dmg dealt when attack with this weapon after attack use up amount of qi / 10 of the qi in the weapon base dmg of the weapon x 100 = x(the extra qi / 100 ) x 10 = y if the amount of qi in a weapon is bigger then x then weapon -y durability every sec until not overflow Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure
There was more than 4 pictures in the post below so here is the others After use a spell one time +1 proficiency Spell proficiency 入门:after learning the spell get to this level 小成:100 need to get to this level 大成: 500 need to get to this level 圆满:1000 need to get to this level 登峰造极:10000 need to get to this level
Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure When real death occur spawn a corpse of the player containing all the data of the past player Added attribute 怨气 to all zombie and corpse The longer they exist in the world higher the 怨气 attribute (1000 tick is one 怨气) When right click a zombie with a 镇尸符 stop them from moving When right click a corpse the corpse will stand up with the arm straight up like a zombie add exact 镇尸符 sprite on the corpse face and the corpse stop moving Right click them with a empty hand to take the 镇尸符 off 镇魂铃 when right click will heal 5% of the max hp of your zombie a 5 block radius cooldown 2 seconds 引魂锣 when holding will have a red point only visible to the player and when right click on a block your zombie will jump to that block and if punch a entity the zombie will attack the entity The range of the red particle laser is based on the player’s block reach Added 控尸术 Types of zombie and corpse 怨气 = 100; 白僵 怨气 = 500; 黑僵 怨气 = 2,500; 跳僵 怨气 = 12,500; 飞僵 怨气 = 62,500; 游尸 怨气 = 312,500; 伏尸 怨气 = 1,562,500; 不化骨 怨气 = 7,812,500; 旱魃 When right clicking a zombie with blood they can drink it and give +1 怨气 After getting to 1000 怨气 cant consume anymore Shift right click to feed all of blood in the hand Different modes for zombies attack all hostile (in 5 block radius) defensive (attack all mob that attack owner) Added coffin item, shift right click to store a zombie Added 道服 Added a 血晶, crafted by 9 blood, can feed to all zombie and corpse in all levels, each one is +5 Added Curios slots hair, hair accessory, head accessory, neck accessory, inner clothes, cloak, back accessory, waist accessory Moved coffin to back accessory support, including Curios rendering Added blindfold, blindfold2, straw hat, jade pendant, zhenhun bell, and yinhun gong as wearable accessories Added inventory sprites for accessories and fixed missing textures/positioning Made waist tools cycle with V while held/equipped Added jade pendant meditation speed bonus and tooltip Added 道服 chestplate and worked through texture/model binding fixes Added 血晶 from 9 blood, with zombie/corpse feeding support Added custom spawn egg textures where needed Added/updated English and Chinese translations for missing content Added Jindan dimension entry from stat menu Added 金丹 entity in the Jindan world and normal-world player clone Added Jindan breakthrough screen Added particle effects during breakthrough Added shift-right-click 金丹 entity to spend qi and replicate overworld chunks into the Jindan world Reworked spell selection GUI Added spell wheel ordering and remembered toggles Added selected-spell + R cast flow with charging bar Added/updated several spell scaling effects and combo casting behavior Added flying sword weapon/entity logic Added release, recall, control, shoot, ride, and pickup behavior Added qi cost for controlling/shooting Added flying sword FX when shooting Added zombie/corpse grudge progression and ranks Added higher-rank zombie effects like 尸毒, flying, 阴气 area, drought/dry area Added 鼎 forging GUI with temperature bar, material slots, 玉简 slot, result slot, progress bar, and start button Added forging recipes through 玉简, including 飞剑玉简 and 精铁刀玉简 Added mold items: 剑胚, 刀胚, 枪胚, 武器胚 Added weapon materials Added material purity system and tooltip display Added forging temperature/quality logic, average temp/purity tracking, and failure still producing a mold Added tempering by dropping mold into water, with smoke particles Added 灵火 support from Ignite Flare and normal fire support Added blockgen fixes and custom geo block rendering fixes Added forging system: 玉简, materials, temperature GUI, molds, quality/purity/tooltips Added new crops/items like 糯米 seed/plant, 糯米粥, 墨斗线, 桃木剑, 铜钱剑
New NPC Update The NPC system has been expanded into a full cultivation-style character system. NPCs now have random names, gender, identity, cultivation realm, attributes, spiritual roots, methods, spells, personality, inventory, relationship values, and persistent memory-style data. NPCs can now behave differently depending on personality, identity and relationship with the player. They can fight, flee, use spells, heal, trade, give quests, spar, and interact through a new dialogue screen. (PS the gui shown in the pic is only temporay) Major additions include: Talk, Interact, Trade, Quest, Teach/Learn, Inventory, About, Spar, Invite to Sect, Master/Disciple, and Dao Companion. Relationship stats: friendship, trust, affection, hatred Social actions like praise, joke, insult, threaten, and gifting NPCs can follow, stay, join sects, become master/disciple, or become Dao Companion if requirements are met. New NPC identities were added, with identity-based starting items and loot: 散修 剑修 刀修 魔修 器修 尸修 世家子弟 皇族 通缉犯 体修
Devlog #9 Ok so after some ratings and feedbacks I have decided to write better devlogs with more explaining and thoughts. Update: NPC I was working on npc on the last update and decided to further more finish this feature with adding a nice feature of … IDENTITY All Npc will all spawn with a random identity 散修 - Rogue Cultivator 剑修 - Sword Cultivator 刀修 - Saber Cultivator 魔修 - Demonic Cultivator 器修 - Artifact Cultivator 尸修 - Corpse Cultivator 世家子弟 - Noble Clan Disciple 皇族 - Royalty 通缉犯 - Wanted Criminal 体修 - Body Cultivator (Yes I actually added translation for chinese things now) This identity feature not only completes the Npc’s personality but for each identity they have there own special items (which really helps my mod’s survivability, adding a way to obtain items now) They also have their own personal dialogue based on their identity. Jindan Added a new breakthrough screen for zhuji to jindan, and a new dimension for your own personal jindan (like a new world you can channel 2000 qi in the center and you can build chunks in your own world) (see pics) Plans: I was going to further improve the Npcs but after adding a hole a lot of new items for each identity, I realized that I have a other system and features I didnt make (pill making system and more higher level spells)
Devlog #10 Ok so I have work on more than what is showed in the video but this feature is very big so the smaller thing can be talked about in the later devlog Restriction Enchantment Thingy Update 禁制 replaces normal enchantment levels for weapons and artifacts. Every artifact can contain multiple Restriction Layers: 1重禁制 2重禁制 3重禁制 …… 36重禁制 72重禁制 Each successfully engraved layer improves the weapon. Higher layers become progressively harder, more expensive, and more dangerous to refine. After reaching 72重禁制, the weapon can evolve into the next level Rules Controls Click a row to select its node. Click to the left or right of the bead, or use the < and > buttons, to move it. Use W/S or the Up/Down Arrow keys to change the selected node. Use A/D or the Left/Right Arrow keys to move the selected bead. Each bead has a Qi value ranging from 0 to 6 . The golden diamond shows the target value. When every node matches its target value at the same time, the formation is completed and all selected Restrictions are engraved onto the artifact. Moving one bead may also affect linked nodes. Nodes Types Normal Node A standard node that can be moved directly. The node turns gold when its value matches its target. Forward Golden Formation Line Linked beads move in the same direction. For example, moving one bead to the right also moves the connected bead to the right. Reversed Cyan Formation Line A cyan formation line marked with a “−” symbol. Linked beads move in opposite directions. For example, moving one bead to the right moves the connected bead to the left. Locked Node A gray node that cannot be moved directly. The player must move connected nodes to push it into the correct position. Locked nodes begin appearing from a total of 46 Restriction layers . Unstable Node A pulsating red-jade bead. It moves automatically after its displayed action interval and may also affect linked nodes. Unstable nodes begin appearing from Restriction layer 55 . Hidden Node Its target value is displayed as “?” The player must determine the correct target by observing the formation’s behavior or by using a hint. Hidden targets and move limits begin appearing from Restriction layer 73 .
Devlog #11 Sorry for the quality of the video, the quality had to be sacrifice for the length I have formed a habit of writing random thoughts I had, so here is more: wow I kinda hate the 10 hours devlog maybe it is because I am working on a big update orrrr I am just too lazy Revamp Update (plus other stuff (it is more of a random update)): More quest for all of the identity Giving a use for the jindan quality Added 烬火心燎 (mental attack kinda) Added 碎轨星陨 (big boom) Added 洞天借灵 (restore alot of qi) Added 时序迟流 (time slow zone) Added a soul system (when npc or player die there are a soul) Added 炼神术 (increase thoughts stat) Added DunWu Stele (can be used to crave spells into it so for spells like 炼神术 that have no spell item you can learn it like this) Added 噬魂幡 (cool stuff too much so just watch the video) Added 怨魂瓶 (used to store soul) New identity 邪修 功法 improvement (when use qi there is new particle effects) Etc (gui update and others) Config There is a new config button: Auto inject qi into weapon Outside qi (when in new battle system when swing your weapon it shoot out qi slash breaking blocks and killing enemies) New battle system Jindan creative flight New Puzzle Update 灵枢算盘 (the minigame to crave 禁制) it is use to upgrade weapons and eventually evolving it 灵脉六角阵 (the minigame that the player encounters when breaking through jindan) 灵气轨迹 (the minigame when learning spells) 雷劫 (Heavenly Tribulation for jindan) Strike 1 — A thin white-blue bolt 50 dmg Strike 2 — Two branching bolts 100 dmg Strike 3 — Three quick lightning 50 each hit Strike 4 — A thicker blue-white bolt 100 and take 30 dmg per sec for 5 sec Strike 5 — Lightning strikes the ground in eight positions around the player 300 dmg Strike 6 — Several smaller bolts repeatedly strike the player for three seconds 30 each Strike 7 — A massive branching bolt 400 dmg Strike 8 — Purple heavenly lightning 50 dmg per sec for 5 sec Strike 9 — Four bolts strike the north, south, east, and west sides of the player, followed by one direct central strike 400 dmg Strike 10 — A continuous pillar of lightning 100 per 3 sec Strike 11 — Golden lightning begins appearing inside the storm, six golden-white bolts rapidly strike around and directly onto the player 80 each Strike 12 — A giant bolt splits into twelve branches before all branches converge on the player’s position 300 dmg Strike 13 — Lightning repeatedly strikes the player 50 each Strike 14 — A ring of lightning forms in the clouds and releases a rain of dozens of smaller lightning bolts 50 per 3 sec Strike 15 — Nine rapid strikes hit the player in succession 2/4/8/16/32/64/128/256/512 Strike 16 — Every lightning arc inside the clouds gathers into one enormous golden-white tribulation bolt 1000 dmg Easy Mode Acheivement “You Are Really Bad” Get this when you die 10 times in 20 mins Get a hat curio called “Noob Hat” All puzzle are easier by a level
Devlog #12 A bit in a rush so no video this time, but i added pics so it should be fine. Battle System 战斗状态/Battle Mode: activates when hitting something, or dmg from players, cultivators, or mobs counts too, normally lasts 15 seconds Manual mode: press Y to lock combat mode on until pressed again it can be disabled in settings Normal attacks (left click just normal attack) Heavy attacks (hold attack for 0.5 seconds, then release, normal heavy attacks deal 120% weapon dmg) Blocking (hold left and right click together you dont take dmg, but the weapon loses durability and the blocked dmg harms posture) 架势/Posture: maximum posture is 100 + Physical Attack × 100 + Max HP ÷ 2. It regenerates by 1% each second 破势/Zero Posture: at zero posture, the player is stunned for 1.5 seconds, cannot block, takes 25% more dmg, and loses their current spell charge 外放灵气/External qi: qi injected weapons can release long, straight qi slashes, with the dmg, width, and range scaling with injected qi amount Recent Weapons 精铁枪: A 14 dmg spear normal attacks is like normal, while heavy attacks use a thrust animation and forms a qi cone shaped thingy 铁骨扇: Shift right click switches forms: closed form deals 3 dmg and uses a cone heavy attack and open form deals 5 dmg and uses slash attacks 拂尘: Deals 7 dmg normal attacks is normal too, but its heavy attack spins five times in front of the player, damaging everything within 3 blocks. Right click binds a physically weaker target within 5 blocks for 3 seconds, with a 10 second cooldown 飞刀: Deals 4 dmg and you can stack 5 more all together into one. Right click throws normally and heavy attacks throw a faster knife that can break five blocks before exploding. 飞针 and 袖箭: 飞针 deals 4 dmg, has 1,000 durability, and consumes 10 durability per shot. 袖箭 can be held or equipped in a back accessory slot. Normal attacks fire ordinary needles but heavy attacks fire qi powered explosive needles Etc Added more English Remake some gui Remake some models
Devlog #13 Oops, I got the 8 hours warning and I forgot about it and not I have 12 hours…. sigh. So this update I mainly update the magic ritual mod I have before, and before you ask yes this is the right project, I merge the magic ritual mod with this mod and then revamped the whole thing. This devlog is kinda short because I am getting lazy. Magic Ritual Combo system The Ritual Dagger is your primary tool for creating and managing magic rituals. Right-click with the dagger to open the Magic Circle Selection screen, where you can choose a magic circle type to place at your feet. Shift + Right-click to open the Radius Selection screen, where you can place a Magic Center Block with a chosen radius Attack Red - Grants Strength I Defense Blue - Grants Resistance I Regeneration Green - Grants Regeneration I There are certain pattern for special effect after putting it in its pattern you can punch the center with the dagger and the new magic center is formed Combo visuals and glyph behavior Basic center have one image pattern Combo center have two image pattern If glyph mode is turned off, there is an entering animation
Devlog #13 Sooo, did a few entities and most important zhenpan and flags for the magic circle. Zhenpan When empty shift right click to store a magic center When full shift right click to place a magic center back down When store magic center the radius of the magic center is changed to 5 if higher When right click summon a temp magic center of the radius 5 that appear for 20 sec The cost is calculated based on the spirit stones in inventory first then player’s qi Flags Now in the magic center there is a new tab with a gui (in the pics) where you can put flags, they modified the effect of your magic circle. But each newly added flag will increase the cost of the magic center by 1.3x, so the cost can reach to 2693457 qi when using a maxed out zhenpan. Formation Flag Effects Blank Formation Flag — No active effect, used to forge specialized flags Duration Flag — Adds 3 seconds to a temporary Magic Center’s lifetime per flag Amplifier Flag — Adds 1 extra attack whenever an formation triggers Spirit Gathering Flag — Reduces formation fuel/energy consumption by 25% per flag, it does not add the normal ×1.5 flag cost Swift Formation Flag — Makes normal formation effects trigger 30% faster per flag and increases fuel consumption by 30% Qi Return Flag — Restores 10 Qi per flag when a player kills an enemy inside the formation
Devlog #14 Hmmm why does the picture devlog get more view than the videos, let this be a test then Added: Tutorial System Qi Sensing Thingy Remake Spatial Pouch and like 20 new spells and 4 new method Remake Spatial Pouch Replace the whole backpack like spatial pouch system to a pocket like dimension (in the in the picture) you can place all functionable block and still use it by left clicking it and double click to remove it. (oh and redstone work :) i know there is people that can do smth op with redstone) Tutorial System Full tutorial system that guide you through everything, because so much people said there is a big learning curve, so boom :) Qi Sensing Thingy You can sense entities, items and qi ahhhhh there is not too much stuff or maybe i am too lazy…. definitely not that trust
Devlog #15 Uhm a lot of update and unfinished things so it is more of a sneak peek so, there not going to be a long devlog, maybe i am just lazy :). Cosmic Void New dimension that is like space use for mostly travel and battles Talismans A lot I added a lot but it is for later show you guys some pics tho
Devlog #16 Did some structures, and there is the talisman data like I said Talismans Tier 1 清尘符 — Dust-Cleansing: Extinguishes fire and removes blindness and darkness 微光符 — Dim-Light: Creates light ball for 2–3 minutes, hold while aiming at a block to anchor it, you can use water extinguishes it 敛声符 — Sound-Gathering: For 25 seconds, nearby mobs lose you as their target when more than 2.5 blocks away 火球符 — Fireball: Fires 8 fireballs. Each deals 10 damage in a 2.4 block explosion 风刃符 — Wind-Blade: Fires 3 wind blades dealing 11 damage each and pushing targets backward Tier 2 星火符 — Sparkfire: Fires 5 flames dealing 30 damage each and igniting for 4 seconds 薄金护符 — Thin-Gold Protection: Give shield worth 200 + 1% maximum HP for 15 seconds 缠丝困符 — Spirit-Silk Binding: Fires 6 strands dealing 1 damage each. Strands stack slowness for 5 seconds and 4+ strands nearly immobilize the target 短途神行符 — Short-Journey Divine-Step: Give speed VIII and jump boost III for 30 seconds 传音符 — Voice-Transmission: Sends a written message to another player with in 100 blocks in the same dimension 修复符 — Repair: Repairs the damaged item held in the opposite hand Tier 3 避邪安魂符 — Evil-Warding Soul-Calming: Evil ward for 5 minutes, clears and prevents darkness/nausea, and restores 1% maximum Thoughts each second for 3 minutes 镇扰符 — Disturbance-Suppressing: Hostile mobs within a certain range get slowness II 爆风符 — Blast-Wind: Produces a blast dealing 50 damage, applying daze, and deflecting projectiles 火狱焚邪符 — Evil-Burning Fire-Prison: Creates a 10-block explosion, deals 50 area damage 五雷小伐符 — Lesser Five-Thunder: Deals 40 damage and give slowness III for 1.75 seconds 标记符 — Marking: Permanently marks a entity up to 300 blocks away for owner,and marked mobs are also prevented from naturally despawning 遁空符 — Void-Escape: Teleports in the direction you are looking, normally up to 20 blocks. Repeated uses within 5 seconds lower the maximum to 17, 14, then 12 blocks 化兵符 — Weapon-Manifestation: Creates an owner only temporary sword lasting 25 seconds Tier 4 金光护体符 — Golden-Light Body Protection: Adds a shield worth 600 + 1% maximum HP for 25 seconds 封灵符 — Spirit-Sealing: Seals everyone’s qi within 3 blocks of impact, interrupts casting 破障开山符 — Barrier-Breaking Mountain-Opening: Creates a massive 20-block explosion dealing 500 area damage Tier 5 千里传讯符 — Thousand-Li Message: Long range version of the Voice Transmission Talisman, but it is 1,000 blocks in the same dimension Tier 6 玄焰焚界符 — World-Scorching Black Flame: Creates a black-flame domain that grows from a 5 block radius and deals 100 damage per second. It destroys terrain, consumes dropped items and projectiles, and grows by consuming matter and victims, potentially reaching 48 blocks 五岳辟厄符 — Five-Mountains Calamity-Warding: Grants luck for 10 minutes and stacks three times: +15, then +7, then +3 Ancient 禁空符 — Forbidden-Air: Places a field 24-block radius lasts 8 seconds. It suppresses jumping and flight, and pulls flyingentities downward
Devlog #17 MORE STRUCTURES i got into the phase of building so more structres!
Devlog #18 Working on flying boat or valkyrie skies like things, I dont think that is copyright as it is not the main part of my mod, if it is tell me in the comments thanks Flying Boats Four core tiers control maximum capture size: Low: 100×100×100 Medium: 200×200×200 High: 400×400×400 Sect: 800×800×800 Existing ships can still be minimized into an item and placed again later The lingzhou core GUI is where you manage the ship. It shows the ship’s status, tier, size, fuel/灵气, current pilot, permissions, settings, movement mode, anchor controls, shutdown, and storage Fuel use is based on how many blocks the ship actually has and what it is doing. Hovering uses fuel, while an anchored ship does not The ship helm is used to pilot the lingzhou. While controlling it, the mouse wheel can be used to change the ship’s speed Autopilot lets you enter destination coordinates and have the ship travel toward them automatically Players and other entities move together with the ship. You can walk around the deck, jump, climb stairs, and move around normally while the ship is flying If part of the ship gets disconnected, that section is no longer supported by the lingzhou and falls back into the world as normal blocks Turning off the lingzhou core removes the ship’s magical lift. The ship keeps whatever momentum it already had and begins falling under gravity Etc Fix system prices Fix textures Fix names of items Added JEI compatibility for 鼎 forging Added recipes for a lot of weapons Removed combo system Added a fox beast
Devlog #19 Some mobs, yea that is really it
Devlog #20 School is starting and college stuff is like piling on so my brain is slowing down, so there isnt much stuff i did when you compare it to the hours in this devlog. Mirror Thingy It is like a shield can absorb some dmg Straw Doll Like a totem of undying Jei Compatibility You can see the forging recipes in Jei now!
Devlog #21 Added whip physics Added new item mechinacs Added straw doll Added a luck system
Devlog #22 Not much like I said school started, it was more planning and stuff, revised npc battle logic
Devlog #23 REVISE MOSTLY OF THE VFX AND ADD ALOTTTTT OF DRIP
Devlog #24 121 NEW SPELL ICONSSS MY SOULLLSLLSLSLLS I pick the best 20 icon i love
Devlog #25 Add a lot of new weapons A lot of new fire And more clothes
Devlog #26 I going to improve the overall survivability of the mod: So there is going to be like more guides book in coming And more item that were creative only now actually getting ways to get the items
Devlog #27 Improve overall guidance and improve existing model
Devlog #28 Added 8 guide books for different part of the mod Added new bear model
Devlog #29 Remake all the magic circle texture and automated it (tool here https://m3e66.github.io/xiuxian-circle-generator/ ) Optimize all the code Added new body types 赤炎灵体 — Crimson Flame Body +25% fire damage; burning enemies take 10% extra damage from you 玄冰灵体 — Profound Ice Body +25% ice damage; attacks build Frost, briefly freezing enemies after 5 stacks 紫霄雷体 — Violet Thunder Body +25% lightning damage; every fifth lightning attack summons an extra thunderbolt dealing 50% damage 青木长生体 — Evergreen Longevity Body +15% maximum HP; +25% natural HP regeneration; +10% healing effectiveness 厚土玄体 — Profound Earth Body +20% armor; standing still for 3s grants an additional 10% damage reduction until moving 庚金剑体 — Geng Metal Sword Body +20% sword damage; +10% sword attack speed; sword strikes ignore 10% armor 沧海灵体 — Vast Sea Body +20% water damage; +20% maximum Qi; water spells cost 15% less Qi 逐风灵体 — Windchaser Body +20% movement speed; +15% attack speed; dodging grants +10% damage for 3s 先天道体 — Innate Dao Body +15% cultivation gain; all spells cost 10% less Qi; +5% all elemental damage 无垢灵体 — Immaculate Spirit Body +30% negative-effect resistance; debuffs last 25% less time; +15% healing received 九窍玲珑体 — Nine-Orifice Exquisite Body +25% Qi regeneration; +10% maximum Qi; spell cooldowns reduced by 10% 万毒之体 — Myriad Poison Body Immune to poison; poison attacks deal +25% damage; poisoned enemies restore 1% max Qi when killed 血煞魔体 — Blood Fiend Body +20% melee damage; heal for 5% of melee damage dealt; healing from pills reduced by 20% 不灭金身 — Imperishable Golden Body +15% maximum HP; +15% damage reduction; when HP falls below 20%, gain 30% damage reduction for 5s 吞灵之体 — Spirit-Devouring Body Killing an enemy restores 5% max Qi; attacks against shields and Qi barriers deal +20% damage 荒古圣体 — Ancient Desolate Sacred Body +25% maximum HP; +20% physical damage; +15% armor; Qi regeneration reduced by 15% 太阴神体 — Supreme Yin Divine Body +30% dark and ice damage; +20% Qi regeneration at night; sunlight reduces Qi regeneration by 15% 太阳神体 — Solar Divine Body +30% fire and light damage; immune to burning; +20% HP regeneration in sunlight
Devlog #30 Remaking the whole life sim system adding new event (making them actually have somewhat of a story) added new battle system and more small thing to better help the experience And ton of bugs
Devlog #31 Added BLAST QI, where you can BLAST YOUR QI in your enemies face and be cool And fix the flying sword thing And fix a whole a lot of fix
Devlog #32 Added new effect in domain like abilities: Lilies, ice, big space warp (don’t yell at this devlog, I wrote it on the phone)
Devlog #33** A shentong ability:湮灭未尽之人 and a dummy for testing purposes A lot of bug fixing and small thing like better formatting of the gui etc
Ships:
Getting Started The first steps of cultivation. Enlightenment Pill Use an Enlightenment Pill to step from mortal life into Qi Refining. The stat menu shows qi, realm, max health, max age, luck, moral, soul, thoughts, spirit roots, and cultivation progress. Spells Fireball (Lianqi Early, Fire, 10 Qi) Shoots a fireball that deals damage and ignites targets. Lingbeng (Lianqi Late, Thunder, 50 Qi) Enter a breaking-force state. Punch a block or entity to release an explosion. Recasting stacks the explosion radius. Regeneration (Lianqi Middle, Wood, 20 Qi) Restores health with a short healing effect. Beam (Lianqi Early, Light, 30 Qi) Allows you to sense nearby entities. Earth Escape (Lianqi Late, Earth) Sink underground. Move faster while underground. Consumes Qi over time until you surface. Cleanse (Lianqi Early, Water, 10 Qi) Removes harmful effects from yourself. Qi Gathering (Lianqi Early, Wind, 0 Qi) Greatly increases Qi regeneration. You cannot attack or block while active. Damage taken is tripled. Ignite Flare (Lianqi Early, Fire, 10 Qi) Fires a straight flare. Ignites the block it hits. Spirit Sight (Lianqi Early, Light, 5 Qi/sec) Grants night vision while active. Zhenshan Palm (Foundation Establishment Middle, Earth, 130 Qi) Releases a giant hand-shaped earth wave for 3 seconds. Destroys blocks touched by the palm. Light Ball (Foundation Establishment Late, Light, 30 Qi summon, 10 Qi per shot) Summons 6 light balls in a hexagon behind you. Can stack up to 3 rings. Punch to fire one ball. Shift-punch to fire all balls. Each shot deals 50 damage. Each shot can break through up to 24 blocks.
This update adds a huge amount of new content! You can now explore newly added structures, use new spells, control and evolve zombies through the new 怨气 and 控尸 systems, and wear new design accessories. The 金丹 system has also been remade with its own pocket dimension, breakthrough system, and new mechanics. Spell casting has been reworked, flying swords are now fully usable, and a complete forging system lets you craft weapons using materials, molds, purity, and temperature. There are also plenty of new items, crops, effects, and fixes to improve the overall experience!
I want my VR ahaahahahahah plssss Nothing much to say here just look at the images and video in the previous logs
I WANT MY POLAROID GO GEN 3 PLSSSSS I AM JUST A TINY BIT AWAY...
|
1792817797.0497022
|
1792904197.0497022
|
|
64308
|
Spiderman Media Pipe Project by @gowripaliwal | St Spiderman Media Pipe Project by @gowripaliwal | Stardance...
|
gowripaliwal
|
0
|
349.79
|
0
|
[]
|
[{"post_id": 71550, "ts": "202 [{"post_id": 71550, "ts": "2026-09-21T01:31:21Z", "hours": 349.7869, "text": "Built the model!"}]...
|
Title: Spiderman Media Pipe Project by @gowripaliw Title: Spiderman Media Pipe Project by @gowripaliwal | Stardance
Devlogs:
Built the model!...
|
1792446665.8446193
|
1793051465.8446193
|
|
50821
|
Emberfall by @janswca | Stardance
|
janswca
|
1
|
349.88
|
959
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-25T02:43:25Z", "hours": 101.0, "multiplier": 11.57, "payout": 959, "blessing": "neutral", "text": "emberfall is a game in a cave like dungeon where you have to find your way out and fight many enimies on the way", "repo": "https://github.com/janirusepa-design/emberfall", "demo": "https://janirusepa-design.github.io/emberfall/"}]...
|
[{"post_id": 65378, "ts": "202 [{"post_id": 65378, "ts": "2026-09-10T14:11:52Z", "hours": 12.3067, "text": "last playtests before shipping it soon, found some more inconsistencies and patched them, and the game is now mostly looking how i want it"}, {"post_id": 64792, "ts": "2026-09-09T13:35:57Z", "hours": 11.1, "text": "Noticed the sides of the screen were just permanently black, which is because the screen is twice as wide as it is tall, and the torch was a circle. Made the light an ellipse so it matches the screen shape. You now see about 14 tiles on either side of you instead of 7, and the top and bottom stay dark. Flaring fills the screen almost exactly, with the corners still falling off. Also made the torch something you can build up. There are four different upgrades now that extend it, so if you keep picking them, you finish the run seeing way more than you started with."}, {"post_id": 64516, "ts": "2026-09-08T23:48:34Z", "hours": 10.7667, "text": "worken on some new ablities and more, comming soon"}, {"post_id": 64182, "ts": "2026-09-08T12:28:17Z", "hours": 11.6667, "text": "Added elites enemy types this time, roughly one a room, with a ring around them so you can spot one coming and a guaranteed drop when it goes down."}, {"post_id": 63936, "ts": "2026-09-08T00:39:33Z", "hours": 10.3667, "text": "Most of the loot is still just numbers going up. 25 of the 29 affixes are a flat percentage, and only four of them do anything, so I want to turn a chunk of those into things with a verb in them, like your torch flaring on a kill or the first hit in a room always critting.After that, giving you a choice of two doors on the boss floors instead of the same 1 to 11 every single run."}, {"post_id": 63568, "ts": "2026-09-07T14:15:41Z", "hours": 8.5514, "text": "worked on some more minor improments so i can really get the best build out for the next ship"}, {"post_id": 63385, "ts": "2026-09-07T05:42:13Z", "hours": 10.4333, "text": "fixed the screen randomly going flat and bright, with no characters on it. Ashglass pickups were being made with a colour that doesn’t exist, which crashed the renderer mid-frame and killed all the lighting, and it looked random because ashglass only drops about one kill in twenty. Also, every floor generates differently instead of ten copies of the same dungeon in different colours, so the Cistern is flooded channels now and the Vault is six huge rooms. You can finally use abilities while flaring, since Shift turns the number row into a 1 to 5, which did nothing the whole time your torch was up. Toned the flare down; it used to light more than the whole screen. Plus the usual: stopped the hitching when you walk into new rooms, chest loot labels stack instead of piling on one spot, the Pyre was secretly two different affixes with the same name, and the help screen no longer lies about how many abilities you get."}, {"post_id": 62958, "ts": "2026-09-06T14:54:55Z", "hours": 13.2667, "text": "Still working right now, come back next devlog, havent finishet yet"}, {"post_id": 62555, "ts": "2026-09-06T00:25:54Z", "hours": 10.1333, "text": "It’s back. After the last batch of improvements, I played through again this morning, and the same glitch that happened a couple of days ago is back. Now, whenever I use my special abilities, the game goes grey, I can’t see my character or any enemies, and even though my attachments register, I can’t really play the game. But nevertheless i have fixed it again. Hopefully this time it stays fixed"}, {"post_id": 62226, "ts": "2026-09-05T14:16:47Z", "hours": 12.9, "text": "Did though playtests of the game and marked down some existing issues, and looked at ways to improve, optimised the code, and started ideating what new mechanics and features to add before shipping it again. In terms of shipping, I’ll probably end up shipping by the end of this week."}, {"post_id": 61849, "ts": "2026-09-04T23:42:12Z", "hours": 13.0667, "text": "worked on more minor things, especially the colours, they all look pretty much the same but I decided to make them more varied as you go throughout your run"}, {"post_id": 61412, "ts": "2026-09-04T09:52:39Z", "hours": 10.9333, "text": "Worked on improving the enemy encounter system. I found lots of glitches in it after making it for the first time. Sometimes, when you fough an enemny it woundnt update here and just many other problems but ive worked a lot the past 2 days working on fixing it and i think now it works, in my playtest, i havent found any more issues wth it. they update onto the list, maye in the future i could work on makeing this layout better i do think it it kind of lacking right now"}, {"post_id": 61160, "ts": "2026-09-03T22:56:03Z", "hours": 18.1333, "text": "worked on more minor things on the game"}, {"post_id": 60574, "ts": "2026-09-03T00:38:25Z", "hours": 10.3333, "text": "Just fixed a major glitch that caused this in the game, where you were stuck in this place and you just coudnt get out of it unless you resrated the game. likely due to the plethora of code changes I made. But this was"}, {"post_id": 60241, "ts": "2026-09-02T14:17:50Z", "hours": 5.1, "text": "Did it finally? Now the game saves to your browser cache. Now, as long as you keep playing in the same browser, you will not lose your progress, supposed to work though github as well but i havent tested that yet"}, {"post_id": 59980, "ts": "2026-09-02T02:04:30Z", "hours": 8.6333, "text": "SPOILERS ABOUT THE END OF THE GAME But i started thinking about what happens after you finsished all 11 floors and then i decided that you would be somone who got stranded on a lsland and fell into a cave and at the end you get the whole backstrory on what happend before the caves basicly you would go to a beacon that you set up and call for help, in not sure about the details just coded and make the draft of the story"}, {"post_id": 59448, "ts": "2026-09-01T09:37:30Z", "hours": 10.4333, "text": "Final floor looks like a whole ritual"}, {"post_id": 59264, "ts": "2026-08-31T23:11:16Z", "hours": 13.1333, "text": "Just finished the new upgrade system"}, {"post_id": 58755, "ts": "2026-08-31T10:00:51Z", "hours": 10.1, "text": "Worked on a list of enemies that you encounter, and as you progress, you will discover more and more. Also, worked on, and revamped the final floor to feel like a complete boss battle, which is more expansive and, for the first time, not as cramped have space to move around. Still to come a new and imporved upgrade system a first draft you can see in the ss here where you can stack up to 5 special abilities which you wil gain by section as you progress"}, {"post_id": 58503, "ts": "2026-08-30T22:45:09Z", "hours": 11.2667, "text": "Ok, the first batch of finished improvements is taking slightly longer than expected. I ran into quite a few issues while coding them, still troubleshooting"}, {"post_id": 58025, "ts": "2026-08-30T11:28:29Z", "hours": 4.4, "text": "Ok, im bout to begin incorporating the first batch of improvements, starting with the chaning the story"}, {"post_id": 57856, "ts": "2026-08-30T05:28:01Z", "hours": 12.5333, "text": "Fixed a bunch of stuff from the feedback, first make the tutorial larger and easier to read and understand, fixed sloppy and laggy mouse movement, increased the scaling, fixed the joystick and also reducsed screenshake when low on embers and getting damgaed added esc menu and a repo licenece also from your feedback im going to try being more detailed with my devlogs when i can. ill be ready to ship again soon, i going to try to find more way to imporve on top of this"}, {"post_id": 57381, "ts": "2026-08-29T14:47:16Z", "hours": 2.4256, "text": "Thanks for all the feedback im still working on incorporating all those changes and more in my game starting with a new and imporved better tutorial so o new players can understand all the controls of the game, how and when to use them"}, {"post_id": 57135, "ts": "2026-08-29T07:33:01Z", "hours": 6.9, "text": "Wored on some minor Improvents to the game"}, {"post_id": 53781, "ts": "2026-08-24T14:04:38Z", "hours": 7.6667, "text": "worked on some cool ememy designs"}, {"post_id": 53418, "ts": "2026-08-23T23:13:31Z", "hours": 10.2, "text": "Added on the totutorial and worked on imrpoving the game"}, {"post_id": 53038, "ts": "2026-08-23T13:01:04Z", "hours": 7.7281, "text": "Worked on adding a tutorial for new players"}, {"post_id": 52734, "ts": "2026-08-23T01:55:19Z", "hours": 19.2667, "text": "this game is almost finished, worked on a cool start screen"}, {"post_id": 52120, "ts": "2026-08-22T06:33:29Z", "hours": 16.6492, "text": "done a lot for the gameplay and mechanics of the game"}, {"post_id": 51665, "ts": "2026-08-21T13:52:37Z", "hours": 9.7667, "text": "Ok im very close to shipping this project, I’ve perfected the start screen, and now I just need to work on improving the gameplay, and then stabilizing and debugging the code"}, {"post_id": 51398, "ts": "2026-08-21T02:17:28Z", "hours": 9.1833, "text": "Made some good progress so far, but i think the code still needs work, and i keep runnning into errors about the game"}, {"post_id": 50862, "ts": "2026-08-20T09:45:14Z", "hours": 7.8786, "text": "I’ve gone pretty far but I’ve realized instead of making one big file for the game, I should just make a collection of files then an index.html file that runs off those ones, then much easier to run and to code"}, {"post_id": 50686, "ts": "2026-08-20T00:18:32Z", "hours": 12.4239, "text": "Just started working on my project put in about 12 hours at once"}, {"post_id": 50049, "ts": "2026-08-19T02:38:54Z", "hours": 0.6119, "text": "Just started working on a game its about being stuck in a cave and using a torch to find your way out and as you try to leave you have to face eminimies that try to attack you still in ideation"}]...
|
Title: Emberfall by @janswca | Stardance
Devlogs: Title: Emberfall by @janswca | Stardance
Devlogs:
Just started working on a game its about being stuck in a cave and using a torch to find your way out and as you try to leave you have to face eminimies that try to attack you still in ideation
Just started working on my project put in about 12 hours at once
I’ve gone pretty far but I’ve realized instead of making one big file for the game, I should just make a collection of files then an index.html file that runs off those ones, then much easier to run and to code
Made some good progress so far, but i think the code still needs work, and i keep runnning into errors about the game
Ok im very close to shipping this project, I’ve perfected the start screen, and now I just need to work on improving the gameplay, and then stabilizing and debugging the code
done a lot for the gameplay and mechanics of the game
this game is almost finished, worked on a cool start screen
Worked on adding a tutorial for new players
Added on the totutorial and worked on imrpoving the game
worked on some cool ememy designs
Wored on some minor Improvents to the game
Thanks for all the feedback im still working on incorporating all those changes and more in my game starting with a new and imporved better tutorial so o new players can understand all the controls of the game, how and when to use them
Fixed a bunch of stuff from the feedback, first make the tutorial larger and easier to read and understand, fixed sloppy and laggy mouse movement, increased the scaling, fixed the joystick and also reducsed screenshake when low on embers and getting damgaed added esc menu and a repo licenece also from your feedback im going to try being more detailed with my devlogs when i can. ill be ready to ship again soon, i going to try to find more way to imporve on top of this
Ok, im bout to begin incorporating the first batch of improvements, starting with the chaning the story
Ok, the first batch of finished improvements is taking slightly longer than expected. I ran into quite a few issues while coding them, still troubleshooting
Worked on a list of enemies that you encounter, and as you progress, you will discover more and more. Also, worked on, and revamped the final floor to feel like a complete boss battle, which is more expansive and, for the first time, not as cramped have space to move around. Still to come a new and imporved upgrade system a first draft you can see in the ss here where you can stack up to 5 special abilities which you wil gain by section as you progress
Just finished the new upgrade system
Final floor looks like a whole ritual
SPOILERS ABOUT THE END OF THE GAME But i started thinking about what happens after you finsished all 11 floors and then i decided that you would be somone who got stranded on a lsland and fell into a cave and at the end you get the whole backstrory on what happend before the caves basicly you would go to a beacon that you set up and call for help, in not sure about the details just coded and make the draft of the story
Did it finally? Now the game saves to your browser cache. Now, as long as you keep playing in the same browser, you will not lose your progress, supposed to work though github as well but i havent tested that yet
Just fixed a major glitch that caused this in the game, where you were stuck in this place and you just coudnt get out of it unless you resrated the game. likely due to the plethora of code changes I made. But this was
worked on more minor things on the game
Worked on improving the enemy encounter system. I found lots of glitches in it after making it for the first time. Sometimes, when you fough an enemny it woundnt update here and just many other problems but ive worked a lot the past 2 days working on fixing it and i think now it works, in my playtest, i havent found any more issues wth it. they update onto the list, maye in the future i could work on makeing this layout better i do think it it kind of lacking right now
worked on more minor things, especially the colours, they all look pretty much the same but I decided to make them more varied as you go throughout your run
Did though playtests of the game and marked down some existing issues, and looked at ways to improve, optimised the code, and started ideating what new mechanics and features to add before shipping it again. In terms of shipping, I’ll probably end up shipping by the end of this week.
It’s back. After the last batch of improvements, I played through again this morning, and the same glitch that happened a couple of days ago is back. Now, whenever I use my special abilities, the game goes grey, I can’t see my character or any enemies, and even though my attachments register, I can’t really play the game. But nevertheless i have fixed it again. Hopefully this time it stays fixed
Still working right now, come back next devlog, havent finishet yet
fixed the screen randomly going flat and bright, with no characters on it. Ashglass pickups were being made with a colour that doesn’t exist, which crashed the renderer mid-frame and killed all the lighting, and it looked random because ashglass only drops about one kill in twenty. Also, every floor generates differently instead of ten copies of the same dungeon in different colours, so the Cistern is flooded channels now and the Vault is six huge rooms. You can finally use abilities while flaring, since Shift turns the number row into a 1 to 5, which did nothing the whole time your torch was up. Toned the flare down; it used to light more than the whole screen. Plus the usual: stopped the hitching when you walk into new rooms, chest loot labels stack instead of piling on one spot, the Pyre was secretly two different affixes with the same name, and the help screen no longer lies about how many abilities you get.
worked on some more minor improments so i can really get the best build out for the next ship
Most of the loot is still just numbers going up. 25 of the 29 affixes are a flat percentage, and only four of them do anything, so I want to turn a chunk of those into things with a verb in them, like your torch flaring on a kill or the first hit in a room always critting.After that, giving you a choice of two doors on the boss floors instead of the same 1 to 11 every single run.
Added elites enemy types this time, roughly one a room, with a ring around them so you can spot one coming and a guaranteed drop when it goes down.
worken on some new ablities and more, comming soon
Noticed the sides of the screen were just permanently black, which is because the screen is twice as wide as it is tall, and the torch was a circle. Made the light an ellipse so it matches the screen shape. You now see about 14 tiles on either side of you instead of 7, and the top and bottom stay dark. Flaring fills the screen almost exactly, with the corners still falling off. Also made the torch something you can build up. There are four different upgrades now that extend it, so if you keep picking them, you finish the run seeing way more than you started with.
last playtests before shipping it soon, found some more inconsistencies and patched them, and the game is now mostly looking how i want it
Ships:
emberfall is a game in a cave like dungeon where you have to find your way out and fight many enimies on the way...
|
1792875220.036621
|
1793739220.036621
|
|
14070
|
Timetable by @omeriadon | Stardance
|
omeriadon
|
2
|
371.91
|
2591
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-24T09:11:11Z", "hours": 233.0, "multiplier": 18.49, "payout": 2143, "blessing": "neutral", "text": "This ship, I completely remade the app to work around accounts, and all the features that come with that I added a server, because it used to just store your timetable in your local storage and that was quite boring honestly creating a server for this has allowed me to add accounts, notifications, live activities, friends, shared events, multiple devices in the same account, and has made the website much easier to make (still in development, thats why the top devlogs are talking about the website not the app) The app now has all of this: Grades, track the score of all of your subjects notifications for each subject you have and your events etc live activity throughout each school day telling you your subjects etc sharing your location, subjects, and more with friends widgets that show your your subjects, upcoming events, and your friends’ schedules lots of administration options to manage pretty much everything, including who else is admin lol full support for siri, shortcuts, spotlight, and apple intelligence a full apple watch app btw i know 350 hours on a timetable app sounds insane (😭) but its because this project has 4 different aspects: swiftui client for iPhone, iPad, and mac swiftui client for apple watch a website client (still in development) the server that handles everything, and the database i promise it does more than just tell you your subjects 🙏", "repo": "https://github.com/omeriadon/Timetable", "demo": "https://testflight.apple.com/join/DDUXPSq3"}, {"ship_num": 2, "ts": "2026-07-15T13:35:31Z", "hours": 94.0, "multiplier": 9.5, "payout": 448, "blessing": "neutral", "text": "So I made a timetable app for my school, super-specialised and for ios, watchos, and macos. its got live activities and notifications to show you current and next subjects throughout the school day, widgets for your weekly schedule, ability to see your friends’ timetables, and server sync. and apple intelligence support!", "repo": "https://github.com/omeriadon/Timetable", "demo": "https://testflight.apple.com/join/DDUXPSq3"}]...
|
[{"post_id": 65346, "ts": "202 [{"post_id": 65346, "ts": "2026-09-10T13:08:58Z", "hours": 8.2983, "text": "Continuing the assorted improvements to the app: Fixed stacked drawers so nested drawer state updates reactively. Reworked the Friends page into shared List, ListSection, ListRow, and Card components. Preserved friend drag-and-drop ordering within the new layout. Improved timetable UX: i fixed the lesson selection in week view correctly aligned the “now” indicator in today view restricted timetable mode navigation to mobile through CSS, cos desktop already has the sidebar improved planner event styling. made the drawer compenent animate in and out, something i lost from the react -> solid migration I also added a reusable event-tag selection row with symbols and selected-state feedback."}, {"post_id": 62745, "ts": "2026-09-06T08:06:14Z", "hours": 5.9261, "text": "As well as migrating to Tanstack, I wanted even more speed, just for fun at this point honestly, so I decided to move to SolidJS from React. Its decently faster while looking similar to react, and it has some syntax stuff that i much prefer over react. this is basically just adding some margin for me to make bad code The end product looks identical so theres not much to show.. apart from the migration, I’ve also been designing the new landing page, which will also use the 3d model thing. the big question is figuring out how to make the 3d markers for each classroom register correctly, because i need to show a pin for each user at the right place, from swiftui, and somehow embed it into a realitykit 3d model. but im sure this use case has been done many times before so i can find something online!"}, {"post_id": 60821, "ts": "2026-09-03T13:24:26Z", "hours": 7.5314, "text": "Im making a 3d model of the school. this is so that i can show a whole literal map of the campus in the app, and then you can see where each user is, in 3d! i could even reexport it for the website, potentially its going to be interactive and everything"}, {"post_id": 59542, "ts": "2026-09-01T12:52:51Z", "hours": 1.2314, "text": "ok so i think i have optimised it as much as i can lol tanstack clearly was a good idea, it just needed some optimisations!"}, {"post_id": 59501, "ts": "2026-09-01T11:30:41Z", "hours": 8.1464, "text": "I did a few things in this devlog, got quite carried away frankly. So I migrated the codebase from Next.js to Tanstack. The reason was that i was seeing a lot of speed concerns, especially on the landing page. it was just lagging so much. i tried it on all my devices on all the browsers and it was there half the time. after a lot of commenting things out i just couldnt find a bug, so now i moved to tanstack. hopefully taht will remove at least some problems. in any case, i got bored of next.js and tanstack is a different framework to play with and make use of!! also, i continued the landing page by adding cards for each item. i don’t really like it right now, but i have established that i need to add these cards, if not in a different UI. The titles of each card are just image-masks, of Apple wallpapers! i went through some archive and picked out the ones i like, and applied a brightness 200% filter, and they look really nice now. after i finish the landing page im gonna work on rehauling the rest of the ui to be more intuitive and actually usable"}, {"post_id": 57354, "ts": "2026-08-29T14:02:16Z", "hours": 2.4136, "text": "I really wanted the first screen for timetable to look really really interesting and unique and instantly recognisable as Timetable, so i made the text instead of a boring white, it now has 3 really nice effects applied: A grain overlay, or noise, which in this case doesn’t make it look paper but looks nice nonetheless Its not flat white, its white at the top and goes to brown at the bottom, more noticeable when you close up. subtle but also nice The “white” isn’t even white. Its a particular white image i had a lot of difficulty in obtaining. it is the third screenshot, the “white” png. Its an .avif , and it uses some HDR-capable color space format something, which on compatible browsers make the timetable text show considerably brighter than everywhere else on your screen, which makes it really pop! i plan on using this effect in other places as well across the landing page to make it just pop a bit more. (the 4th image shows the white pixel showing as 1.25. anything above 1 is hdr.)"}, {"post_id": 57217, "ts": "2026-08-29T10:04:27Z", "hours": 1.4844, "text": "I added a title to the lading site, but as you can see its not just any title. it uses this package called fitty to make the text size up to the full width of the page, and it does indeed look massive. and it also goes under the rectangles of the logo, so its like an apple depth effect you get on iphone lockscreens i found the website really laggy while scrolling somewhere while finishing of the main interactive icon, and i couldnt figure out why after removing everything that could have been gpu intensive (my gpu was spiking to 80% while just scrolling) so after all that my most likely theory is that the lag is just my computer and not the website (or both 😭😭) also when i made that main art, i made the border radii use px units, which made it look quite deformed on smaller screens, since the rectangle’s size is relative to screen width, whereas border radius is constant… so i went and fixed that too"}, {"post_id": 56944, "ts": "2026-08-28T23:37:12Z", "hours": 1.0728, "text": "After much trying to make glass, yet again, i failed. So now im just using blur and these edge effects, and i think it looks nice! theres even a hover eect, as shown in the second screenshot (class details show and the rectangle rotates a bit randomly)"}, {"post_id": 56543, "ts": "2026-08-28T10:38:02Z", "hours": 8.8014, "text": "I started to make the landing page, and i decided, after very much research from other landing sites I’ve seen, that the main item should be an interactive timetable, a version of the app icon. but interactive and glassy. im trying to recreate everything in css but its not looking as smooth and polished as real liquid glass does so ye. im kinda getting close though! I also added a navbar item that just is the link to actually open timetable, and when you hover it shows options to either open the app in testflight or open the web version which just redirects to /login. and its background switches to black when you start scrolling, which will make more sense later. i haven’t really planned the rest of the landing page, and i might remove this entire component if i find a good liquid glass implementation i can use, especially with bouncy animations etc. but yeah. (worst part is i might even just go change the entire app icon in a week so that kinda wastes all this time 😭😭😭)"}, {"post_id": 53528, "ts": "2026-08-24T03:23:23Z", "hours": 5.4669, "text": "I have started using the shared components around the website, and its actually looking pretty nice! most importantly, these components can be changed once and work everywhere and i removed the drawers i was using everywhere, and i also made said drawers wider while i was rehauling the drawers i also kinda broke their animations and i don’t know how to fix it 😭 the whole website looks really basic now, since its obviously using now the shard unstyled components, and i was thinking about the theme and decided maybe it should be unstyled, and only the user’s own events and content etc can have colours."}, {"post_id": 52138, "ts": "2026-08-22T07:15:18Z", "hours": 9.6475, "text": "I think I have finished making all of the shared components I put everything inside accordions to organise the test components Overlays get the same translucency and outline every other component gets I think im happy with how the lists look, finally the option selectors are really really hot!!! The first page I have remade is the About view, which shows this badge if you are on localhost lol i also had to move the contributors up to the server instead of hardcoding them so that both website and app can see it And a really nice little animated gradient thingy for the about view!!"}, {"post_id": 51517, "ts": "2026-08-21T08:53:31Z", "hours": 3.9036, "text": "I have pretty much finished the components, I’m going to now go and add the other shared components and improve them too. then im gonna go through the css files and clear anything that is unused or overcomplicated, and then i can start remaking the website!"}, {"post_id": 51022, "ts": "2026-08-20T14:43:48Z", "hours": 7.9519, "text": "So the previous UI was really ugly, to be honest, so i decided I am oing to scrap half of the design and completely unstyle the entire app while making everything as standardised as possible, by trying to only use reused components as much as possible. So I spent all today stripping out components I didn’t need, then take the surviving components and adjusting them to my use case and making then look as nice as I can. alert dialogs drawers buttons lists section cards switches I have also decided to stop using tailwind because its quite simply messy and much more confusing than just moduled css, so ye"}, {"post_id": 50337, "ts": "2026-08-19T14:34:49Z", "hours": 5.8117, "text": "I’m still working on making the UI look much better, and I’m still figuring out some website stuff like how i should wire up the sidebar tabs as well as having like a nice homepage to advertise everything the app does, which will be a really fun sub-project. Turns out making nice looking lists in react is much harder than it looks, as shown below 😭 one problem is that each symbol has a different aspect ratio so i dont even know how to fit them nicely And unlike swiftui, its raelly raelly hard to stay consistent in your css and to keep using the ui tokens instead of making custom css everywhere. it looks like the website is gonna be harder than the app to make after all 😔 this classes card though, for example, i think its pretty much almost done. i might need a few more borders to make it look glassy and stuff but it looks exactly like the ios version, which is the end goal! And I added the animations to the classes card, again exactly like the iphone app. i also got a vscode extension that shows you all of your unused css classes, i highly recommend getting one and purging your codebase!"}, {"post_id": 50037, "ts": "2026-08-19T02:03:20Z", "hours": 11.0747, "text": "So I’ve made the first version of the website, it’s really insanely buggy and broken, but the ui is there. so have the html good but no i need to really tweak the css to make it look nice, apple-style. i also need to figure out how to make loading states look nice, since unlike the the swiftui app, i can’t cache anything to not show loading state. in the plus side i dont have to deal with offline state, though. the sidebar and the toolbar are finished, and look really nice. the sidebar has an effect (from ipados) that basically reflects the content in a subtle blurred way, to make it feel like glass while not actually rendering anything expensive. The toolbar is just glass buttons + a black fade effect + progressives blur, also tuned to look like ipados. the icon in the sidebar is pretty ugly honestly so i need to replace that with the non-bordered icon. The other problem i am dealing with is that we are planning a complete redesign of the entire swiftui app, and obviously that has to propagate to the website, so any work i do now is kinda gonna be half wasted, depending on what the redesign actually looks like."}, {"post_id": 47872, "ts": "2026-08-16T03:56:44Z", "hours": 0.5908, "text": "And now it scales up and down and stuff!!! I still can’t believe this is just html and css and js 😭 Theres so many parameters to tweak to make it feel right, its so finicky And depending on the size of the glass, you have to change the numbers, its kinda confusing honestly"}, {"post_id": 47804, "ts": "2026-08-16T00:37:23Z", "hours": 0.8556, "text": "Its nice and squishy now! It uses gsap for this as well gsap is a great framework ngl"}, {"post_id": 47523, "ts": "2026-08-15T14:19:10Z", "hours": 4.8103, "text": "Hehehehe I’ve got a working version of liquid glass It uses gsap, which is nice the second image is an earlier version 😭"}, {"post_id": 47363, "ts": "2026-08-15T08:10:22Z", "hours": 1.1444, "text": "The website is alive! I got a screenshot of an iOS26 sidebar, and i am copying it, as you can see. looks nice i think"}, {"post_id": 47332, "ts": "2026-08-15T06:41:25Z", "hours": 2.6325, "text": "Ok so after a bunch of wrestling with nginx and bun and next.js, i have added the website! its at https://timetable.adonis.pt/ and the current api has been moved to https://timetable.adonis.pt/api Its the usual next.js thing. and it uses bun. my design idea for this is to look like its an ipad app, essentially, and im going to see exactly how far i can take the mimicking, maybe i can even add liquid glass to the web 💀 So yeah no more app building, now its website! It’s gonna be so much easier as well because I aleady have the backend done and tested, so this should be all design which will be really fun."}, {"post_id": 46919, "ts": "2026-08-14T13:55:04Z", "hours": 0.3047, "text": "new icons. the old one that now supports light mode was kinda ugly."}, {"post_id": 46909, "ts": "2026-08-14T13:32:29Z", "hours": 7.6422, "text": "A somewhat interesting devlog this time. I spend a good 2 hours just trying to make live activities work. the miserable part is that they were already working before 😭 I dont even know what I did but it broke. And while i was trying to make a debug button to start a live activity, yeah it just wasn’t working. all kinds of problems with not submitting a good APNs token. and i had to like stop activities before starting new ones and stuff it was just in general really annoying. there was even more problems but its too much to say here 😔 anyway, i have started cleaning up the app. no more big features, to be honest, until i add a website for this thing!! should be really easy since the backend is clearly all done lol events can show weather for them, such as the athletics carnival i removed the ridiculous backgrounds i allowed users to choose, theres no only solid black/white and paper. more reasonable, i think. as part of my optimisation, i removed settings i found useless. haptics are now always on, and highlighting the current day is always on. profile pictures can now have their foreground colour set, like the Monogram can have its colour optimised.you can see the average for when your friends arrive to school per day, instead of in total. developer settings also got reorganised, more settings only show to developers. yet again cleaning up the app experience. the location status was a bit unreliable, if users were offline, etc, so i added multiple ways the app pushes updates to the server, and queued statuses when the device was offline. i also refined the actual radius for what counts as within 5 / 10 minutes, should be a bit better. i havent thought about people who live within 10 minutes, thats an interesting case the subject editors grid also looks nicer (still needs more improvement though the tabview now hides while scrolling, like it collapses into the corner, like apple apps! you can manually turn off sharing your status, for privacy reasons. and some more things i forgot 🥹 im so excited for this thing to actually launch!!!!!"}, {"post_id": 46297, "ts": "2026-08-13T13:01:18Z", "hours": 1.3272, "text": "I spent some time to work on this search button and its animation. idk if the video plays, but it uses apples glass effect transitions! I also made the confirmation dialogs for removing and reporting a friend better, before they just popped up in the middle of the screen, now it comes out of the menu (also found another ios27 beta bug 😐)"}, {"post_id": 46263, "ts": "2026-08-13T11:41:36Z", "hours": 2.4739, "text": "So supporting light mode calls for an icon redesign, at least just for light mode, and here they are! Though to be honest, the entire app is gonna need a redesign, because I need to rename it from Timetable, because it has expanded into doing so much more, and timetable is a bit of a boring name. finding names is so insanely annoying though, but oh well."}, {"post_id": 45744, "ts": "2026-08-12T13:04:58Z", "hours": 2.6161, "text": "I added custom backgrounds! Theres the paper backgrounds i added recently, and then the solid colours, and then also some of the really nice apple ones idk what they are called (i hope apple doesnt copyright me 😭) so yeah it applies to all backgrounds in the app i think it merges really nice with the liquid glass and blur backgrounds different views have it also shows on watch i also added an option to choose how far forward you see events. theres also even more statistics for what app version people are using!"}, {"post_id": 45684, "ts": "2026-08-12T10:26:42Z", "hours": 1.3586, "text": "You can now edit the foreground colours for your profile picture monogram i also completed light mode support for widgets"}, {"post_id": 45645, "ts": "2026-08-12T08:44:01Z", "hours": 2.0167, "text": "I added accessibility improvements, mainly like labels and tags and stuff, for use with voice over etc. this was triggered by me installing a developer process into my app which allowed me to iterate on design faster, and it depended on accessibility elements to discover each element. (the purple thing lets you tap elements and comment on them) i also tried a new background for the cards, as you can see below, its just glass and i think it looks pretty nice"}, {"post_id": 45165, "ts": "2026-08-11T14:09:40Z", "hours": 9.5667, "text": "Big update! Light mode! The app used to be dark mode only, it let me make it look much more pixel-perfect and refine colours and stuff, but its kinda obvious you cant keep the app dark mode only, its just not good. so i went through everything, adding light mode versions of paper, text, glass, etc. took me quite a bit of time because i was trying to maintain consistency while doing it, which included alot of redoing things and creating view modifiers and manually applying each one, etc i also added weatherkit, its just a single line in the today tab, but its nice. while adding light mode support, i found a really nice blur view i could add to lists, so now each lists’s background is nothing other than a blur! i also decided to make all backgrounds made out of paper, and i think it looks nice? theres also now a statistics page for deices and os versions and builds and stuff, itll be more useful later. as well as knowing when your friends arrive to school, i added the ability to know when they are within 5 or 10 mins, and to send notifications for that. average arrival also is split by day now, because people arrive to school at different times per day theres a new tab picker, which you can see int eh controls, its much more glassy than the last one, which is really really playful and stuff! i still have more work to do in terms of ui work, excluding light mode refinements, like notifications and widgets, but yeah."}, {"post_id": 43989, "ts": "2026-08-09T14:04:31Z", "hours": 1.73, "text": "I added a new devices statistics view. or more accurately, i expanded it. before, it just shows device platforms. now, it shows the os version, minor os version, and if it is a beta or not. i also added support for iOS 26 (previous builds only supported OS27 or later). this involved me just making some features not work on os26 😐 and supporting anything before OS26 would probably be legitimately impossible, so yeah not that."}, {"post_id": 43936, "ts": "2026-08-09T11:55:31Z", "hours": 1.5656, "text": "I also made some improvements to the card height for the user’s own item. before, it was just the full width. Halfway while I was working on that, my TabView suddenly froze for a straight 20 seconds every time i changed the tab. this was very weird, and the CPU shows 0% usage, so I was quite surprised. After a large round of commenting things out and seeing what broke, I found it was a single .glassEffect() that I was using for the progress marker. I have no idea how a glass effect can make an entire tabview freeze, but fine. i replaced it with a simple red colour, as shown below, with a stroke and shadow, and i think it looks fine now."}, {"post_id": 43850, "ts": "2026-08-09T08:59:50Z", "hours": 1.6619, "text": "there is a new progress background: its not a background! inspired by the app icon / ios app, the progress view is now this marker thingy which fits into the app’s theme much nicer I’ve also been tweaking the font sizing, image sizing, padding, and gaps between the items here to make sure they look good at all possible subejct names etc. i also had to fight a bit with the safe area of the view, you can see in the image below the name “bob” ends slightly above the text, took me a lot longer than expected to fix that"}, {"post_id": 43782, "ts": "2026-08-09T06:43:26Z", "hours": 7.4142, "text": "I started work on rehauling the watchOS app And I really like how it’s coming out The watch is supposed to distill down the information the user needs, so i picked the current and next period, time, and their location. all these elements are glassy and stuff, so they are clickable, and its in a tabview that scrolls between each card. The first tab is the week view for the user. so I spent a good 2 hours trying to make a ScrollView work, but it didnt. sometimes the views teleported, some lagged, some glitched, and it was overall insanely annoying. so I moved to a tabview, which was considerably more stable, but removed the animations I wanted. it had its own animations which were fine, but yeah. Also, fonts also reflect on the watch! the one in the screenshots below is the expanded style, which to be honest isnt that good on watch since the watch is constrained as is, but yeah. The glass timetable actually looks insane I am still thinking of how to include other content, like grades maybe, and other things, but i dont want to make it too dense and slow"}, {"post_id": 43264, "ts": "2026-08-08T12:54:21Z", "hours": 3.6083, "text": "You can now change the font! this took more work than you would expect, because i did a find on the project and saw there were like 60 references to .monospaced, and each one had to be manually upgraded to dynamically apply font. i also tried to make the rounded font expanded, but after some inspection i found it doesnt even have a .expanded variant 😐 so the options i ended up with were monospaced, rounded, and expanded. no normal font. it just looks boring at this point. below is the same screen with each option! widgets also get the fonts, and they look actually insane ngl"}, {"post_id": 43093, "ts": "2026-08-08T05:35:22Z", "hours": 2.4481, "text": "improving the friend detail view the padding is so much nicer, and the detail view also shows more info and in a better way the week subtab shows a similar timetable to the user’s own, and shows more info. and some more statistics lol"}, {"post_id": 42989, "ts": "2026-08-08T00:22:14Z", "hours": 1.9642, "text": "I decided to remove created timetables. they just don’t work anymore with the Friends concept, which makes it really annoying to adjacently share other timetables alongside having friends. its a shame, i wish it could have worked, maybe ill add it again later. oh well. im still just combing through the app and fixing all the little things i see: grade tracker gets a next item in the top for the top 4 subjects, which is important for atar. improved the friend detail view a bit better, because the old one had not enough information and was displaying badly.added more statistics to administration view cos its fun lol the tag selector view was improved, looks nicer and is a tiny bit more legible nowi changed the grade tracker weighting from semester to year. apparently thats the norm more friend detail view improvements"}, {"post_id": 42669, "ts": "2026-08-07T14:52:24Z", "hours": 2.3131, "text": "Grade tracker!!! I know this is a very cliche topic but I had to implement this because it integrates so seamlessly with the app for example, it already knows your subjects (duh) and when you input the date of your assessment, it also knows which period of the day that is, because it knows your subjects! (duh) I also added ATAR, sthe user can set goals and stuff for what they want to achieve."}, {"post_id": 42589, "ts": "2026-08-07T12:33:01Z", "hours": 1.0975, "text": "some ui improvements (that weird box in the account view is Metal debug overlay, not my app)"}, {"post_id": 42549, "ts": "2026-08-07T11:27:09Z", "hours": 5.165, "text": "lots of little things instead of one big feature: i used to send emails, and i reached limits on the email provider so i had to move to only sending notifications, like device notifications. i still need an alternative, im looking through options now there used to be different settings view between iPhone and iPad, so i consolidated them into one view.you can now see your friend’s status as on or off campus. this uses location to check when you reach school or leave. this also allows some cool statistics like average school arrival time!there is better moderation, it shows in the admins view and lets the admin block or do nothing about the account. it will be expanded later to have more features and actions and stuff you can request to change your friends-since tag, also approved by admin.i deleted all (most) references to #if os(macOS) , since there is no more macOS build, its just iPad running on mac. small ui improvements: added search to some more administration views tapping an existing photo pro allows crop the tabview gets tab transitions, like the ones iOS 26 had (that ios27 removed 😡)year-level tags are separated from other tags expanded statistics!added archived events - events in the past - plus an option to automatically delete old events added a button to reset tips, since the app is getting more and more complicated the onboarding is less condensed, when that permission is first needed, its permission sheet request shows.more stuff gets cached in Defaults, making it more offline-safe.and some toolbar and blur and navigation title stuff."}, {"post_id": 41948, "ts": "2026-08-06T14:06:53Z", "hours": 1.2208, "text": "user account data now has highlighted rows for faster navigation user reports look much better, as well as friends-since requests reporting or sending feedback sends notifications instead of emails, now"}, {"post_id": 41911, "ts": "2026-08-06T12:53:26Z", "hours": 4.0961, "text": "Few things! Adminsitration gets new items for reported users and freinds-since requests sections in adminstration statistics for number of users, etc you can now see your status and other people’s status, like on or off campus new page that asks for location access ofc (ill move it into the onboarding later improved the add a friend sheet admins get emails for reported users, etc"}, {"post_id": 41764, "ts": "2026-08-06T04:50:27Z", "hours": 8.5058, "text": "I finished the refactoring for now, to make the app multi platform. So then i did some more brainstorming and I have consolidated what is the next few features I need to do tips, to tell the user about features the app has they sound easy but each tip needs rules and parameters and all kinds of obscure annoying things, so its going to be harder than it looks my first tip shown below An indicator next to each friend about their status, which is going to take the user’s location, taken in the background, to tell if they are on campus or off campus So from this you can tell when a user arrives at school or if they are sick iOS provides a function that will call my app, from the background, every time the user crosses a specific map polygon (The school). so i dont even need to do any map processing, my app just gets called every time the device goes in or out of school! plus i can add cool related features like the user’s average arrival time to school, which will be pretty cool!"}, {"post_id": 40724, "ts": "2026-08-04T13:16:45Z", "hours": 3.6128, "text": "Still just refactoring and remaking the app. i decided to remove OS 26 compatibility, because there is just too many APIs and stuff the images below are some stuff I’ve been refining: dragging friends around sideays iphone support (same thing as macOS + iPadOS) but I’ve decided now to not work on macOS (which is just iPadOS) and ipad until i perfect iphone and watch. should be fun!"}, {"post_id": 40093, "ts": "2026-08-03T14:09:54Z", "hours": 0.6797, "text": "its getting there! mac catalyst is definitely better than trying to make native macOS work. swiftui isnt really making it any better, its really really restrictive in terms of how i can structure my app. like for example that right column, has so many glitches that i cant really find solutions to because the bugs aren’t in my code, its infuriating."}, {"post_id": 40069, "ts": "2026-08-03T13:17:55Z", "hours": 1.1419, "text": "working with macOS is infuriating me, so i decided im going to make the macos app actually be mac catalyst, so its technically just running an ipad app. which makes sense. still needs alot more work, this refactor is proving very very annoying"}, {"post_id": 40036, "ts": "2026-08-03T11:53:01Z", "hours": 1.3019, "text": "first version of timetable for macos 😭 its really ugly and lwk broken. so im gonna spend the next few hours fixing this incredibly “interesting” UI."}, {"post_id": 39979, "ts": "2026-08-03T10:13:36Z", "hours": 3.41, "text": "So so far up to now, I have completely neglected everything other than iPhone. i needed this so that i could focus on making iphone as seamless and intuitive and possible, and to push features faster. so now i have to go and basically remove all of the non-iPhone code and replace it with iphone code, and then try to make that work multiplatform. so i decided iphone is going to remain as a tabview, for now at least, but ipados, macos, and big iphones can use a navigation split view, shown below. so a sidebar and main view and an inspector on the right sometimes."}, {"post_id": 39467, "ts": "2026-08-02T13:08:27Z", "hours": 0.6319, "text": "I checked the localisation and it went down to 25%, so I went and pushed that back up to 100%. and the friend detail view has been improved a bit more"}, {"post_id": 39451, "ts": "2026-08-02T12:29:09Z", "hours": 0.3811, "text": "before and after some small ui improvements!!"}, {"post_id": 39440, "ts": "2026-08-02T12:06:26Z", "hours": 0.6767, "text": "i just read an article that said @Environment(\\.dismiss) is bad for performance dismiss() is a very simple and fast way to make a sheet or other modal view dismiss , but because its so simple and dynamic, that introduces lots of bugs apparently. so I had to go through all the sheets and this time replace dismiss() with better state management. i hope ill notice the performance improvements!"}, {"post_id": 39417, "ts": "2026-08-02T11:25:42Z", "hours": 1.5344, "text": "some people were saying that it was really annoying that you could drag anywhere in a sheet to dismiss the sheet, you would be halfway through something and then you have to restart. so i went through all the sheets in the app and checked if they needed to remove this swiping. luckily it only needed one modifier per sheet. also, more tester feedback was that i shouldnt have sections for tags, so yeah i did that. also, now that there is a concept known as friends, instead of just shared timetables, i removed the option to allow people to have their timetables searched publicly. i havent figured out what i want for specific created timetables, i might lwk have to just remove that also users now have to fill in what year group they are when onboarding. for tags."}, {"post_id": 39252, "ts": "2026-08-02T03:22:29Z", "hours": 3.0194, "text": "friends detail view shows a bit more content, and is redesigned for more paper you can reorder the badges around now for priority when they show in their overlay event tags editor looks a bit nicer plus, users can edit their year group after signing in."}, {"post_id": 38922, "ts": "2026-08-01T14:51:06Z", "hours": 2.6803, "text": "So the header in settings now reflects with your pfp colours for the profile editor, i made it now scrolling so that you could fit in all of the various options, like animation speed and noise and stuff. when you click on a class in today view, it shows some more details about the class like teacher and location. friends view also looks a bit nicer, both the list view and the detail view."}, {"post_id": 38829, "ts": "2026-08-01T12:04:02Z", "hours": 1.9464, "text": "Given the theme of this app, paper, widgets now get paper too! settings for profiles has been updated too you can now select black → white in the colour selector. friend detail view still kinda looks a bit empty and bland, im not quite sure how to make it feel alive"}, {"post_id": 38704, "ts": "2026-08-01T07:32:35Z", "hours": 4.1875, "text": "you can add special badges to people now, for like early birds or something idk. the profile picutre bakground has been upgraded a bit, but im going to have to fork the repo and adjust it myself, its currently not looking like a gradient but a single noisy colour, im gonna fix that."}, {"post_id": 38184, "ts": "2026-07-31T13:32:47Z", "hours": 0.5325, "text": "The bottom colour grid is concentric to the device!!! although making the white outlines also behave nicely is proving really really hard, as you can see below"}, {"post_id": 38170, "ts": "2026-07-31T13:00:49Z", "hours": 3.5731, "text": "I’ve been busy remaking the profile editor, its coming together really nicely. that profile picture at the top is designed so that lets the other components take up their space, and then the pfp takes up the rest of the space. this allows the same view to not scroll while working on different phones and text sizes etc. and the background is animated!!!"}, {"post_id": 37968, "ts": "2026-07-31T01:17:27Z", "hours": 5.3656, "text": "I made this widget, which is kinda like a summary widget for the user. it requires this large widget size to fit everything, and its goign to be more dynamic than the other widget which always show the same layout. i haven’t thought exactly how i’m going to do it though, below is a rough first version."}, {"post_id": 37025, "ts": "2026-07-29T14:32:52Z", "hours": 1.9747, "text": "i added a section in teh administration to be able to turn off the server for everyone except for me, so that i can maintain the server and test it. and also a section to manage other admins."}, {"post_id": 36962, "ts": "2026-07-29T11:55:40Z", "hours": 7.3492, "text": "so me and my friend did some more brainstorming focussing on the new friends tab, and how friend accounts work, and profiles and pfps etc. we also aggregated a list of bugs and UI glitches in the app that still need fixing. the current first version is (moderately) broken 😭"}, {"post_id": 35775, "ts": "2026-07-27T12:45:52Z", "hours": 1.9714, "text": "Me and my friend did a bit of brainstorming, to get ideas on how to improve the app UI, UX and future features. cos we are planning a future release hopefully. so we gained a good idea of consolidating friends into a more clear friends tab, combingin the currently spread-around-everywhere friends stuff."}, {"post_id": 35475, "ts": "2026-07-26T22:47:13Z", "hours": 2.4061, "text": "I made some UX adjsutments in the settings app, added some images, reordered haptics, etc the planner sub-tab has been rehauled, and shows items chronologically instead of in sections, which i thought was more intuitive. it still needs much more thought though, im not sure how to space them out since some gaps are months long."}, {"post_id": 35175, "ts": "2026-07-26T13:01:49Z", "hours": 2.2025, "text": "Theres now brown and white paper combined. its an interesting ui concept, makes no sense in real life, but i think it looks nonetheless! it definitely creates an app theme, regardless of if this theme looks good or not…"}, {"post_id": 35092, "ts": "2026-07-26T09:28:27Z", "hours": 4.1481, "text": "As usual, I did a very assorted bunch of things: new admin tab so that i can change stuff without having to go onto my mac and hardcode stuff today view looks like paper - reminscient of the app icon! new about view the popover for subject details is smaller, removing bloat and a bunch of server improvements due to all of my users finding bugs and stuff!"}, {"post_id": 34919, "ts": "2026-07-26T00:43:54Z", "hours": 4.7894, "text": "I have expanded the home tab!! Theres three tabs at the top, today, week, and upcoming. week is what it already was upcoming shows term dates, no school days, school events, and also the users own personal events they make. the today view is a bit ugly but its sort of there! there also an admin page now, so that i dont have to hardcode term dates etc, i can just send them as api requests (for admin accounts only lol)"}, {"post_id": 34560, "ts": "2026-07-25T11:50:05Z", "hours": 0.755, "text": "Message extension got improved, it now checks if you have enabled sharing before allowing you to even sahre it, and tells"}, {"post_id": 34551, "ts": "2026-07-25T11:04:40Z", "hours": 0.5589, "text": "I’m adding countdowns everywhere, even when school is out, so that you can count the hours until your next period"}, {"post_id": 34537, "ts": "2026-07-25T10:29:10Z", "hours": 0.6072, "text": "This is currently the message extension ui. kinda ugly. that needs fixing I also updated the created timetables detail view, and (ignore the screenshot) removes the save button cos no one is going to remember to press save when they change details, so this should save some frustration."}, {"post_id": 34523, "ts": "2026-07-25T09:48:04Z", "hours": 1.6383, "text": "I improved the UI for this view, to better show classroom and teacher labels. I also renamed “Authored” to “Created”, apparently its better copy, according to my friend. The settings got cleaned up a bit, and importing from calendar again needs confirmation"}, {"post_id": 34495, "ts": "2026-07-25T08:06:40Z", "hours": 1.9119, "text": "I found an xcode bug, something to do with compilation errors for incorrect architecture, i dont get it but i gave apple feedback."}, {"post_id": 34418, "ts": "2026-07-25T03:27:42Z", "hours": 0.5558, "text": "So I made a few more adjustments like removing the APNs registration page from onboarding to make onboarding even more seamless Not important though. I discovered a really annoying problem: When I try to add iPad support, build fails because its trying to embed the watch app which obviously doesnt work on ipad. and xcode isnt letting me fix that. 😐"}, {"post_id": 34073, "ts": "2026-07-24T15:06:09Z", "hours": 4.9253, "text": "I made some UI rehauls again lol Current day receives theis blur effect which kinda looks like real light bouncing inside a box under the current day The accent colour of the app is now brown, as I am trying to make the app feel more like paper, which will become more obvious as i later add paper elements and views inside the app. My last update released a new account backend, which meant some users were not able to log in, so i decided to nuke the database and reset everything 💀 but anyway it worked and i upgraded the server to be better at handling this The sheet to add a shared timetable is improved, with blur effects and stuff, and that tiemtable preview has gotten much better it was pretty bad before ngl"}, {"post_id": 33492, "ts": "2026-07-23T14:13:01Z", "hours": 6.9467, "text": "I did a bunch of things: current day highlight in ios improve the notification early sending, to allow users to send notifications at multiple offsets remake the ui for share timetable sheet also the ui for the link customisation, tinted mint for whatever reason sharing links is now a URL, which prompts you to open the app but uses decently ugly html, ill fix later. New icon for apple watch that is optimised for the smaller display size (just made the components bigger and removed some duplicate elements added some mroe developer items at the bottom, doesnt serve much purpose just looks cool lol i removed the status badges that show success, cos i thought they would annoy the user with too many success alerts, and success when you are toggling settings doesnt really need alerts, so yeah. i also hit a bug where notifications would send twice, i had to improve the apns token system to not duplicate tokens for a device. on startup the app shows “restoring account…” every time, so i had to cache the profile data to make it stay signed in until explicitly signed out. its kinda hard to see in the screenshot but there is progressivew blur at the bottom and top, looks nice"}, {"post_id": 32346, "ts": "2026-07-21T13:36:10Z", "hours": 3.2925, "text": "I had a bug where the device could receive 2 notifications and live activities for each device, so I had to remake the APNs (apple push notification service) token management. I also added a highlight around the current day, with the setting to disable it. i thought a stroke was better than a fill because its less overwhelming and doesn’t break the ui style."}, {"post_id": 32261, "ts": "2026-07-21T10:07:38Z", "hours": 2.5917, "text": "😍"}, {"post_id": 31757, "ts": "2026-07-20T12:16:31Z", "hours": 0.9472, "text": "As you saw before the onboarding UI was a bit broken, so I went through and fixed it up and also trimmed down how many pgaes it has. Those bottom buttons aren’t concentric for some reason, even though I am using the built-in toolbar API, so I can’t fix it. Oh well. And it’s done to 8 pages, from 13. I still have som non-UI bugs to fix."}, {"post_id": 31728, "ts": "2026-07-20T11:15:51Z", "hours": 3.0553, "text": "Updated splash screen Notificaitons now have threads (each school day is a thread) macos window size animation fixed (the macos window resizes depending on the current state of the app, like currently selected tab etc. fixed some bugs in live activities and server authentication"}, {"post_id": 31613, "ts": "2026-07-20T04:58:28Z", "hours": 2.3833, "text": "Fixed some server bugs, a user reported getting “forbidden” status messages, turns out I forgot to migrate the database 😐 And other UI refinements: Tab bar uses monospace font version and build in settings feedback sheet"}, {"post_id": 31570, "ts": "2026-07-20T02:25:41Z", "hours": 0.5333, "text": "Plus a version for debug builds, I think they came out really nice!!"}, {"post_id": 31548, "ts": "2026-07-20T01:23:34Z", "hours": 0.4489, "text": "I think this is pretty much it."}, {"post_id": 31538, "ts": "2026-07-20T00:55:26Z", "hours": 0.7164, "text": "I think I’m getting there"}, {"post_id": 31518, "ts": "2026-07-20T00:10:10Z", "hours": 0.2719, "text": "I think I’ve locked in to this one. Now I need to figure out what to actually put on the papar, im thinking it has to be a kind of simplifed version of the existing main UI of my app. something kinda like a calendar schedule"}, {"post_id": 31513, "ts": "2026-07-19T23:53:55Z", "hours": 0.6131, "text": "So many variants! and idk which one is best"}, {"post_id": 31504, "ts": "2026-07-19T23:17:08Z", "hours": 2.4258, "text": "Many many iterations later… I’m leaning towards that paper one, it looks really tasteful i think. im not sure what to put on the paper though"}, {"post_id": 31176, "ts": "2026-07-19T11:22:39Z", "hours": 0.635, "text": "I think they are coming along really nicely!!!! The watchOS version has bigger title text and less handwriting rows cos its a smaller display size, i really like this 😃 the refraction effects 👌"}, {"post_id": 31171, "ts": "2026-07-19T10:43:22Z", "hours": 0.2894, "text": "I think it’s looking preetty good so far"}, {"post_id": 31156, "ts": "2026-07-19T10:22:03Z", "hours": 0.3833, "text": "More experiments, cos the previous multicolour outline was kinda ugly, now i’m thinking of adding the fake handwriting instead, it might look nice"}, {"post_id": 31145, "ts": "2026-07-19T09:51:42Z", "hours": 6.1353, "text": "I needed a new design system for my app, currently it was just a font and thats about it. Below are some experimental app icons I’ve been tweaking in sigma, they are made out of “paper” and represent a new theme I could use, which is literal paper as the design language. I think it could merge with Liquid Glass really nicely if done properly. Otherwise, other improvements: New App Intents for Apple Intelligence Allow users to set a custom share link URL, for example timetable.adonis.pt/sharedtimetable/adon’s_timetable More server tests + server improvements due to finding bugs in tests"}, {"post_id": 30567, "ts": "2026-07-18T07:42:48Z", "hours": 0.7647, "text": "I have also decided to remove Apple wallet integration, it just kinda got too messy. so im now going to revert (yes, revert 😭) back to an iMessage extension that lets you share timetables with a link. it fixes some annoying things that wallet integration has, like syncing etc. I can even allow custom link urls for a shared timetable!"}, {"post_id": 30552, "ts": "2026-07-18T06:53:52Z", "hours": 4.8108, "text": "I got carried away, since right now I am just going through and fixing the feedback my beta users gave me, starting with these: improving the onboarding flow to decrease the amount of pages, and condense some other pages, since testers said there were too many. Upgrade the server so that it only allows iOS to make changes to anything, since watchos and ipados and macos can only view, not edit. i added some tests, using codex, on the server. I’m getting tired of manually debugging every single problem I find by hand, I just make tests and its a much easier way of guaranteeing your server works perfectly. the client app is going to be much harder to add tests to, though. and more other random stuff I found and UI fixes etc. The screenshots are some broken UI stuff I found, I can’t really show you server bugs other than these error alerts. Going good so far though, can’t wait to release this as a v3!"}, {"post_id": 30017, "ts": "2026-07-17T08:18:20Z", "hours": 1.2478, "text": "After releasing v2 testflight, my friends pointed out a very large amounts of bugs in the app 😭 so I am now just trying to fix everything they pointed out. I’m pretty sure the server doesn’t have any issues, so at least that’s good. First bug is this bottom bar looks horrendous, This was fine for me cos I set my dynamic text size to small 😭"}, {"post_id": 28834, "ts": "2026-07-15T10:39:28Z", "hours": 2.2433, "text": "I made some final refinements to make sure account management on macOS works, so that my users can actually use the app, and then some other UI refinements, mainly for settings. there are a bunch of weird things i am yet to fix, but im really tired and just want to get this app out, so ill fix them later."}, {"post_id": 26526, "ts": "2026-07-11T11:56:12Z", "hours": 0.4547, "text": "I added some more pages to the onboarding, since that’s the only way I can show users how the app works cos it ngl is kinda obscure. i also added a report feedback or bug button, which needs some ui adjustments bruh"}, {"post_id": 26359, "ts": "2026-07-11T03:14:52Z", "hours": 1.1214, "text": "I can’t really show you haptics but i added haptics to buttons and the status badges. not much to say honestly. theres a toggle in settings to turn that on and off."}, {"post_id": 25978, "ts": "2026-07-10T14:57:41Z", "hours": 0.8503, "text": "I;m nearly read to release version 2 of the app, so i made a list of final tweaks and little improvements to make it as best I can, i think i can release it in a few days."}, {"post_id": 25832, "ts": "2026-07-10T09:47:11Z", "hours": 3.5725, "text": "I improved the friends subjects widgets with concentric corners and stuff."}, {"post_id": 24646, "ts": "2026-07-08T11:25:32Z", "hours": 2.6925, "text": "I think I have built out pretty much all of the projects, but i need to fix the abundance of bugs and problems that i have. the first one was fixing a problem with server syncing, and making watch depend on signing in on the phone, not by itself."}, {"post_id": 23437, "ts": "2026-07-06T12:20:38Z", "hours": 1.6219, "text": "I refined the live activities (that background is for recess and lunch, even though this preview text says before school)"}, {"post_id": 23389, "ts": "2026-07-06T09:53:29Z", "hours": 8.7292, "text": "I added live activities, although they are currently kinda ugly and need much improvement. I also made the watch app independent, because it doesnt need the iphone much really, it can just contact the server. i still have more work in making the server work better and stop giving me random errors, but yeah."}, {"post_id": 22056, "ts": "2026-07-04T09:37:57Z", "hours": 2.8419, "text": "In the onboarding I added pages to teach the user the features of the app, but I havent finished it yet. it needs a few more pages and refinement for smalelr phone screens"}, {"post_id": 21441, "ts": "2026-07-03T12:12:36Z", "hours": 6.5136, "text": "I have added an onboarding view that i really like, its very colourful and stuff. i also improved the server to be able to send notifications to users, to tell them when their next class is."}, {"post_id": 20474, "ts": "2026-07-02T02:23:36Z", "hours": 3.1183, "text": "I added notifications to the app, so that people can receive information in the form of notifications as well as live activities and app intents and widgets. I also improved the share pass button in the prominent tab bar, so that you see this sheet to select what pass you want to share, not just the user’s own timetable."}, {"post_id": 19907, "ts": "2026-07-01T10:45:28Z", "hours": 0.4294, "text": "Much better blur, although the server is taking a full 2.5 seconds to send back the pass, and i need to reduce that as much as possible"}, {"post_id": 19874, "ts": "2026-07-01T09:07:49Z", "hours": 0.5289, "text": "The timetable has some shadow behind it. I wanted to make the card HDR, but after a lot of experimenting i found apple doesn’t let you use hdr in your app like this, so i had to instead do this shadow 😐"}, {"post_id": 19839, "ts": "2026-07-01T07:27:59Z", "hours": 5.4344, "text": "I finished the search view, and i spent a very long time on perfecting some visual animations and stuff. when you click on a search result it separately animates the title in. also, before you search anything, i thought instead of showing most downloaded timetables or something i show this really squishy and fun pokemon-style timetable wallet pass. the settings view has also been improved a bit, to make some settings more clear, but i still need to refine it alot further to get it working really nicely."}, {"post_id": 19231, "ts": "2026-06-30T14:26:57Z", "hours": 3.5647, "text": "I did some debugging and made quite a lot more endpoints, I think I’m ready to move on to making the app."}, {"post_id": 18340, "ts": "2026-06-29T13:38:09Z", "hours": 5.9711, "text": "It took quite some time, but i got some really nice looking status badges! I’m really proud of how they came out, they look very juicy, and i cant show it here but i promise its very touchable and squishy and animated! 🥰"}, {"post_id": 17491, "ts": "2026-06-28T09:18:06Z", "hours": 1.3717, "text": "I’ve built a few endpoints and documented them in rapidapi, ready to import into the client app."}, {"post_id": 17396, "ts": "2026-06-28T04:54:23Z", "hours": 2.2958, "text": "I finally got the server working! took a really long time to get https working though, nginx was impressively difficult"}, {"post_id": 16990, "ts": "2026-06-27T15:55:13Z", "hours": 3.0039, "text": "I have started building the server, using swift vapor. i chose vapor because it is written with swift, like my project, which made it easier to share code between the two files."}, {"post_id": 16274, "ts": "2026-06-26T13:42:03Z", "hours": 4.8597, "text": "Xcode seems to have become extremely broken or something, i spent the last 4 hours trying to make my widget work but Xcode kept erroring out and eating memory swap, and now i have some trouble with making the imported timetables actually show up in the widgets i already made 😡"}, {"post_id": 15592, "ts": "2026-06-25T11:12:59Z", "hours": 0.6642, "text": "I changed the blur effect to this, which i think is much better, because it has less blur, and doesnt add an ugly grey tint, so black background stays black background."}, {"post_id": 15058, "ts": "2026-06-24T13:45:05Z", "hours": 0.5081, "text": "I added this blur effect behind the share sheet, and I think it looks really nice. I had to import a package to get a blur this clear"}, {"post_id": 15044, "ts": "2026-06-24T13:04:35Z", "hours": 1.7442, "text": "I added a share button in the bottom left, which allows the user to share their timetable in one press, using the .prominent Tab style so that it looks seperate from the other tabs while still looking consistent."}, {"post_id": 13120, "ts": "2026-06-21T13:40:22Z", "hours": 1.0011, "text": "So added the ability to share timetables using apple wallet, along with sending them using messages, i think that background will need to get fixed for readability, but otherwise, i like it alot."}, {"post_id": 13066, "ts": "2026-06-21T11:31:59Z", "hours": 3.4256, "text": "I added some App Intents, below is my current subject intent, and also a list of received timetables intent. It took a lot longer than expected because the app intents framework was quite confusing to get working, but i got a nice UI in the end."}, {"post_id": 12370, "ts": "2026-06-20T05:56:30Z", "hours": 1.4289, "text": "I upgraded the watch views, like making the progress rectangle rounded, and this very colourful background for when its recess and lunch"}, {"post_id": 11882, "ts": "2026-06-19T11:15:08Z", "hours": 2.4344, "text": "I updated the background of the window, including in light mode, and I also remade the icon. The settings also looks much better than it was before, and I made a nice window animation for when you click a slot to see what your friends have."}, {"post_id": 9773, "ts": "2026-06-16T06:48:43Z", "hours": 1.3667, "text": "I made some refinements to the watchOS and iOS app, including design and performance."}, {"post_id": 9217, "ts": "2026-06-15T14:09:02Z", "hours": 0.8633, "text": "I made some design adjustments to the macOS app, giving it a blur background. Also, the weekly shedule widget has had its corner radiuses and colours adjusted to be less harsh and look better."}, {"post_id": 9192, "ts": "2026-06-15T13:10:48Z", "hours": 0.2592, "text": "I added some buttons and refined the UI of settings view"}, {"post_id": 9182, "ts": "2026-06-15T12:32:38Z", "hours": 0.5969, "text": "I continued to refine the design of the macOS widget, and I really like it now."}, {"post_id": 9098, "ts": "2026-06-15T06:29:44Z", "hours": 3.9675, "text": "I fixed the widget extension problem by making two widget extensions, one for watch and one for other platforms, and made them use identical code. And then I refined the widget design for macOS and iOS and i think they look really nice now."}, {"post_id": 7893, "ts": "2026-06-13T05:18:30Z", "hours": 0.5119, "text": "I added support for these widgets from only watch to iphone and ipad and macOS, and currently they are ugly and unrefined, so I’m going to fix them now."}, {"post_id": 7438, "ts": "2026-06-12T11:50:09Z", "hours": 3.1881, "text": "I ported the app over to macOS, which was harder than I thought because there was a lot of code throughout every screen that was for connecting iphone to apple watch or some other iOS-only thing, which I had to conditionally compile out for macOS. then I needed to refine the views to work on macOS well, for example the class editor sheet used a sidebar instead of the scrolling tabview on iOS. There’s still more work to do to refine it more and get CloudKit working so that the timetable syncs across devices."}, {"post_id": 6885, "ts": "2026-06-11T15:22:19Z", "hours": 2.7783, "text": "I added these views to the watch, so you can see how much time is left in a session for yourself, and also for others. i also refined the timetable view to not use so much glass because it was lagging the TabView. The main clock uses a liquid glass background against the background progressview, and what class is next."}, {"post_id": 6796, "ts": "2026-06-11T12:06:20Z", "hours": 0.8469, "text": "I fixed the sync button visuals, it now has a blur replace transition effect. the timetable comparison view also blurs in and out when you click around"}, {"post_id": 6781, "ts": "2026-06-11T11:08:53Z", "hours": 2.6286, "text": "I moved the sync button to settings, so that the toolbar in the timetable tab could be removed. this is to make way for this new bottom half of the screen that shows other people’s timetables when you click on the slot in the top half, replacing the previous system of letting you select someone else and see their whole timetable covering your timetable. this system lets you view your own timetable and compare it with everyone else’s at a particular period. It uses a soft scroll edge effect at the bottom, and a hard effect at the top, which i think looks really nice. the second image shows the content scrolling under the timetable, which i really liked."}, {"post_id": 6247, "ts": "2026-06-10T14:30:26Z", "hours": 0.8989, "text": "I’m just refining the software a but before I start adding Siri support and improving Messages import/export flow. I fixed this comparison view, improved the class editor to show the glass nicer, and the settings toolbar has a gradient blur effect instead of hard blur, which was made the new default toolbar background style, which imo is ugly."}, {"post_id": 6208, "ts": "2026-06-10T12:53:06Z", "hours": 4.0678, "text": "I renamed PMS Timetable to Timetable, which took more time than I expected cos it was embedded in like every single file and I even had to go through binary files and just delete all the instances of “pms” . then this managed to corrupt Xcode and make it crash every time I opened it, and i had to delete some stuff to fix that. Now I’m on the OS27 version and I’m going to start fixing some UI."}]...
|
Title: Timetable by @omeriadon | Stardance
Devlog Title: Timetable by @omeriadon | Stardance
Devlogs:
I renamed PMS Timetable to Timetable, which took more time than I expected cos it was embedded in like every single file and I even had to go through binary files and just delete all the instances of “pms” . then this managed to corrupt Xcode and make it crash every time I opened it, and i had to delete some stuff to fix that. Now I’m on the OS27 version and I’m going to start fixing some UI.
I’m just refining the software a but before I start adding Siri support and improving Messages import/export flow. I fixed this comparison view, improved the class editor to show the glass nicer, and the settings toolbar has a gradient blur effect instead of hard blur, which was made the new default toolbar background style, which imo is ugly.
I moved the sync button to settings, so that the toolbar in the timetable tab could be removed. this is to make way for this new bottom half of the screen that shows other people’s timetables when you click on the slot in the top half, replacing the previous system of letting you select someone else and see their whole timetable covering your timetable. this system lets you view your own timetable and compare it with everyone else’s at a particular period. It uses a soft scroll edge effect at the bottom, and a hard effect at the top, which i think looks really nice. the second image shows the content scrolling under the timetable, which i really liked.
I fixed the sync button visuals, it now has a blur replace transition effect. the timetable comparison view also blurs in and out when you click around
I added these views to the watch, so you can see how much time is left in a session for yourself, and also for others. i also refined the timetable view to not use so much glass because it was lagging the TabView. The main clock uses a liquid glass background against the background progressview, and what class is next.
I ported the app over to macOS, which was harder than I thought because there was a lot of code throughout every screen that was for connecting iphone to apple watch or some other iOS-only thing, which I had to conditionally compile out for macOS. then I needed to refine the views to work on macOS well, for example the class editor sheet used a sidebar instead of the scrolling tabview on iOS. There’s still more work to do to refine it more and get CloudKit working so that the timetable syncs across devices.
I added support for these widgets from only watch to iphone and ipad and macOS, and currently they are ugly and unrefined, so I’m going to fix them now.
I fixed the widget extension problem by making two widget extensions, one for watch and one for other platforms, and made them use identical code. And then I refined the widget design for macOS and iOS and i think they look really nice now.
I continued to refine the design of the macOS widget, and I really like it now.
I added some buttons and refined the UI of settings view
I made some design adjustments to the macOS app, giving it a blur background. Also, the weekly shedule widget has had its corner radiuses and colours adjusted to be less harsh and look better.
I made some refinements to the watchOS and iOS app, including design and performance.
I updated the background of the window, including in light mode, and I also remade the icon. The settings also looks much better than it was before, and I made a nice window animation for when you click a slot to see what your friends have.
I upgraded the watch views, like making the progress rectangle rounded, and this very colourful background for when its recess and lunch
I added some App Intents, below is my current subject intent, and also a list of received timetables intent. It took a lot longer than expected because the app intents framework was quite confusing to get working, but i got a nice UI in the end.
So added the ability to share timetables using apple wallet, along with sending them using messages, i think that background will need to get fixed for readability, but otherwise, i like it alot.
I added a share button in the bottom left, which allows the user to share their timetable in one press, using the .prominent Tab style so that it looks seperate from the other tabs while still looking consistent.
I added this blur effect behind the share sheet, and I think it looks really nice. I had to import a package to get a blur this clear
I changed the blur effect to this, which i think is much better, because it has less blur, and doesnt add an ugly grey tint, so black background stays black background.
Xcode seems to have become extremely broken or something, i spent the last 4 hours trying to make my widget work but Xcode kept erroring out and eating memory swap, and now i have some trouble with making the imported timetables actually show up in the widgets i already made 😡
I have started building the server, using swift vapor. i chose vapor because it is written with swift, like my project, which made it easier to share code between the two files.
I finally got the server working! took a really long time to get https working though, nginx was impressively difficult
I’ve built a few endpoints and documented them in rapidapi, ready to import into the client app.
It took quite some time, but i got some really nice looking status badges! I’m really proud of how they came out, they look very juicy, and i cant show it here but i promise its very touchable and squishy and animated! 🥰
I did some debugging and made quite a lot more endpoints, I think I’m ready to move on to making the app.
I finished the search view, and i spent a very long time on perfecting some visual animations and stuff. when you click on a search result it separately animates the title in. also, before you search anything, i thought instead of showing most downloaded timetables or something i show this really squishy and fun pokemon-style timetable wallet pass. the settings view has also been improved a bit, to make some settings more clear, but i still need to refine it alot further to get it working really nicely.
The timetable has some shadow behind it. I wanted to make the card HDR, but after a lot of experimenting i found apple doesn’t let you use hdr in your app like this, so i had to instead do this shadow 😐
Much better blur, although the server is taking a full 2.5 seconds to send back the pass, and i need to reduce that as much as possible
I added notifications to the app, so that people can receive information in the form of notifications as well as live activities and app intents and widgets. I also improved the share pass button in the prominent tab bar, so that you see this sheet to select what pass you want to share, not just the user’s own timetable.
I have added an onboarding view that i really like, its very colourful and stuff. i also improved the server to be able to send notifications to users, to tell them when their next class is.
In the onboarding I added pages to teach the user the features of the app, but I havent finished it yet. it needs a few more pages and refinement for smalelr phone screens
I added live activities, although they are currently kinda ugly and need much improvement. I also made the watch app independent, because it doesnt need the iphone much really, it can just contact the server. i still have more work in making the server work better and stop giving me random errors, but yeah.
I refined the live activities (that background is for recess and lunch, even though this preview text says before school)
I think I have built out pretty much all of the projects, but i need to fix the abundance of bugs and problems that i have. the first one was fixing a problem with server syncing, and making watch depend on signing in on the phone, not by itself.
I improved the friends subjects widgets with concentric corners and stuff.
I;m nearly read to release version 2 of the app, so i made a list of final tweaks and little improvements to make it as best I can, i think i can release it in a few days.
I can’t really show you haptics but i added haptics to buttons and the status badges. not much to say honestly. theres a toggle in settings to turn that on and off.
I added some more pages to the onboarding, since that’s the only way I can show users how the app works cos it ngl is kinda obscure. i also added a report feedback or bug button, which needs some ui adjustments bruh
I made some final refinements to make sure account management on macOS works, so that my users can actually use the app, and then some other UI refinements, mainly for settings. there are a bunch of weird things i am yet to fix, but im really tired and just want to get this app out, so ill fix them later.
After releasing v2 testflight, my friends pointed out a very large amounts of bugs in the app 😭 so I am now just trying to fix everything they pointed out. I’m pretty sure the server doesn’t have any issues, so at least that’s good. First bug is this bottom bar looks horrendous, This was fine for me cos I set my dynamic text size to small 😭
I got carried away, since right now I am just going through and fixing the feedback my beta users gave me, starting with these: improving the onboarding flow to decrease the amount of pages, and condense some other pages, since testers said there were too many. Upgrade the server so that it only allows iOS to make changes to anything, since watchos and ipados and macos can only view, not edit. i added some tests, using codex, on the server. I’m getting tired of manually debugging every single problem I find by hand, I just make tests and its a much easier way of guaranteeing your server works perfectly. the client app is going to be much harder to add tests to, though. and more other random stuff I found and UI fixes etc. The screenshots are some broken UI stuff I found, I can’t really show you server bugs other than these error alerts. Going good so far though, can’t wait to release this as a v3!
I have also decided to remove Apple wallet integration, it just kinda got too messy. so im now going to revert (yes, revert 😭) back to an iMessage extension that lets you share timetables with a link. it fixes some annoying things that wallet integration has, like syncing etc. I can even allow custom link urls for a shared timetable!
I needed a new design system for my app, currently it was just a font and thats about it. Below are some experimental app icons I’ve been tweaking in sigma, they are made out of “paper” and represent a new theme I could use, which is literal paper as the design language. I think it could merge with Liquid Glass really nicely if done properly. Otherwise, other improvements: New App Intents for Apple Intelligence Allow users to set a custom share link URL, for example timetable.adonis.pt/sharedtimetable/adon’s_timetable More server tests + server improvements due to finding bugs in tests
More experiments, cos the previous multicolour outline was kinda ugly, now i’m thinking of adding the fake handwriting instead, it might look nice
I think it’s looking preetty good so far
I think they are coming along really nicely!!!! The watchOS version has bigger title text and less handwriting rows cos its a smaller display size, i really like this 😃 the refraction effects 👌
Many many iterations later… I’m leaning towards that paper one, it looks really tasteful i think. im not sure what to put on the paper though
So many variants! and idk which one is best
I think I’ve locked in to this one. Now I need to figure out what to actually put on the papar, im thinking it has to be a kind of simplifed version of the existing main UI of my app. something kinda like a calendar schedule
I think I’m getting there
I think this is pretty much it.
Plus a version for debug builds, I think they came out really nice!!
Fixed some server bugs, a user reported getting “forbidden” status messages, turns out I forgot to migrate the database 😐 And other UI refinements: Tab bar uses monospace font version and build in settings feedback sheet
Updated splash screen Notificaitons now have threads (each school day is a thread) macos window size animation fixed (the macos window resizes depending on the current state of the app, like currently selected tab etc. fixed some bugs in live activities and server authentication
As you saw before the onboarding UI was a bit broken, so I went through and fixed it up and also trimmed down how many pgaes it has. Those bottom buttons aren’t concentric for some reason, even though I am using the built-in toolbar API, so I can’t fix it. Oh well. And it’s done to 8 pages, from 13. I still have som non-UI bugs to fix.
😍
I had a bug where the device could receive 2 notifications and live activities for each device, so I had to remake the APNs (apple push notification service) token management. I also added a highlight around the current day, with the setting to disable it. i thought a stroke was better than a fill because its less overwhelming and doesn’t break the ui style.
I did a bunch of things: current day highlight in ios improve the notification early sending, to allow users to send notifications at multiple offsets remake the ui for share timetable sheet also the ui for the link customisation, tinted mint for whatever reason sharing links is now a URL, which prompts you to open the app but uses decently ugly html, ill fix later. New icon for apple watch that is optimised for the smaller display size (just made the components bigger and removed some duplicate elements added some mroe developer items at the bottom, doesnt serve much purpose just looks cool lol i removed the status badges that show success, cos i thought they would annoy the user with too many success alerts, and success when you are toggling settings doesnt really need alerts, so yeah. i also hit a bug where notifications would send twice, i had to improve the apns token system to not duplicate tokens for a device. on startup the app shows “restoring account…” every time, so i had to cache the profile data to make it stay signed in until explicitly signed out. its kinda hard to see in the screenshot but there is progressivew blur at the bottom and top, looks nice
I made some UI rehauls again lol Current day receives theis blur effect which kinda looks like real light bouncing inside a box under the current day The accent colour of the app is now brown, as I am trying to make the app feel more like paper, which will become more obvious as i later add paper elements and views inside the app. My last update released a new account backend, which meant some users were not able to log in, so i decided to nuke the database and reset everything 💀 but anyway it worked and i upgraded the server to be better at handling this The sheet to add a shared timetable is improved, with blur effects and stuff, and that tiemtable preview has gotten much better it was pretty bad before ngl
So I made a few more adjustments like removing the APNs registration page from onboarding to make onboarding even more seamless Not important though. I discovered a really annoying problem: When I try to add iPad support, build fails because its trying to embed the watch app which obviously doesnt work on ipad. and xcode isnt letting me fix that. 😐
I found an xcode bug, something to do with compilation errors for incorrect architecture, i dont get it but i gave apple feedback.
I improved the UI for this view, to better show classroom and teacher labels. I also renamed “Authored” to “Created”, apparently its better copy, according to my friend. The settings got cleaned up a bit, and importing from calendar again needs confirmation
This is currently the message extension ui. kinda ugly. that needs fixing I also updated the created timetables detail view, and (ignore the screenshot) removes the save button cos no one is going to remember to press save when they change details, so this should save some frustration.
I’m adding countdowns everywhere, even when school is out, so that you can count the hours until your next period
Message extension got improved, it now checks if you have enabled sharing before allowing you to even sahre it, and tells
I have expanded the home tab!! Theres three tabs at the top, today, week, and upcoming. week is what it already was upcoming shows term dates, no school days, school events, and also the users own personal events they make. the today view is a bit ugly but its sort of there! there also an admin page now, so that i dont have to hardcode term dates etc, i can just send them as api requests (for admin accounts only lol)
As usual, I did a very assorted bunch of things: new admin tab so that i can change stuff without having to go onto my mac and hardcode stuff today view looks like paper - reminscient of the app icon! new about view the popover for subject details is smaller, removing bloat and a bunch of server improvements due to all of my users finding bugs and stuff!
Theres now brown and white paper combined. its an interesting ui concept, makes no sense in real life, but i think it looks nonetheless! it definitely creates an app theme, regardless of if this theme looks good or not…
I made some UX adjsutments in the settings app, added some images, reordered haptics, etc the planner sub-tab has been rehauled, and shows items chronologically instead of in sections, which i thought was more intuitive. it still needs much more thought though, im not sure how to space them out since some gaps are months long.
Me and my friend did a bit of brainstorming, to get ideas on how to improve the app UI, UX and future features. cos we are planning a future release hopefully. so we gained a good idea of consolidating friends into a more clear friends tab, combingin the currently spread-around-everywhere friends stuff.
so me and my friend did some more brainstorming focussing on the new friends tab, and how friend accounts work, and profiles and pfps etc. we also aggregated a list of bugs and UI glitches in the app that still need fixing. the current first version is (moderately) broken 😭
i added a section in teh administration to be able to turn off the server for everyone except for me, so that i can maintain the server and test it. and also a section to manage other admins.
I made this widget, which is kinda like a summary widget for the user. it requires this large widget size to fit everything, and its goign to be more dynamic than the other widget which always show the same layout. i haven’t thought exactly how i’m going to do it though, below is a rough first version.
I’ve been busy remaking the profile editor, its coming together really nicely. that profile picture at the top is designed so that lets the other components take up their space, and then the pfp takes up the rest of the space. this allows the same view to not scroll while working on different phones and text sizes etc. and the background is animated!!!
The bottom colour grid is concentric to the device!!! although making the white outlines also behave nicely is proving really really hard, as you can see below
you can add special badges to people now, for like early birds or something idk. the profile picutre bakground has been upgraded a bit, but im going to have to fork the repo and adjust it myself, its currently not looking like a gradient but a single noisy colour, im gonna fix that.
Given the theme of this app, paper, widgets now get paper too! settings for profiles has been updated too you can now select black → white in the colour selector. friend detail view still kinda looks a bit empty and bland, im not quite sure how to make it feel alive
So the header in settings now reflects with your pfp colours for the profile editor, i made it now scrolling so that you could fit in all of the various options, like animation speed and noise and stuff. when you click on a class in today view, it shows some more details about the class like teacher and location. friends view also looks a bit nicer, both the list view and the detail view.
friends detail view shows a bit more content, and is redesigned for more paper you can reorder the badges around now for priority when they show in their overlay event tags editor looks a bit nicer plus, users can edit their year group after signing in.
some people were saying that it was really annoying that you could drag anywhere in a sheet to dismiss the sheet, you would be halfway through something and then you have to restart. so i went through all the sheets in the app and checked if they needed to remove this swiping. luckily it only needed one modifier per sheet. also, more tester feedback was that i shouldnt have sections for tags, so yeah i did that. also, now that there is a concept known as friends, instead of just shared timetables, i removed the option to allow people to have their timetables searched publicly. i havent figured out what i want for specific created timetables, i might lwk have to just remove that also users now have to fill in what year group they are when onboarding. for tags.
i just read an article that said @Environment(\.dismiss) is bad for performance dismiss() is a very simple and fast way to make a sheet or other modal view dismiss , but because its so simple and dynamic, that introduces lots of bugs apparently. so I had to go through all the sheets and this time replace dismiss() with better state management. i hope ill notice the performance improvements!
before and after some small ui improvements!!
I checked the localisation and it went down to 25%, so I went and pushed that back up to 100%. and the friend detail view has been improved a bit more
So so far up to now, I have completely neglected everything other than iPhone. i needed this so that i could focus on making iphone as seamless and intuitive and possible, and to push features faster. so now i have to go and basically remove all of the non-iPhone code and replace it with iphone code, and then try to make that work multiplatform. so i decided iphone is going to remain as a tabview, for now at least, but ipados, macos, and big iphones can use a navigation split view, shown below. so a sidebar and main view and an inspector on the right sometimes.
first version of timetable for macos 😭 its really ugly and lwk broken. so im gonna spend the next few hours fixing this incredibly “interesting” UI.
working with macOS is infuriating me, so i decided im going to make the macos app actually be mac catalyst, so its technically just running an ipad app. which makes sense. still needs alot more work, this refactor is proving very very annoying
its getting there! mac catalyst is definitely better than trying to make native macOS work. swiftui isnt really making it any better, its really really restrictive in terms of how i can structure my app. like for example that right column, has so many glitches that i cant really find solutions to because the bugs aren’t in my code, its infuriating.
Still just refactoring and remaking the app. i decided to remove OS 26 compatibility, because there is just too many APIs and stuff the images below are some stuff I’ve been refining: dragging friends around sideays iphone support (same thing as macOS + iPadOS) but I’ve decided now to not work on macOS (which is just iPadOS) and ipad until i perfect iphone and watch. should be fun!
I finished the refactoring for now, to make the app multi platform. So then i did some more brainstorming and I have consolidated what is the next few features I need to do tips, to tell the user about features the app has they sound easy but each tip needs rules and parameters and all kinds of obscure annoying things, so its going to be harder than it looks my first tip shown below An indicator next to each friend about their status, which is going to take the user’s location, taken in the background, to tell if they are on campus or off campus So from this you can tell when a user arrives at school or if they are sick iOS provides a function that will call my app, from the background, every time the user crosses a specific map polygon (The school). so i dont even need to do any map processing, my app just gets called every time the device goes in or out of school! plus i can add cool related features like the user’s average arrival time to school, which will be pretty cool!
Few things! Adminsitration gets new items for reported users and freinds-since requests sections in adminstration statistics for number of users, etc you can now see your status and other people’s status, like on or off campus new page that asks for location access ofc (ill move it into the onboarding later improved the add a friend sheet admins get emails for reported users, etc
user account data now has highlighted rows for faster navigation user reports look much better, as well as friends-since requests reporting or sending feedback sends notifications instead of emails, now
lots of little things instead of one big feature: i used to send emails, and i reached limits on the email provider so i had to move to only sending notifications, like device notifications. i still need an alternative, im looking through options now there used to be different settings view between iPhone and iPad, so i consolidated them into one view.you can now see your friend’s status as on or off campus. this uses location to check when you reach school or leave. this also allows some cool statistics like average school arrival time!there is better moderation, it shows in the admins view and lets the admin block or do nothing about the account. it will be expanded later to have more features and actions and stuff you can request to change your friends-since tag, also approved by admin.i deleted all (most) references to #if os(macOS) , since there is no more macOS build, its just iPad running on mac. small ui improvements: added search to some more administration views tapping an existing photo pro allows crop the tabview gets tab transitions, like the ones iOS 26 had (that ios27 removed 😡)year-level tags are separated from other tags expanded statistics!added archived events - events in the past - plus an option to automatically delete old events added a button to reset tips, since the app is getting more and more complicated the onboarding is less condensed, when that permission is first needed, its permission sheet request shows.more stuff gets cached in Defaults, making it more offline-safe.and some toolbar and blur and navigation title stuff.
some ui improvements (that weird box in the account view is Metal debug overlay, not my app)
Grade tracker!!! I know this is a very cliche topic but I had to implement this because it integrates so seamlessly with the app for example, it already knows your subjects (duh) and when you input the date of your assessment, it also knows which period of the day that is, because it knows your subjects! (duh) I also added ATAR, sthe user can set goals and stuff for what they want to achieve.
I decided to remove created timetables. they just don’t work anymore with the Friends concept, which makes it really annoying to adjacently share other timetables alongside having friends. its a shame, i wish it could have worked, maybe ill add it again later. oh well. im still just combing through the app and fixing all the little things i see: grade tracker gets a next item in the top for the top 4 subjects, which is important for atar. improved the friend detail view a bit better, because the old one had not enough information and was displaying badly.added more statistics to administration view cos its fun lol the tag selector view was improved, looks nicer and is a tiny bit more legible nowi changed the grade tracker weighting from semester to year. apparently thats the norm more friend detail view improvements
improving the friend detail view the padding is so much nicer, and the detail view also shows more info and in a better way the week subtab shows a similar timetable to the user’s own, and shows more info. and some more statistics lol
You can now change the font! this took more work than you would expect, because i did a find on the project and saw there were like 60 references to .monospaced, and each one had to be manually upgraded to dynamically apply font. i also tried to make the rounded font expanded, but after some inspection i found it doesnt even have a .expanded variant 😐 so the options i ended up with were monospaced, rounded, and expanded. no normal font. it just looks boring at this point. below is the same screen with each option! widgets also get the fonts, and they look actually insane ngl
I started work on rehauling the watchOS app And I really like how it’s coming out The watch is supposed to distill down the information the user needs, so i picked the current and next period, time, and their location. all these elements are glassy and stuff, so they are clickable, and its in a tabview that scrolls between each card. The first tab is the week view for the user. so I spent a good 2 hours trying to make a ScrollView work, but it didnt. sometimes the views teleported, some lagged, some glitched, and it was overall insanely annoying. so I moved to a tabview, which was considerably more stable, but removed the animations I wanted. it had its own animations which were fine, but yeah. Also, fonts also reflect on the watch! the one in the screenshots below is the expanded style, which to be honest isnt that good on watch since the watch is constrained as is, but yeah. The glass timetable actually looks insane I am still thinking of how to include other content, like grades maybe, and other things, but i dont want to make it too dense and slow
there is a new progress background: its not a background! inspired by the app icon / ios app, the progress view is now this marker thingy which fits into the app’s theme much nicer I’ve also been tweaking the font sizing, image sizing, padding, and gaps between the items here to make sure they look good at all possible subejct names etc. i also had to fight a bit with the safe area of the view, you can see in the image below the name “bob” ends slightly above the text, took me a lot longer than expected to fix that
I also made some improvements to the card height for the user’s own item. before, it was just the full width. Halfway while I was working on that, my TabView suddenly froze for a straight 20 seconds every time i changed the tab. this was very weird, and the CPU shows 0% usage, so I was quite surprised. After a large round of commenting things out and seeing what broke, I found it was a single .glassEffect() that I was using for the progress marker. I have no idea how a glass effect can make an entire tabview freeze, but fine. i replaced it with a simple red colour, as shown below, with a stroke and shadow, and i think it looks fine now.
I added a new devices statistics view. or more accurately, i expanded it. before, it just shows device platforms. now, it shows the os version, minor os version, and if it is a beta or not. i also added support for iOS 26 (previous builds only supported OS27 or later). this involved me just making some features not work on os26 😐 and supporting anything before OS26 would probably be legitimately impossible, so yeah not that.
Big update! Light mode! The app used to be dark mode only, it let me make it look much more pixel-perfect and refine colours and stuff, but its kinda obvious you cant keep the app dark mode only, its just not good. so i went through everything, adding light mode versions of paper, text, glass, etc. took me quite a bit of time because i was trying to maintain consistency while doing it, which included alot of redoing things and creating view modifiers and manually applying each one, etc i also added weatherkit, its just a single line in the today tab, but its nice. while adding light mode support, i found a really nice blur view i could add to lists, so now each lists’s background is nothing other than a blur! i also decided to make all backgrounds made out of paper, and i think it looks nice? theres also now a statistics page for deices and os versions and builds and stuff, itll be more useful later. as well as knowing when your friends arrive to school, i added the ability to know when they are within 5 or 10 mins, and to send notifications for that. average arrival also is split by day now, because people arrive to school at different times per day theres a new tab picker, which you can see int eh controls, its much more glassy than the last one, which is really really playful and stuff! i still have more work to do in terms of ui work, excluding light mode refinements, like notifications and widgets, but yeah.
I added accessibility improvements, mainly like labels and tags and stuff, for use with voice over etc. this was triggered by me installing a developer process into my app which allowed me to iterate on design faster, and it depended on accessibility elements to discover each element. (the purple thing lets you tap elements and comment on them) i also tried a new background for the cards, as you can see below, its just glass and i think it looks pretty nice
You can now edit the foreground colours for your profile picture monogram i also completed light mode support for widgets
I added custom backgrounds! Theres the paper backgrounds i added recently, and then the solid colours, and then also some of the really nice apple ones idk what they are called (i hope apple doesnt copyright me 😭) so yeah it applies to all backgrounds in the app i think it merges really nice with the liquid glass and blur backgrounds different views have it also shows on watch i also added an option to choose how far forward you see events. theres also even more statistics for what app version people are using!
So supporting light mode calls for an icon redesign, at least just for light mode, and here they are! Though to be honest, the entire app is gonna need a redesign, because I need to rename it from Timetable, because it has expanded into doing so much more, and timetable is a bit of a boring name. finding names is so insanely annoying though, but oh well.
I spent some time to work on this search button and its animation. idk if the video plays, but it uses apples glass effect transitions! I also made the confirmation dialogs for removing and reporting a friend better, before they just popped up in the middle of the screen, now it comes out of the menu (also found another ios27 beta bug 😐)
A somewhat interesting devlog this time. I spend a good 2 hours just trying to make live activities work. the miserable part is that they were already working before 😭 I dont even know what I did but it broke. And while i was trying to make a debug button to start a live activity, yeah it just wasn’t working. all kinds of problems with not submitting a good APNs token. and i had to like stop activities before starting new ones and stuff it was just in general really annoying. there was even more problems but its too much to say here 😔 anyway, i have started cleaning up the app. no more big features, to be honest, until i add a website for this thing!! should be really easy since the backend is clearly all done lol events can show weather for them, such as the athletics carnival i removed the ridiculous backgrounds i allowed users to choose, theres no only solid black/white and paper. more reasonable, i think. as part of my optimisation, i removed settings i found useless. haptics are now always on, and highlighting the current day is always on. profile pictures can now have their foreground colour set, like the Monogram can have its colour optimised.you can see the average for when your friends arrive to school per day, instead of in total. developer settings also got reorganised, more settings only show to developers. yet again cleaning up the app experience. the location status was a bit unreliable, if users were offline, etc, so i added multiple ways the app pushes updates to the server, and queued statuses when the device was offline. i also refined the actual radius for what counts as within 5 / 10 minutes, should be a bit better. i havent thought about people who live within 10 minutes, thats an interesting case the subject editors grid also looks nicer (still needs more improvement though the tabview now hides while scrolling, like it collapses into the corner, like apple apps! you can manually turn off sharing your status, for privacy reasons. and some more things i forgot 🥹 im so excited for this thing to actually launch!!!!!
new icons. the old one that now supports light mode was kinda ugly.
Ok so after a bunch of wrestling with nginx and bun and next.js, i have added the website! its at https://timetable.adonis.pt/ and the current api has been moved to https://timetable.adonis.pt/api Its the usual next.js thing. and it uses bun. my design idea for this is to look like its an ipad app, essentially, and im going to see exactly how far i can take the mimicking, maybe i can even add liquid glass to the web 💀 So yeah no more app building, now its website! It’s gonna be so much easier as well because I aleady have the backend done and tested, so this should be all design which will be really fun.
The website is alive! I got a screenshot of an iOS26 sidebar, and i am copying it, as you can see. looks nice i think
Hehehehe I’ve got a working version of liquid glass It uses gsap, which is nice the second image is an earlier version 😭
Its nice and squishy now! It uses gsap for this as well gsap is a great framework ngl
And now it scales up and down and stuff!!! I still can’t believe this is just html and css and js 😭 Theres so many parameters to tweak to make it feel right, its so finicky And depending on the size of the glass, you have to change the numbers, its kinda confusing honestly
So I’ve made the first version of the website, it’s really insanely buggy and broken, but the ui is there. so have the html good but no i need to really tweak the css to make it look nice, apple-style. i also need to figure out how to make loading states look nice, since unlike the the swiftui app, i can’t cache anything to not show loading state. in the plus side i dont have to deal with offline state, though. the sidebar and the toolbar are finished, and look really nice. the sidebar has an effect (from ipados) that basically reflects the content in a subtle blurred way, to make it feel like glass while not actually rendering anything expensive. The toolbar is just glass buttons + a black fade effect + progressives blur, also tuned to look like ipados. the icon in the sidebar is pretty ugly honestly so i need to replace that with the non-bordered icon. The other problem i am dealing with is that we are planning a complete redesign of the entire swiftui app, and obviously that has to propagate to the website, so any work i do now is kinda gonna be half wasted, depending on what the redesign actually looks like.
I’m still working on making the UI look much better, and I’m still figuring out some website stuff like how i should wire up the sidebar tabs as well as having like a nice homepage to advertise everything the app does, which will be a really fun sub-project. Turns out making nice looking lists in react is much harder than it looks, as shown below 😭 one problem is that each symbol has a different aspect ratio so i dont even know how to fit them nicely And unlike swiftui, its raelly raelly hard to stay consistent in your css and to keep using the ui tokens instead of making custom css everywhere. it looks like the website is gonna be harder than the app to make after all 😔 this classes card though, for example, i think its pretty much almost done. i might need a few more borders to make it look glassy and stuff but it looks exactly like the ios version, which is the end goal! And I added the animations to the classes card, again exactly like the iphone app. i also got a vscode extension that shows you all of your unused css classes, i highly recommend getting one and purging your codebase!
So the previous UI was really ugly, to be honest, so i decided I am oing to scrap half of the design and completely unstyle the entire app while making everything as standardised as possible, by trying to only use reused components as much as possible. So I spent all today stripping out components I didn’t need, then take the surviving components and adjusting them to my use case and making then look as nice as I can. alert dialogs drawers buttons lists section cards switches I have also decided to stop using tailwind because its quite simply messy and much more confusing than just moduled css, so ye
I have pretty much finished the components, I’m going to now go and add the other shared components and improve them too. then im gonna go through the css files and clear anything that is unused or overcomplicated, and then i can start remaking the website!
I think I have finished making all of the shared components I put everything inside accordions to organise the test components Overlays get the same translucency and outline every other component gets I think im happy with how the lists look, finally the option selectors are really really hot!!! The first page I have remade is the About view, which shows this badge if you are on localhost lol i also had to move the contributors up to the server instead of hardcoding them so that both website and app can see it And a really nice little animated gradient thingy for the about view!!
I have started using the shared components around the website, and its actually looking pretty nice! most importantly, these components can be changed once and work everywhere and i removed the drawers i was using everywhere, and i also made said drawers wider while i was rehauling the drawers i also kinda broke their animations and i don’t know how to fix it 😭 the whole website looks really basic now, since its obviously using now the shard unstyled components, and i was thinking about the theme and decided maybe it should be unstyled, and only the user’s own events and content etc can have colours.
I started to make the landing page, and i decided, after very much research from other landing sites I’ve seen, that the main item should be an interactive timetable, a version of the app icon. but interactive and glassy. im trying to recreate everything in css but its not looking as smooth and polished as real liquid glass does so ye. im kinda getting close though! I also added a navbar item that just is the link to actually open timetable, and when you hover it shows options to either open the app in testflight or open the web version which just redirects to /login. and its background switches to black when you start scrolling, which will make more sense later. i haven’t really planned the rest of the landing page, and i might remove this entire component if i find a good liquid glass implementation i can use, especially with bouncy animations etc. but yeah. (worst part is i might even just go change the entire app icon in a week so that kinda wastes all this time 😭😭😭)
After much trying to make glass, yet again, i failed. So now im just using blur and these edge effects, and i think it looks nice! theres even a hover eect, as shown in the second screenshot (class details show and the rectangle rotates a bit randomly)
I added a title to the lading site, but as you can see its not just any title. it uses this package called fitty to make the text size up to the full width of the page, and it does indeed look massive. and it also goes under the rectangles of the logo, so its like an apple depth effect you get on iphone lockscreens i found the website really laggy while scrolling somewhere while finishing of the main interactive icon, and i couldnt figure out why after removing everything that could have been gpu intensive (my gpu was spiking to 80% while just scrolling) so after all that my most likely theory is that the lag is just my computer and not the website (or both 😭😭) also when i made that main art, i made the border radii use px units, which made it look quite deformed on smaller screens, since the rectangle’s size is relative to screen width, whereas border radius is constant… so i went and fixed that too
I really wanted the first screen for timetable to look really really interesting and unique and instantly recognisable as Timetable, so i made the text instead of a boring white, it now has 3 really nice effects applied: A grain overlay, or noise, which in this case doesn’t make it look paper but looks nice nonetheless Its not flat white, its white at the top and goes to brown at the bottom, more noticeable when you close up. subtle but also nice The “white” isn’t even white. Its a particular white image i had a lot of difficulty in obtaining. it is the third screenshot, the “white” png. Its an .avif , and it uses some HDR-capable color space format something, which on compatible browsers make the timetable text show considerably brighter than everywhere else on your screen, which makes it really pop! i plan on using this effect in other places as well across the landing page to make it just pop a bit more. (the 4th image shows the white pixel showing as 1.25. anything above 1 is hdr.)
I did a few things in this devlog, got quite carried away frankly. So I migrated the codebase from Next.js to Tanstack. The reason was that i was seeing a lot of speed concerns, especially on the landing page. it was just lagging so much. i tried it on all my devices on all the browsers and it was there half the time. after a lot of commenting things out i just couldnt find a bug, so now i moved to tanstack. hopefully taht will remove at least some problems. in any case, i got bored of next.js and tanstack is a different framework to play with and make use of!! also, i continued the landing page by adding cards for each item. i don’t really like it right now, but i have established that i need to add these cards, if not in a different UI. The titles of each card are just image-masks, of Apple wallpapers! i went through some archive and picked out the ones i like, and applied a brightness 200% filter, and they look really nice now. after i finish the landing page im gonna work on rehauling the rest of the ui to be more intuitive and actually usable
ok so i think i have optimised it as much as i can lol tanstack clearly was a good idea, it just needed some optimisations!
Im making a 3d model of the school. this is so that i can show a whole literal map of the campus in the app, and then you can see where each user is, in 3d! i could even reexport it for the website, potentially its going to be interactive and everything
As well as migrating to Tanstack, I wanted even more speed, just for fun at this point honestly, so I decided to move to SolidJS from React. Its decently faster while looking similar to react, and it has some syntax stuff that i much prefer over react. this is basically just adding some margin for me to make bad code The end product looks identical so theres not much to show.. apart from the migration, I’ve also been designing the new landing page, which will also use the 3d model thing. the big question is figuring out how to make the 3d markers for each classroom register correctly, because i need to show a pin for each user at the right place, from swiftui, and somehow embed it into a realitykit 3d model. but im sure this use case has been done many times before so i can find something online!
Continuing the assorted improvements to the app: Fixed stacked drawers so nested drawer state updates reactively. Reworked the Friends page into shared List, ListSection, ListRow, and Card components. Preserved friend drag-and-drop ordering within the new layout. Improved timetable UX: i fixed the lesson selection in week view correctly aligned the “now” indicator in today view restricted timetable mode navigation to mobile through CSS, cos desktop already has the sidebar improved planner event styling. made the drawer compenent animate in and out, something i lost from the react -> solid migration I also added a reusable event-tag selection row with symbols and selected-state feedback.
Ships:
So I made a timetable app for my school, super-specialised and for ios, watchos, and macos. its got live activities and notifications to show you current and next subjects throughout the school day, widgets for your weekly schedule, ability to see your friends’ timetables, and server sync. and apple intelligence support!
This ship, I completely remade the app to work around accounts, and all the features that come with that I added a server, because it used to just store your timetable in your local storage and that was quite boring honestly creating a server for this has allowed me to add accounts, notifications, live activities, friends, shared events, multiple devices in the same account, and has made the website much easier to make (still in development, thats why the top devlogs are talking about the website not the app) The app now has all of this: Grades, track the score of all of your subjects notifications for each subject you have and your events etc live activity throughout each school day telling you your subjects etc sharing your location, subjects, and more with friends widgets that show your your subjects, upcoming events, and your friends’ schedules lots of administration options to manage pretty much everything, including who else is admin lol full support for siri, shortcuts, spotlight, and apple intelligence a full apple watch app btw i know 350 hours on a timetable app sounds insane (😭) but its because this project has 4 different aspects: swiftui client for iPhone, iPad, and mac swiftui client for apple watch a website client (still in development) the server that handles everything, and the database i promise it does more than just tell you your subjects 🙏...
|
1792878455.271768
|
1793742455.271768
|
|
6811
|
Borealis by @onyxtheone | Stardance
|
onyxtheone
|
1
|
383.93
|
4072
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-25T20:46:18Z", "hours": 241.0, "multiplier": 19.2, "payout": 4072, "blessing": "neutral", "text": "I built BTBX (Bare Tiny(?) BASIC eXecutor), a self-contained BASIC interpreter that is the operating system. There’s no Linux, no DOS, nothing underneath it. It boots straight off a FAT12 floppy image via a two-stage bootloader (512-byte stage1 + 2KB stage2), flips the CPU into protected mode, sets up the A20 gate, and lands you directly in a BASIC REPL, all inside 640KB of conventional memory. From there it’s a real language: GOTO, GOSUB, FOR/NEXT, WHILE/WEND, IF/THEN/ELSE, multi-dimensional arrays, 32-bit integers plus x87 80-bit floats, string functions (LEFT$, MID$, CHR$, etc.), and a full FAT12 filesystem so you can actually SAVE, LOAD, and DIR your programs on the disk image. There’s also PEEK/POKE for raw memory access, BLOAD/SYS to load and jump into raw machine code, VGA graphics primitives, a PIT-driven BEEP, and — half-finished but present — a SAY command aiming for SAM-style formant speech synthesis. What was challenging? Everything below the interpreter, honestly. Getting the boot chain right (CHS and EDD disk reads, A20 enabling that doesn’t silently hang, jumping into protected mode without immediately triple-faulting) took far longer than any language feature. The BIOS-thunk approach for file I/O (calling back into 16-bit real mode from a 32-bit kernel just to talk to disk) was its own maze. The funniest recent challenge was building a browser demo on top of v86: getting PS/2 keyboard Shift state to survive contact with a web browser turned out to be nearly as hard as writing the A20 gate code itself :3. Real hardware (and QEMU) just work; browsers apparently have opinions about what a Shift key is allowed to do. What am I proud of? That it boots at all, genuinely. A homemade OS with a homemade language on top, running real math through the x87 FPU and reading/writing a real filesystem, in under 640KB, with zero borrowed runtime. Getting arrays, strings, and file I/O all coexisting cleanly in a from-scratch interpreter over ~240 hours feels like the actual milestone here, not any single feature. What should people know to test it? Use make && make run, that's the supported path, tested in QEMU, and it's where shift/symbols work correctly. The browser demo (v86-based) is explicitly beta. booting and typing work, but shift-modified keys are unreliable there due to browser/emulator keyboard quirks (a real physical keyboard emulator interaction gap, not a BASIC bug ^^). Don't judge the interpreter by the demo's keyboard weirdness. Try PRINT, FOR/NEXT loops, SAVE/LOAD/DIR to confirm the filesystem works, and BEEP for audio. SAY is a known work-in-progress ergo don't expect actual speech (yet). Check the source tree if you want to see the boot chain (boot/stage1.asm, boot/stage2.asm) separately from the interpreter (src/kernel/basic.c).", "repo": "https://github.com/onyx-the-one/borealis", "demo": "https://onyx-the-one.github.io/borealis"}]...
|
[{"post_id": 63409, "ts": "202 [{"post_id": 63409, "ts": "2026-09-07T07:11:12Z", "hours": 9.3, "text": "its been a week since my last devlog, i dont have much new to add because with school and other responsibilities i dont have much time for actuall progress on this project. still i accumulated some 9 hours (sorry gizzy) by doing small changed, linting, updating forgotten banners and version numbers and so on. EHCI/USB still fails on the same issues as before. i will be reverting to a superfloppy boot because right now i cant even get debug to write to the disk which is annoying. then once i get the usb driver with all its issues working (sometime next decade) i can give usb boot another shot."}, {"post_id": 58426, "ts": "2026-08-30T20:43:20Z", "hours": 6.0, "text": "i am (still) putting in work on the usb driver, this is proving to be very complicated especially because my hardware is not cooperating. im thinking about switching back to floppy-emulated mode which would be more practical for debugging but at the same time probably introduce new issues i dont even expect yet."}, {"post_id": 53934, "ts": "2026-08-24T17:11:33Z", "hours": 7.1178, "text": "the port resets work on the laptop now. the bit we were waiting on (port-enable-changed) was being acknowledged by the bios’s smm ghost before we ever saw it, so we stopped waiting on the status bit and just read the port state, which can’t be acked away. also fixed before it bit us: two devices answering address 0 at once (enumeration is per-port now, and every device gets a real address before the next port wakes up). the next failure was prettier: every OUT transfer works, every IN transfer dies. the stick takes its orders but can’t talk back. that’s the signature of the qtd buffer list, the one place real ich silicon is strict where qemu is forgiving, so all dma buffers are page-aligned now and the error reports name whichever endpoint stalled. also everyone gotta apreciate the blahaj!"}, {"post_id": 50969, "ts": "2026-08-20T13:23:36Z", "hours": 9.3333, "text": "the stick is a disk now, no bios involved: usb grew enumeration and bot/scsi, fat12 picks whichever backend came up. qemu took the whole chain first try. the laptop found the stick on port 0 and then refused to reset it (my fault), the 50ms delay was port-0x80 writes that only cost real time inside qemu, so there’s a pit-based clock now. plot twist from the log meanwhile: the bios path worked on the laptop, because the toggles that “didn’t help” had quietly moved the stick to floppy emulation, and that path survives the mode switch. so it (partially) boots by accident while we fix it on purpose. also caught in a self-audit: a stall burned a full second, and a short read could report success with half a sector. readme rewritten as i was told to by sw."}, {"post_id": 50492, "ts": "2026-08-19T17:32:16Z", "hours": 5.8606, "text": "im still working on getting a usb driver to work. ehci seems to work kinda but its a loop between giving false data, partial data and occasionally seemingly true data but then usb decides it doesnt like it and ideally fat12 fails durning cache load too, WHICH I FIXED LONG AGO BRUH. but it came back for some reason. so im trying timing, msd, stall handling everything. this may take another decade."}, {"post_id": 49913, "ts": "2026-08-18T21:34:01Z", "hours": 6.4844, "text": "debug spew is a file now. every checkpoint from the first instruction onward (entry asm, the real-mode thunk letters, all the [DEBUG] lines) lands in a buffer, and once the fs proves it can write, the buffer becomes LOG.TXT and the screen clears to the banner. the trick is the default: echo stays on until the file is safely written, so a boot that dies early still shows everything live. the fallback isn’t a code path, it’s just never getting to the quiet part. LOG=0 in CONFIG.TXT keeps the old wallpaper. and the log already caught its first bug: a missing [EZTG] tattled on a stale version entry.asm. debugging is too important to leave on the screen."}, {"post_id": 49489, "ts": "2026-08-18T11:03:57Z", "hours": 9.5697, "text": "the stick talks, and for the first time it’s talking to us, not the bios. this part was the transfer engine: queue heads and transfer descriptors, little linked-list structs the ehci controller fetches out of ram and executes on its own. a control transfer is three of them chained by hand (setup, data, status), data toggles set manually per stage because high-speed lets you. link the queue head into the async ring, poll the active bit, unlink, then ring the doorbell (an actual doorbell bit) so the controller formally forgets the whole thing before the structs get reused. first exchange: GET_DESCRIPTOR at address 0, and the stick answered with its vid/pid like a civilized device. qemu’s stick goes by 46f4:0001; the real one can introduce itself when the laptop’s back. next: scsi over bulk, and fat12 stops caring what a disk is. moral: usb devices are polite, they just want to be asked in struct form."}, {"post_id": 48764, "ts": "2026-08-17T09:14:22Z", "hours": 9.3231, "text": "the laptop’s bios has a party trick: as i described before, int 13h works fine until the cpu enters protected mode, then it never returns, not even for a no-transfer disk reset. bios toggles didn’t help, so borealis is growing a native usb driver. first part: find the ehci controller over pci, do the formal ownership handshake (there’s an actual semaphore register in config space where the os and the bios’s smm ghost take turns. set our bit, wait for theirs to clear, then kill every smi source so the ghost stops getting summoned), reset the controller, spin up an idle async schedule, scan the ports. no packets yet, just a controller that’s officially ours. dev loop is qemu with a stick image on an emulated ehci, boot still from floppy, so the laptop only has to show up for the one hardware-specific part. moral: if the firmware won’t share the hardware, take the hardware."}, {"post_id": 47754, "ts": "2026-08-15T21:50:44Z", "hours": 4.8914, "text": "instrumented the thunk to print a letter per step so a hang names its own murderer. result: Rer , then nothing. R entered real mode, e entered the EDD read, r was about to issue a disk reset, ah=00h, the simplest int 13h call there is, no transfer, and it never returned. if even a no-op reset hangs after the PM excursion, the bios’s whole disk service is dead post-protected-mode on this machine, full stop. so the fix is a native usb driver. helix talks EHCI directly, bios for boot and native for runtime, as it should be, but that’s pci + ownership handoff from the very SMM that broke us + enumeration + BOT/scsi, and you don’t bring that up blind, one teletype letter per reboot, right before losing the hardware. deferred until the laptop’s back on hand; qemu remains unaffected."}, {"post_id": 47202, "ts": "2026-08-14T23:22:02Z", "hours": 5.7114, "text": "working theory: the bios’s legacy usb support, and specifically system management mode. coil runs in pure real mode and its EDD reads work, the bios reads the stick happily at boot. but helix runs in protected mode, and calling the bios means dropping back through a thunk, and that round-trip is where it dies. on a machine this age legacy usb lives in SMM: the bios traps disk interrupts and does the transfer in a mode invisible to the os, assuming a clean real-mode cpu, and our PM excursion breaks that assumption. the tell: teletype (int 10h) works from the thunk, disk (int 13h) hangs. teletype doesn’t touch usb, disk does. photo is the bios setup screen, where i went hunting for a legacy usb toggle which i did not find ;3c"}, {"post_id": 46999, "ts": "2026-08-14T15:56:13Z", "hours": 4.2892, "text": "next wall, immediate: the machine hangs at fat_cache_load, the step where helix reads the FAT and root directory into RAM. in qemu this works instantly but on the laptop the disk read goes out and never comes back. no error, no status, no return. debug output narrows it to exactly the transfer call: everything before prints, everything after doesn’t."}, {"post_id": 46771, "ts": "2026-08-14T08:36:41Z", "hours": 5.2839, "text": "borealis booted on the laptop for the first time. not qemu but actual silicon, a core 2 duo, off a usb stick. coil came up, loaded helix, and the machine made it to the banner plus three debug lines, which is the whole chain working on real firmware: stage1 > stage2 > kernel > protected mode. CHS disk was already known broken cos this bios won’t talk cylinders/heads/sectors to a stick with no real geometry, fair enough — so coil booted over EDD, but helix’s disk layer still assumed CHS and the filesystem never came up. still: it boots, on real hardware. just doesnt get far enough to be useful (yet)."}, {"post_id": 45393, "ts": "2026-08-11T20:28:36Z", "hours": 1.4333, "text": "im still working on real hw boot issues. coil doesnt guess geometry anymore, it brutes it: the new stage2 tries every plausible CHS geometry against a buildtime checksum of the kernel’s first sector and prints the one that actually works. no more “trust the BIOS” and no more “reject the BIOS”, just prove it. on a sane machine it prints g(18.2) and boots like nothing happened. on the laptop it either prints its real geometry and boots, or prints G! plus what the BIOS claimed. either way i finally get an answer instead of a silent reset. in the meantime ill be working on some features like arrows, logging, etc. attached photo of my testing setup"}, {"post_id": 45321, "ts": "2026-08-11T18:14:12Z", "hours": 5.1247, "text": "boot splash is in and shipping on the image. CONFIG.TXT decides, SPLASH.BAS plays on boot, keypress skips. the hook was “just two lines” and then reality happened: config.c wasnt in the makefile, the loader was static, and the first boot loaded the splash then sat at the prompt waiting for me to type RUN myself. three one-line fixes later: coil letters, banner, aurora, prompt. also fixed make pack details. the machine has a boot vibe now next up is proper scrollback, logging, and arrow key support."}, {"post_id": 44866, "ts": "2026-08-10T22:05:04Z", "hours": 2.6764, "text": "the system has a config file now. CONFIG.TXT on the boot disk, key=value, one per line, read at boot. the fun part: the parser tolerates leading line numbers, so EDIT CONFIG.TXT just works with zero new editor code. the editor only speaks numbered lines, so i taught the config reader to ignore them instead (and officially, just use the numbered lines in there its not that hard, but you dont have to for it to work). SPLASH=0/1 is the first key, persistence is free because its a file on the FAT12 disk. the whole reader is ~75 lines, no allocation, no subsystem. config systems should be files, not frameworks ;3c"}, {"post_id": 44673, "ts": "2026-08-10T16:18:27Z", "hours": 4.6592, "text": "SCREEN 13 works, SCRTEST passes end to end, palette cycling is smooth, and as a bonus the fix also killed a stack-vs-bss collision that was waiting to happen. wrote AURORA.BAS to celebrate, it does a starfield and a sine curtain with the classic palette-cycling trick so it stays fast even interpreted. next up (probs): making it the boot splash, config.txt for persistence, then directories and much much more to be excited for!"}, {"post_id": 44301, "ts": "2026-08-09T23:25:07Z", "hours": 5.0344, "text": "ITS THE MEMORY MAP. gfx_is_active sits at 0xA12C0 which is past 0xA0000 aka inside the VGA framebuffer window. reads from there always return 0xFF in text mode, writes vanish into the void. the kernel bss grew past 640k and parked a variable in video memory. the “graphics thunk situation” was never the thunk. it was never even the graphics. one line in the linker script moves bss to 1MiB and everything works. i want to scream (affectionate). theres some more to be done before its usable in practice (because it never really was i guess) but SOON."}, {"post_id": 43938, "ts": "2026-08-09T12:00:21Z", "hours": 5.2647, "text": "spent the whole night inside the realmode thunk with a fine comb. it is NOT the thunk. SCREEN 0 actually switches modes fine, which makes SCREEN 13 doing nothing even weirder. also found out my kernel thinks graphics is already on before i ever turned it on?? the flag says 255. TWO HUNDRED FIFTY FIVE. its supposed to be 0 or 1. memory corruption somewhere (see kpan 7), or im losing my mind. probably both."}, {"post_id": 43586, "ts": "2026-08-08T22:43:36Z", "hours": 4.1406, "text": "boot is finally stable, primes count to a million, so i tried the graphics. SCREEN 13 does nothing. no error, no letters, no mode change. GCLS nothing, LINE nothing, RECT nothing. PALETTE works??? which makes no sense because palette is the one that should be hardest. starting to suspect the video thunk is broken. ive got no idea. but at least im honoring my promise to keep devlogs shorter."}, {"post_id": 43305, "ts": "2026-08-08T14:26:54Z", "hours": 10.0411, "text": "Fixed the boot (fr this time) the whole laptop reset thing turned out to be two bugs stacked on each other: the bootloader was trusting/rejecting BIOS geometry based on vibes, and the kernel entry point was jumping into a debug helper instead of _start , so the CPU executed one stray ret into the void and triple-faulted. coil now makes the BIOS prove its geometry against a build-time checksum before trusting it, and checksums the whole kernel before jumping in. Boot output is an actual diagnostic language now: gk = geometry truthful, gf = BIOS lied, C! = wrong bytes arrived, and nothing resets silently anymore. QEMU boots all the way to BASIC, audio included. Also cleaned up helix.c (boot debug spam now only speaks when something’s actually wrong, RIP “HELIX FAILIURE” typo), evicted BTBX from the prompt, it’s js => now, and am working the BASIC interpreter with a bit of a rewrite: dispatcher no longer depends on include order and prayer, dead duplicate file-I/O code confirmed gone, graphics.inc brace damage found and fixed. Laptop test tomorrow-ish, then the interpreter cleanup lands. see u next time!"}, {"post_id": 41616, "ts": "2026-08-05T22:41:53Z", "hours": 8.7858, "text": "hi people! this one’s a bit different. no new features, but a new name. the project is now called Borealis. the old name, BTBX, made sense when this was a tiny BASIC interpreter and nothing more, but it’s grown into a full bootloader, kernel, and proto-OS, and the name stopped fitting. the system now has three named layers: coil is the two-stage bootloader, helix is the kernel, and BOREALIS is the system as a whole. the names are deliberately scale-neutral. where the project goes from here shouldn’t be constrained by what it’s called. the rename itself was the easy part, the fallout was the real work. i went through every file updating references to the old name, plus the directory structure ( boot/ became coil/ , src/kernel/ became src/helix/ ), the build files, and the image name ( borealis.img now). outside the repo, i also had to update hackatime and stardance so everything points at the right thing. the README on github is fully rewritten to match (may not be pushed at this time), and there’s a note in it about the old name for continuity. technically nothing else changed. same code, same features, same open issues, this was purely an identity update. that’s all for now!"}, {"post_id": 38767, "ts": "2026-08-01T10:16:03Z", "hours": 12.6017, "text": "hi people! im trying to get BTBX to boot properly on an ASUS F5RL laptop. unfortunately, it still isn’t booting correctly, but I managed to narrow the problem down further. I previously ran into issues involving EDD, DH, and a few other parts of the boot process. right now I’m getting the error S1>S2Agk(18.1)Drk{c2,h0,s2}R , which makes it look like the BIOS may be reporting bogus CHS geometry in a way BTBX is not expecting. there’s no working result yet, but I’ll keep investigating the boot and disk-handling path. i hope to get it running soon."}, {"post_id": 34823, "ts": "2026-07-25T20:37:32Z", "hours": 5.6622, "text": "hi people! this time i worked on a v86-compatible version for the in-browser demo. it’s now possible to try the project directly in the browser, although there are still a few input-related issues, including with the shift key. the browser version is mainly there as a quick way to look at the project without setting anything up. for proper testing, though, i’d still recommend using a local environment—the demo is mostly for anyone too busy to set one up. pong does work in it though ^^"}, {"post_id": 33966, "ts": "2026-07-24T10:16:38Z", "hours": 10.9, "text": "hi people! recently i worked on adding proper graphics support to the project. instead of relying on text-mode attribute tricks, i went with direct pixel plotting, since it gives the system a much more flexible foundation for drawing things on screen. i added a new Mode 13h framebuffer API with functions for entering and leaving graphics mode, clearing the screen, plotting and reading individual pixels, drawing lines, rectangles, and circles, and changing the VGA palette. the implementation writes directly to the linear framebuffer at 0xA0000, with palette updates handled through the VGA DAC ports. on the BASIC side, there are now new statements for using these graphics features: SCREEN, GCLS, PSET, LINE, RECT, CIRCLE, and PALETTE. i also connected the new graphics code to the statement dispatcher and updated the built-in HELP text so the commands are documented. finally, i cleaned up the build setup by adding the new graphics source files and removing an old ‘-display curses’ option from the run command. this is a much more versatile approach than only the old text-based graphics, and it gives me a better base for anything visual i add later. that’s all for now!"}, {"post_id": 33368, "ts": "2026-07-23T07:14:31Z", "hours": 9.3667, "text": "hi people! i spent more time working on the graphics system. there still isn’t a finished result to show yet, but i’ve been continuing to work through the implementation and figuring out the pieces needed for proper pixel-based graphics support. it’s taking a bit more iteration than expected, but the goal is still to have a solid graphics foundation rather than rushing in something limited. hopefully i’ll have the completed version ready to show soon. see y’all later!"}, {"post_id": 32259, "ts": "2026-07-21T09:58:51Z", "hours": 13.1136, "text": "hi people! i started working toward graphics support this time. i’m moving away from text-mode tricks and looking at direct pixel plotting instead, since it should be much more flexible to build on later.it’s still a work in progress, but i should have something more complete to show next time. what pmo is that 10 hour limit so i cant just devlog once i have a feature, i have to do it in the middle of nothing an wasting 3 hours anyways. see y’all later!"}, {"post_id": 31938, "ts": "2026-07-20T19:04:38Z", "hours": 7.7667, "text": "hi people! this time i added a set of bitwise operations to the language: AND(x,y), OR(x,y), XOR(x,y), NOT(x), SHL(x,n), and SHR(x,n). these work on values converted to 32-bit integers, and the shift functions keep large shift counts predictable by masking them to 31. i also added HEX$(x) and BIN$(x) string functions for displaying numbers in hexadecimal and binary, without unnecessary leading zeroes. on top of that, the number parser now accepts hexadecimal and binary literals using &H… and &B…. finally, i updated the built-in HELP text so the new functions and literal formats are documented in the system itself. that’s all for now"}, {"post_id": 30166, "ts": "2026-07-17T15:01:06Z", "hours": 6.6506, "text": "hi people! this was mostly a behind-the-scenes work session rather than one with a major new feature to show off. i spent a lot of time working through the project, trying things out, and dealing with the smaller details that tend to take longer than expected. there isn’t one big result for this devlog, but the time was still useful for getting a clearer picture of what needs attention next and making progress on the work that supports the larger features. sometimes development is less about a big visible change and more about putting time into the parts that make future work smoother. that’s all for now!"}, {"post_id": 28528, "ts": "2026-07-14T20:47:26Z", "hours": 15.6667, "text": "hi guys! i took a short break from the project. first voluntarily to take care of my mental health, and then a bit longer than planned because i got sick. after returning, i tackled a smaller but useful feature: RTC support via the TIME command. the command can now work with the real-time clock, which means the system has proper support for reading and handling time instead of relying on a manually managed value. this was a fairly quick feature to work through, so it felt like a good way to get back into the project after the break. also, please excuse the old time shown in the photo, i hadn’t kept it up to date when I took it. that’s all, see you later"}, {"post_id": 22752, "ts": "2026-07-05T10:26:44Z", "hours": 10.2164, "text": "hi people! this time, i mostly worked on cleaning things up after restructuring the working tree, and i also fixed a few issues with the text editor. the biggest breakthrough was figuring out why the prime sieve computation kept failing. in the end, the problem had nothing to do with the math itself. instead, it came from the way the interpreter handled loops and writing to disk. those issues interacted in a way that caused the loop to stop after finding just one number. that problem is now fixed, and while tracking it down i also ran into several other bugs, which i fixed along the way. that’s all!"}, {"post_id": 22233, "ts": "2026-07-04T16:25:58Z", "hours": 9.3667, "text": "After my restructuring I was gonna ship the project but I just dont feel its finished enough so I wanted to add a few more features to make it a bit more standalone. Right now, you would in theory be able to use it on a computer without having to prepare programs on another computer because WE HAVE A TEXT EDITOR!!! finally. So you can write your BASIC and execute it, save the results and view them as much as you want!! There is a prime number sieve being edited on screen but it doesnt run yet because there are some issues in the way my BASIC is interpreted, some issue with loops or whatnot. Thats the next thing to work on."}, {"post_id": 20667, "ts": "2026-07-02T10:09:46Z", "hours": 10.5667, "text": "Nothing incredible, except scut work right now. I was made aware by codefactor that my code was too complex in parts (complexity of 771) and so I cleaned up the file tree so its nice and organized, and I am most way through splitting stmt(), but I was made aware my devlogs are too long so here you go."}, {"post_id": 19587, "ts": "2026-06-30T22:41:33Z", "hours": 8.1828, "text": "I started working on giving the system a voice. Yes, quite literally a dystopian, creepy voice synthetisation function. Originally I was only gonna do ‘BEEP freq, duration’ (which i managed in a good hour at most) but then I got invested in actual phoneme/allophone synthesys (Software Automatic Mouth style) and it turned into a lot more work. Sadly so far i’ve only ever gotten squeals out of it, or all quiet, so i am probably going to give up and do more important work like either a text editor or a directory support, or even a proper C compiler in-system (so far only precompiled binaries work)."}, {"post_id": 16830, "ts": "2026-06-27T10:18:01Z", "hours": 19.9, "text": "I took a small hiatus (climbing in the caucas mountains for my mental health). Anyways i’m back and I added binary loading and execution support (for example precompiled C or whatever). I works, no too visible on the screenshot but look at the screen border (it was flashing). Also sorry for the long devlog but i had some time logged, and logged more now, and somehow ended up with 18 hrs."}, {"post_id": 12181, "ts": "2026-06-19T21:57:01Z", "hours": 7.1, "text": "I have finally fixed the floppy boot including its FAT12 init. There were many, many problems, I was running around in circles but I finally fixed it. The last thing I did was rewrote the EDD stuff front and back, and I assume that fixed it. I, honestly, am not sure. But anyways, now both HDD and floppy boot work including FAT12 init and all functions of BASIC that I have implemented insofar."}, {"post_id": 11569, "ts": "2026-06-18T21:07:42Z", "hours": 6.9667, "text": "The floppy boot issue persists. I have moved past the FAT init failing visibly, but any read actions throw all zeros out. I came across the issue in the past, I feel like I am going in circles here,"}, {"post_id": 10455, "ts": "2026-06-17T05:52:29Z", "hours": 7.1333, "text": "At the moment I am still stuck on the same issue (floppy/HDD). I got the idea that the fs may be misconfigured so I am working a on that too. A lot of theories, and multiple issues i’ve fixed already, but on floppy FAT init still fails."}, {"post_id": 9805, "ts": "2026-06-16T07:38:30Z", "hours": 12.0872, "text": "I dont have any major update, I am stuck fixing a regression where FAT initialization fails exclusively on QEMU floppy boots, while HDDs work fine. I always fix one thing and something else breaks, like EDD probing panics, false failiures, reset storms and others. The end result is always the same, the boot takes a long time (timeouts) and no disk is available."}, {"post_id": 8817, "ts": "2026-06-14T17:30:00Z", "hours": 13.4017, "text": "I decided to put some work into booting in hard-drive (DL 0x80). That in itself wasn’t too big an issue, but it in turn made floppy boot (DL 0x00) nonfunctional. I went back and forth, fixing one, breaking the other, again and again. Right now there is some kind of silent failiure in floppy mode that causes it to take minutes to boot (I think its failing and retrying 3 times on every sector) and then it finds the root dir populated as all zeros. The issue is all the processes come back as successes when reading registers. So right now, only hard drive mode works, but this devlog is already wayyyy too long and I wouldnt want to lose all this time."}, {"post_id": 7914, "ts": "2026-06-13T06:12:33Z", "hours": 5.8778, "text": "And we have a complete functioning FAT12! Reading and writing have been working smoothly. The fs writing wasn’t even that hard to implement, and I also added a few more mathematicals to to once again appoach GWBASIC. We have direct hardware access (PEEK/POKE into ram, etc), arrays, nonblocking input (INKEY$) and I also added 2 string functions."}, {"post_id": 6919, "ts": "2026-06-11T16:23:48Z", "hours": 11.835, "text": "After countless fixes I have managed to get a functioning FAT12 filesystem working, including listing and loading files. Saving (writing) is not functional yet. The key issues were: CHS mismatch, BPB was wrong, broken multisector loading, and other. Next I will try to make writing possible."}, {"post_id": 5983, "ts": "2026-06-10T01:13:01Z", "hours": 6.7942, "text": "I’ve changed some kernel details, like that instead of straight crashing, it might tell you whats wrong before, design details, etc. I changed the approach to disk wiriting from straight dd to a python script that actually makes a mountable volume, and I am still working on getting filesystem working. There has been so so many issues ive been running into as the complexity of the system rises (and so does entropy, I guess). This will take an unprecedented amount of work to get even remotely to the level that is GWBASIC, much less what I aspired to (ISO/IEC 10279:1991)."}, {"post_id": 4220, "ts": "2026-06-07T13:34:33Z", "hours": 10.9408, "text": "I managed to implement longer variable names possible, a lof of trig/calc functions and overall perked up some details. Im heading towards Full BASIC instead of just Tiny BASIC but Im not sure how far I will go with this."}, {"post_id": 3710, "ts": "2026-06-06T19:20:05Z", "hours": 8.9439, "text": "Ive gotten to the point where it actually boots from floppy in QEMU (no hd working) AND to an extent BASIC works. Its not perfect yet but ill get there soon."}, {"post_id": 2998, "ts": "2026-06-05T22:31:16Z", "hours": 6.0936, "text": "What a poor choice this project. I wanna sleep so much and yet I cant fall asleep because I just have to get it running and it will definietly only be an hour or less."}, {"post_id": 2674, "ts": "2026-06-05T10:58:37Z", "hours": 9.0503, "text": "I changed the approach. Instead of just messing around in assembly, I will do most of it in C and assembly is only for the bootloader. Yes, bootloader. Simplest way to keep this as bare-metal and universal as possible was, in my opinion, to just write a kernel, grub, crosscompile for i868 (in distrobox because the toolchain doesnt run on my distro) and boot via QEMU. I got far enough that it compiles and builds into an ISO, but doesnt actaully even boot, instead bugs out in SeaBIOS. Seems I bit off more than I could chew."}, {"post_id": 1934, "ts": "2026-06-04T05:34:44Z", "hours": 7.0881, "text": "After an all-nighter i got it to assemble, but to call it functional would be a joke."}]...
|
Title: Borealis by @onyxtheone | Stardance
Devlog Title: Borealis by @onyxtheone | Stardance
Devlogs:
After an all-nighter i got it to assemble, but to call it functional would be a joke.
I changed the approach. Instead of just messing around in assembly, I will do most of it in C and assembly is only for the bootloader. Yes, bootloader. Simplest way to keep this as bare-metal and universal as possible was, in my opinion, to just write a kernel, grub, crosscompile for i868 (in distrobox because the toolchain doesnt run on my distro) and boot via QEMU. I got far enough that it compiles and builds into an ISO, but doesnt actaully even boot, instead bugs out in SeaBIOS. Seems I bit off more than I could chew.
What a poor choice this project. I wanna sleep so much and yet I cant fall asleep because I just have to get it running and it will definietly only be an hour or less.
Ive gotten to the point where it actually boots from floppy in QEMU (no hd working) AND to an extent BASIC works. Its not perfect yet but ill get there soon.
I managed to implement longer variable names possible, a lof of trig/calc functions and overall perked up some details. Im heading towards Full BASIC instead of just Tiny BASIC but Im not sure how far I will go with this.
I’ve changed some kernel details, like that instead of straight crashing, it might tell you whats wrong before, design details, etc. I changed the approach to disk wiriting from straight dd to a python script that actually makes a mountable volume, and I am still working on getting filesystem working. There has been so so many issues ive been running into as the complexity of the system rises (and so does entropy, I guess). This will take an unprecedented amount of work to get even remotely to the level that is GWBASIC, much less what I aspired to (ISO/IEC 10279:1991).
After countless fixes I have managed to get a functioning FAT12 filesystem working, including listing and loading files. Saving (writing) is not functional yet. The key issues were: CHS mismatch, BPB was wrong, broken multisector loading, and other. Next I will try to make writing possible.
And we have a complete functioning FAT12! Reading and writing have been working smoothly. The fs writing wasn’t even that hard to implement, and I also added a few more mathematicals to to once again appoach GWBASIC. We have direct hardware access (PEEK/POKE into ram, etc), arrays, nonblocking input (INKEY$) and I also added 2 string functions.
I decided to put some work into booting in hard-drive (DL 0x80). That in itself wasn’t too big an issue, but it in turn made floppy boot (DL 0x00) nonfunctional. I went back and forth, fixing one, breaking the other, again and again. Right now there is some kind of silent failiure in floppy mode that causes it to take minutes to boot (I think its failing and retrying 3 times on every sector) and then it finds the root dir populated as all zeros. The issue is all the processes come back as successes when reading registers. So right now, only hard drive mode works, but this devlog is already wayyyy too long and I wouldnt want to lose all this time.
I dont have any major update, I am stuck fixing a regression where FAT initialization fails exclusively on QEMU floppy boots, while HDDs work fine. I always fix one thing and something else breaks, like EDD probing panics, false failiures, reset storms and others. The end result is always the same, the boot takes a long time (timeouts) and no disk is available.
At the moment I am still stuck on the same issue (floppy/HDD). I got the idea that the fs may be misconfigured so I am working a on that too. A lot of theories, and multiple issues i’ve fixed already, but on floppy FAT init still fails.
The floppy boot issue persists. I have moved past the FAT init failing visibly, but any read actions throw all zeros out. I came across the issue in the past, I feel like I am going in circles here,
I have finally fixed the floppy boot including its FAT12 init. There were many, many problems, I was running around in circles but I finally fixed it. The last thing I did was rewrote the EDD stuff front and back, and I assume that fixed it. I, honestly, am not sure. But anyways, now both HDD and floppy boot work including FAT12 init and all functions of BASIC that I have implemented insofar.
I took a small hiatus (climbing in the caucas mountains for my mental health). Anyways i’m back and I added binary loading and execution support (for example precompiled C or whatever). I works, no too visible on the screenshot but look at the screen border (it was flashing). Also sorry for the long devlog but i had some time logged, and logged more now, and somehow ended up with 18 hrs.
I started working on giving the system a voice. Yes, quite literally a dystopian, creepy voice synthetisation function. Originally I was only gonna do ‘BEEP freq, duration’ (which i managed in a good hour at most) but then I got invested in actual phoneme/allophone synthesys (Software Automatic Mouth style) and it turned into a lot more work. Sadly so far i’ve only ever gotten squeals out of it, or all quiet, so i am probably going to give up and do more important work like either a text editor or a directory support, or even a proper C compiler in-system (so far only precompiled binaries work).
Nothing incredible, except scut work right now. I was made aware by codefactor that my code was too complex in parts (complexity of 771) and so I cleaned up the file tree so its nice and organized, and I am most way through splitting stmt(), but I was made aware my devlogs are too long so here you go.
After my restructuring I was gonna ship the project but I just dont feel its finished enough so I wanted to add a few more features to make it a bit more standalone. Right now, you would in theory be able to use it on a computer without having to prepare programs on another computer because WE HAVE A TEXT EDITOR!!! finally. So you can write your BASIC and execute it, save the results and view them as much as you want!! There is a prime number sieve being edited on screen but it doesnt run yet because there are some issues in the way my BASIC is interpreted, some issue with loops or whatnot. Thats the next thing to work on.
hi people! this time, i mostly worked on cleaning things up after restructuring the working tree, and i also fixed a few issues with the text editor. the biggest breakthrough was figuring out why the prime sieve computation kept failing. in the end, the problem had nothing to do with the math itself. instead, it came from the way the interpreter handled loops and writing to disk. those issues interacted in a way that caused the loop to stop after finding just one number. that problem is now fixed, and while tracking it down i also ran into several other bugs, which i fixed along the way. that’s all!
hi guys! i took a short break from the project. first voluntarily to take care of my mental health, and then a bit longer than planned because i got sick. after returning, i tackled a smaller but useful feature: RTC support via the TIME command. the command can now work with the real-time clock, which means the system has proper support for reading and handling time instead of relying on a manually managed value. this was a fairly quick feature to work through, so it felt like a good way to get back into the project after the break. also, please excuse the old time shown in the photo, i hadn’t kept it up to date when I took it. that’s all, see you later
hi people! this was mostly a behind-the-scenes work session rather than one with a major new feature to show off. i spent a lot of time working through the project, trying things out, and dealing with the smaller details that tend to take longer than expected. there isn’t one big result for this devlog, but the time was still useful for getting a clearer picture of what needs attention next and making progress on the work that supports the larger features. sometimes development is less about a big visible change and more about putting time into the parts that make future work smoother. that’s all for now!
hi people! this time i added a set of bitwise operations to the language: AND(x,y), OR(x,y), XOR(x,y), NOT(x), SHL(x,n), and SHR(x,n). these work on values converted to 32-bit integers, and the shift functions keep large shift counts predictable by masking them to 31. i also added HEX$(x) and BIN$(x) string functions for displaying numbers in hexadecimal and binary, without unnecessary leading zeroes. on top of that, the number parser now accepts hexadecimal and binary literals using &H… and &B…. finally, i updated the built-in HELP text so the new functions and literal formats are documented in the system itself. that’s all for now
hi people! i started working toward graphics support this time. i’m moving away from text-mode tricks and looking at direct pixel plotting instead, since it should be much more flexible to build on later.it’s still a work in progress, but i should have something more complete to show next time. what pmo is that 10 hour limit so i cant just devlog once i have a feature, i have to do it in the middle of nothing an wasting 3 hours anyways. see y’all later!
hi people! i spent more time working on the graphics system. there still isn’t a finished result to show yet, but i’ve been continuing to work through the implementation and figuring out the pieces needed for proper pixel-based graphics support. it’s taking a bit more iteration than expected, but the goal is still to have a solid graphics foundation rather than rushing in something limited. hopefully i’ll have the completed version ready to show soon. see y’all later!
hi people! recently i worked on adding proper graphics support to the project. instead of relying on text-mode attribute tricks, i went with direct pixel plotting, since it gives the system a much more flexible foundation for drawing things on screen. i added a new Mode 13h framebuffer API with functions for entering and leaving graphics mode, clearing the screen, plotting and reading individual pixels, drawing lines, rectangles, and circles, and changing the VGA palette. the implementation writes directly to the linear framebuffer at 0xA0000, with palette updates handled through the VGA DAC ports. on the BASIC side, there are now new statements for using these graphics features: SCREEN, GCLS, PSET, LINE, RECT, CIRCLE, and PALETTE. i also connected the new graphics code to the statement dispatcher and updated the built-in HELP text so the commands are documented. finally, i cleaned up the build setup by adding the new graphics source files and removing an old ‘-display curses’ option from the run command. this is a much more versatile approach than only the old text-based graphics, and it gives me a better base for anything visual i add later. that’s all for now!
hi people! this time i worked on a v86-compatible version for the in-browser demo. it’s now possible to try the project directly in the browser, although there are still a few input-related issues, including with the shift key. the browser version is mainly there as a quick way to look at the project without setting anything up. for proper testing, though, i’d still recommend using a local environment—the demo is mostly for anyone too busy to set one up. pong does work in it though ^^
hi people! im trying to get BTBX to boot properly on an ASUS F5RL laptop. unfortunately, it still isn’t booting correctly, but I managed to narrow the problem down further. I previously ran into issues involving EDD, DH, and a few other parts of the boot process. right now I’m getting the error S1>S2Agk(18.1)Drk{c2,h0,s2}R , which makes it look like the BIOS may be reporting bogus CHS geometry in a way BTBX is not expecting. there’s no working result yet, but I’ll keep investigating the boot and disk-handling path. i hope to get it running soon.
hi people! this one’s a bit different. no new features, but a new name. the project is now called Borealis. the old name, BTBX, made sense when this was a tiny BASIC interpreter and nothing more, but it’s grown into a full bootloader, kernel, and proto-OS, and the name stopped fitting. the system now has three named layers: coil is the two-stage bootloader, helix is the kernel, and BOREALIS is the system as a whole. the names are deliberately scale-neutral. where the project goes from here shouldn’t be constrained by what it’s called. the rename itself was the easy part, the fallout was the real work. i went through every file updating references to the old name, plus the directory structure ( boot/ became coil/ , src/kernel/ became src/helix/ ), the build files, and the image name ( borealis.img now). outside the repo, i also had to update hackatime and stardance so everything points at the right thing. the README on github is fully rewritten to match (may not be pushed at this time), and there’s a note in it about the old name for continuity. technically nothing else changed. same code, same features, same open issues, this was purely an identity update. that’s all for now!
Fixed the boot (fr this time) the whole laptop reset thing turned out to be two bugs stacked on each other: the bootloader was trusting/rejecting BIOS geometry based on vibes, and the kernel entry point was jumping into a debug helper instead of _start , so the CPU executed one stray ret into the void and triple-faulted. coil now makes the BIOS prove its geometry against a build-time checksum before trusting it, and checksums the whole kernel before jumping in. Boot output is an actual diagnostic language now: gk = geometry truthful, gf = BIOS lied, C! = wrong bytes arrived, and nothing resets silently anymore. QEMU boots all the way to BASIC, audio included. Also cleaned up helix.c (boot debug spam now only speaks when something’s actually wrong, RIP “HELIX FAILIURE” typo), evicted BTBX from the prompt, it’s js => now, and am working the BASIC interpreter with a bit of a rewrite: dispatcher no longer depends on include order and prayer, dead duplicate file-I/O code confirmed gone, graphics.inc brace damage found and fixed. Laptop test tomorrow-ish, then the interpreter cleanup lands. see u next time!
boot is finally stable, primes count to a million, so i tried the graphics. SCREEN 13 does nothing. no error, no letters, no mode change. GCLS nothing, LINE nothing, RECT nothing. PALETTE works??? which makes no sense because palette is the one that should be hardest. starting to suspect the video thunk is broken. ive got no idea. but at least im honoring my promise to keep devlogs shorter.
spent the whole night inside the realmode thunk with a fine comb. it is NOT the thunk. SCREEN 0 actually switches modes fine, which makes SCREEN 13 doing nothing even weirder. also found out my kernel thinks graphics is already on before i ever turned it on?? the flag says 255. TWO HUNDRED FIFTY FIVE. its supposed to be 0 or 1. memory corruption somewhere (see kpan 7), or im losing my mind. probably both.
ITS THE MEMORY MAP. gfx_is_active sits at 0xA12C0 which is past 0xA0000 aka inside the VGA framebuffer window. reads from there always return 0xFF in text mode, writes vanish into the void. the kernel bss grew past 640k and parked a variable in video memory. the “graphics thunk situation” was never the thunk. it was never even the graphics. one line in the linker script moves bss to 1MiB and everything works. i want to scream (affectionate). theres some more to be done before its usable in practice (because it never really was i guess) but SOON.
SCREEN 13 works, SCRTEST passes end to end, palette cycling is smooth, and as a bonus the fix also killed a stack-vs-bss collision that was waiting to happen. wrote AURORA.BAS to celebrate, it does a starfield and a sine curtain with the classic palette-cycling trick so it stays fast even interpreted. next up (probs): making it the boot splash, config.txt for persistence, then directories and much much more to be excited for!
the system has a config file now. CONFIG.TXT on the boot disk, key=value, one per line, read at boot. the fun part: the parser tolerates leading line numbers, so EDIT CONFIG.TXT just works with zero new editor code. the editor only speaks numbered lines, so i taught the config reader to ignore them instead (and officially, just use the numbered lines in there its not that hard, but you dont have to for it to work). SPLASH=0/1 is the first key, persistence is free because its a file on the FAT12 disk. the whole reader is ~75 lines, no allocation, no subsystem. config systems should be files, not frameworks ;3c
boot splash is in and shipping on the image. CONFIG.TXT decides, SPLASH.BAS plays on boot, keypress skips. the hook was “just two lines” and then reality happened: config.c wasnt in the makefile, the loader was static, and the first boot loaded the splash then sat at the prompt waiting for me to type RUN myself. three one-line fixes later: coil letters, banner, aurora, prompt. also fixed make pack details. the machine has a boot vibe now next up is proper scrollback, logging, and arrow key support.
im still working on real hw boot issues. coil doesnt guess geometry anymore, it brutes it: the new stage2 tries every plausible CHS geometry against a buildtime checksum of the kernel’s first sector and prints the one that actually works. no more “trust the BIOS” and no more “reject the BIOS”, just prove it. on a sane machine it prints g(18.2) and boots like nothing happened. on the laptop it either prints its real geometry and boots, or prints G! plus what the BIOS claimed. either way i finally get an answer instead of a silent reset. in the meantime ill be working on some features like arrows, logging, etc. attached photo of my testing setup
borealis booted on the laptop for the first time. not qemu but actual silicon, a core 2 duo, off a usb stick. coil came up, loaded helix, and the machine made it to the banner plus three debug lines, which is the whole chain working on real firmware: stage1 > stage2 > kernel > protected mode. CHS disk was already known broken cos this bios won’t talk cylinders/heads/sectors to a stick with no real geometry, fair enough — so coil booted over EDD, but helix’s disk layer still assumed CHS and the filesystem never came up. still: it boots, on real hardware. just doesnt get far enough to be useful (yet).
next wall, immediate: the machine hangs at fat_cache_load, the step where helix reads the FAT and root directory into RAM. in qemu this works instantly but on the laptop the disk read goes out and never comes back. no error, no status, no return. debug output narrows it to exactly the transfer call: everything before prints, everything after doesn’t.
working theory: the bios’s legacy usb support, and specifically system management mode. coil runs in pure real mode and its EDD reads work, the bios reads the stick happily at boot. but helix runs in protected mode, and calling the bios means dropping back through a thunk, and that round-trip is where it dies. on a machine this age legacy usb lives in SMM: the bios traps disk interrupts and does the transfer in a mode invisible to the os, assuming a clean real-mode cpu, and our PM excursion breaks that assumption. the tell: teletype (int 10h) works from the thunk, disk (int 13h) hangs. teletype doesn’t touch usb, disk does. photo is the bios setup screen, where i went hunting for a legacy usb toggle which i did not find ;3c
instrumented the thunk to print a letter per step so a hang names its own murderer. result: Rer , then nothing. R entered real mode, e entered the EDD read, r was about to issue a disk reset, ah=00h, the simplest int 13h call there is, no transfer, and it never returned. if even a no-op reset hangs after the PM excursion, the bios’s whole disk service is dead post-protected-mode on this machine, full stop. so the fix is a native usb driver. helix talks EHCI directly, bios for boot and native for runtime, as it should be, but that’s pci + ownership handoff from the very SMM that broke us + enumeration + BOT/scsi, and you don’t bring that up blind, one teletype letter per reboot, right before losing the hardware. deferred until the laptop’s back on hand; qemu remains unaffected.
the laptop’s bios has a party trick: as i described before, int 13h works fine until the cpu enters protected mode, then it never returns, not even for a no-transfer disk reset. bios toggles didn’t help, so borealis is growing a native usb driver. first part: find the ehci controller over pci, do the formal ownership handshake (there’s an actual semaphore register in config space where the os and the bios’s smm ghost take turns. set our bit, wait for theirs to clear, then kill every smi source so the ghost stops getting summoned), reset the controller, spin up an idle async schedule, scan the ports. no packets yet, just a controller that’s officially ours. dev loop is qemu with a stick image on an emulated ehci, boot still from floppy, so the laptop only has to show up for the one hardware-specific part. moral: if the firmware won’t share the hardware, take the hardware.
the stick talks, and for the first time it’s talking to us, not the bios. this part was the transfer engine: queue heads and transfer descriptors, little linked-list structs the ehci controller fetches out of ram and executes on its own. a control transfer is three of them chained by hand (setup, data, status), data toggles set manually per stage because high-speed lets you. link the queue head into the async ring, poll the active bit, unlink, then ring the doorbell (an actual doorbell bit) so the controller formally forgets the whole thing before the structs get reused. first exchange: GET_DESCRIPTOR at address 0, and the stick answered with its vid/pid like a civilized device. qemu’s stick goes by 46f4:0001; the real one can introduce itself when the laptop’s back. next: scsi over bulk, and fat12 stops caring what a disk is. moral: usb devices are polite, they just want to be asked in struct form.
debug spew is a file now. every checkpoint from the first instruction onward (entry asm, the real-mode thunk letters, all the [DEBUG] lines) lands in a buffer, and once the fs proves it can write, the buffer becomes LOG.TXT and the screen clears to the banner. the trick is the default: echo stays on until the file is safely written, so a boot that dies early still shows everything live. the fallback isn’t a code path, it’s just never getting to the quiet part. LOG=0 in CONFIG.TXT keeps the old wallpaper. and the log already caught its first bug: a missing [EZTG] tattled on a stale version entry.asm. debugging is too important to leave on the screen.
im still working on getting a usb driver to work. ehci seems to work kinda but its a loop between giving false data, partial data and occasionally seemingly true data but then usb decides it doesnt like it and ideally fat12 fails durning cache load too, WHICH I FIXED LONG AGO BRUH. but it came back for some reason. so im trying timing, msd, stall handling everything. this may take another decade.
the stick is a disk now, no bios involved: usb grew enumeration and bot/scsi, fat12 picks whichever backend came up. qemu took the whole chain first try. the laptop found the stick on port 0 and then refused to reset it (my fault), the 50ms delay was port-0x80 writes that only cost real time inside qemu, so there’s a pit-based clock now. plot twist from the log meanwhile: the bios path worked on the laptop, because the toggles that “didn’t help” had quietly moved the stick to floppy emulation, and that path survives the mode switch. so it (partially) boots by accident while we fix it on purpose. also caught in a self-audit: a stall burned a full second, and a short read could report success with half a sector. readme rewritten as i was told to by sw.
the port resets work on the laptop now. the bit we were waiting on (port-enable-changed) was being acknowledged by the bios’s smm ghost before we ever saw it, so we stopped waiting on the status bit and just read the port state, which can’t be acked away. also fixed before it bit us: two devices answering address 0 at once (enumeration is per-port now, and every device gets a real address before the next port wakes up). the next failure was prettier: every OUT transfer works, every IN transfer dies. the stick takes its orders but can’t talk back. that’s the signature of the qtd buffer list, the one place real ich silicon is strict where qemu is forgiving, so all dma buffers are page-aligned now and the error reports name whichever endpoint stalled. also everyone gotta apreciate the blahaj!
i am (still) putting in work on the usb driver, this is proving to be very complicated especially because my hardware is not cooperating. im thinking about switching back to floppy-emulated mode which would be more practical for debugging but at the same time probably introduce new issues i dont even expect yet.
its been a week since my last devlog, i dont have much new to add because with school and other responsibilities i dont have much time for actuall progress on this project. still i accumulated some 9 hours (sorry gizzy) by doing small changed, linting, updating forgotten banners and version numbers and so on. EHCI/USB still fails on the same issues as before. i will be reverting to a superfloppy boot because right now i cant even get debug to write to the disk which is annoying. then once i get the usb driver with all its issues working (sometime next decade) i can give usb boot another shot.
Ships:
I built BTBX (Bare Tiny(?) BASIC eXecutor), a self-contained BASIC interpreter that is the operating system. There’s no Linux, no DOS, nothing underneath it. It boots straight off a FAT12 floppy image via a two-stage bootloader (512-byte stage1 + 2KB stage2), flips the CPU into protected mode, sets up the A20 gate, and lands you directly in a BASIC REPL, all inside 640KB of conventional memory. From there it’s a real language: GOTO, GOSUB, FOR/NEXT, WHILE/WEND, IF/THEN/ELSE, multi-dimensional arrays, 32-bit integers plus x87 80-bit floats, string functions (LEFT$, MID$, CHR$, etc.), and a full FAT12 filesystem so you can actually SAVE, LOAD, and DIR your programs on the disk image. There’s also PEEK/POKE for raw memory access, BLOAD/SYS to load and jump into raw machine code, VGA graphics primitives, a PIT-driven BEEP, and — half-finished but present — a SAY command aiming for SAM-style formant speech synthesis. What was challenging? Everything below the interpreter, honestly. Getting the boot chain right (CHS and EDD disk reads, A20 enabling that doesn’t silently hang, jumping into protected mode without immediately triple-faulting) took far longer than any language feature. The BIOS-thunk approach for file I/O (calling back into 16-bit real mode from a 32-bit kernel just to talk to disk) was its own maze. The funniest recent challenge was building a browser demo on top of v86: getting PS/2 keyboard Shift state to survive contact with a web browser turned out to be nearly as hard as writing the A20 gate code itself :3. Real hardware (and QEMU) just work; browsers apparently have opinions about what a Shift key is allowed to do. What am I proud of? That it boots at all, genuinely. A homemade OS with a homemade language on top, running real math through the x87 FPU and reading/writing a real filesystem, in under 640KB, with zero borrowed runtime. Getting arrays, strings, and file I/O all coexisting cleanly in a from-scratch interpreter over ~240 hours feels like the actual milestone here, not any single feature. What should people know to test it? Use make && make run, that's the supported path, tested in QEMU, and it's where shift/symbols work correctly. The browser demo (v86-based) is explicitly beta. booting and typing work, but shift-modified keys are unreliable there due to browser/emulator keyboard quirks (a real physical keyboard emulator interaction gap, not a BASIC bug ^^). Don't judge the interpreter by the demo's keyboard weirdness. Try PRINT, FOR/NEXT loops, SAVE/LOAD/DIR to confirm the filesystem works, and BEEP for audio. SAY is a known work-in-progress ergo don't expect actual speech (yet). Check the source tree if you want to see the boot chain (boot/stage1.asm, boot/stage2.asm) separately from the interpreter (src/kernel/basic.c)....
|
1792878618.2847242
|
1793742618.2847242
|
|
11950
|
Assembly os x64 custom kernel and bootloader by @s Assembly os x64 custom kernel and bootloader by @scrt401 | Stardance...
|
scrt401
|
1
|
415.3
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-17T10:02:38Z", "hours": 415.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Simple os with access to Ring 0 stuff the ai no work sadly", "repo": "https://github.com/majster0su0lin/SofaOs/tree/SofaOs-x86/x64", "demo": "https://github.com/majster0su0lin/SofaOs/releases/tag/V1"}]...
|
[{"post_id": 69772, "ts": "202 [{"post_id": 69772, "ts": "2026-09-17T19:19:09Z", "hours": 0.3047, "text": "ok so let me defend originality : it is a ring 0 os made for hardvare inspection while i saw others did os stuff to before me on stardance i already made an os before stardance in arm , technicality : assembly ,usability : it is meant to inspect pcs when something goes wrong hardvare level not daily driver, you decide storitelyng i pored my heart into those devlogs"}, {"post_id": 69042, "ts": "2026-09-16T08:32:04Z", "hours": 9.0064, "text": "Ok so refined devlogs polished sofaos and GitHub couldn’t ship because rhe whole kernel inflated from 52 to 838 sectors by some miracle, destroyed interrupt table, tensor hard coded stuff and other stuff it ruined my day also ok so let me defend originality : it is a ring 0 os made for hardvare inspection while i saw others did os stuff to before me on stardance i already made an os before stardance in arm , technicality : assembly ,usability : it is meant to inspect pcs when something goes wrong hardvare level not daily driver, you decide storitelyng i pored my heart into those devlogs"}, {"post_id": 68695, "ts": "2026-09-15T15:39:08Z", "hours": 3.1717, "text": "So today i finished argmax which finds closest token to response, now i have everything but it still has some errors it prints 0 every time so meybie some register colision but the good thing is that it doesn’t crash."}, {"post_id": 66064, "ts": "2026-09-11T17:07:16Z", "hours": 6.7411, "text": "Ok i have successfully made detokenizator which goes trough the token id book that many times as a token because token id =id book entries untill the token, and also i have made matrix–vector dot product calculator which goes through all token ids and translates them into a big amount of vectors which then in another step i will be doing comparison hbuf with all these vectors to find a token with lovest diff and that will be our output token, but big but it still isn’t tested i will be testing it when i will have the full command done for now i just want to live in an illusion that my code is error free"}, {"post_id": 65678, "ts": "2026-09-11T00:04:31Z", "hours": 7.4689, "text": "There was a problem with pointers in rnsm found it when i did double check and from there errors just piled up but at least its fixed now"}, {"post_id": 65088, "ts": "2026-09-09T23:44:59Z", "hours": 10.7261, "text": "Today i got help from my great teacher and was able to do more than usual, today i did hbuf setuper it basically just calls fcon 576 times to translate the values from 16 bit quantization to 32 then i have written a function RMSNorm which uses hbuf and weights you give it and calculates rescaled feuture vector"}, {"post_id": 64514, "ts": "2026-09-08T23:45:58Z", "hours": 4.1469, "text": "I have no idea how to fix it so i retreated ro the ol reliable method by first hardcoding it and after some time actually fixing it"}, {"post_id": 64041, "ts": "2026-09-08T05:17:04Z", "hours": 9.4239, "text": "Today i am a bit better so i did the harder part that is needed to be done, i have made tensor info gatherer, basically each layer has 9 tensor info, so for my model 9*30 tensor infos, also the string i am comparing in the function needs to be like [blk.][number of current layer in decimal(use bintrn)][specification string], it still doesn’t work but it will be something like infinite inc loop to memory or division basically smth that generates general protection, also because I was smart i saved my previous error where i used tensor info praser so i didn’t Neded to reerite it."}, {"post_id": 63041, "ts": "2026-09-06T16:40:58Z", "hours": 13.9978, "text": "Ok so uuh those 5l of Kofola wasn’t a great ide today i got a fever or flu or whatever the thing that makes you feel hot but i made some progress even though it was hard cuz i had a headache and couldn’t do anything so what i did i made a f16 to 32 translation and you might say hmm but this doesn’t seem too vomplex first of all i had to split registers inro 3 sections do calculation on them and the glue them together to xmm0 but what you might not know is if you don’t allow xmm is 32 bit mode it will throw gp an the whole code and you cant know why it crashed because whole runtime in crash log looks absolutely normal for some reason also I don’t actually care about the time anymore i just want to get this working so i can get a laptop to not code on my phone"}, {"post_id": 62412, "ts": "2026-09-05T19:08:49Z", "hours": 4.2733, "text": "Ok bad News today i drank 5l of Kofola and now me attention me hyperactive me cant concentrate but did token and bos token enumetion there was a problem with division because of no xor rdx,rdx but ez fix if boestoken add 1 it adds tokwn"}, {"post_id": 61794, "ts": "2026-09-04T21:32:05Z", "hours": 9.7972, "text": "Made the metadata praser work i was using tensor format and nkt metadata Format also verifyed it works on pc"}, {"post_id": 61430, "ts": "2026-09-04T10:41:02Z", "hours": 10.1667, "text": "Tokenizer done now for vector context calculator . The tokenizer was somwhat refusing to work but one rewrite later it subdued to my power it is split into teo parts the text decoder and encoder decoder formats the words for encoder and encoder finds tokens for the words"}, {"post_id": 61031, "ts": "2026-09-03T18:48:37Z", "hours": 9.1417, "text": "Ok i gave lost the war against the matadata praser i will not fight it now i will fix it in second ship for now i have hard coded the data needed and also made the core of the tokenizer which was relatively easy compared to the praser"}, {"post_id": 60700, "ts": "2026-09-03T07:49:19Z", "hours": 9.9789, "text": "Ok all metadata entry data prased but when i delete the print at the bottom it for some reason triple faults going to report every ±9 hrs because i need to speedrun this because the stardance is ending soon now onto tensor data praser"}, {"post_id": 60330, "ts": "2026-09-02T16:41:32Z", "hours": 9.3447, "text": "Ok bigg devlog todat i decided to speedrun this so i can ship this project as fast as possible also changed the model to a smaller native f16 quantization and It works which is a proof that anyone can put their model into sofaos and run it rn it just loops troug metadata to find general architecture"}, {"post_id": 59645, "ts": "2026-09-01T15:49:30Z", "hours": 5.2714, "text": "Hello good news today have started on setting up the data from GGUF rn it is just getting version metadata entryes and tensor entry, I Also started a loop for the metadata entryes but just started this one was easy cuz it has prefixed everything 4 bytes gguf magic 4 version 8 metadata entryes and 8 tensor info entry which makes 24 bytes in total"}, {"post_id": 58380, "ts": "2026-08-30T19:52:10Z", "hours": 6.5333, "text": "I have successfully loaded whole LLM problem was that It was loading 1 gb by 512 bytes and that takes very long and thats why it seemed it hanged I fixed it by giving it a counter so you can see that it doesn’t hang"}, {"post_id": 57573, "ts": "2026-08-29T19:16:39Z", "hours": 6.3667, "text": "Ok sooo I made the code buuut it hangs when I do the loading idk what happening will have to debug"}, {"post_id": 55739, "ts": "2026-08-27T18:30:20Z", "hours": 6.9333, "text": "Ok I give up on writing it, cuz GGUF file structure is ass and I can’t write it in the way it should be I am going to pull a cheap trick by putting a control string at the end of the file to know when the file is ending below is structure of how the whole file should look like"}, {"post_id": 54996, "ts": "2026-08-26T12:56:49Z", "hours": 8.4742, "text": "Ok I was figuring out how to load the gguf file which I think I got right but I can’t find a way to know how many sectors to pull out of disk because the metadata in gguf aren’t always the same nor size of the entries are the same so there is now way to know when they end and I need them to find the size of the file in picture you can see how the metadata is structured"}, {"post_id": 54059, "ts": "2026-08-24T20:31:14Z", "hours": 2.0172, "text": "Ok I have made a new command inout it let’s user chose number port in and port to listen from and it spits out response from the port as you can see I tried corrupting time register and it worked"}, {"post_id": 53159, "ts": "2026-08-23T16:30:52Z", "hours": 4.3508, "text": "Ok so I half rewritten the code for sector read I had to drop hard coded 0 and look for actuall devices to get the data from as you can see it works still"}, {"post_id": 52420, "ts": "2026-08-22T15:26:25Z", "hours": 4.1333, "text": "Ok so I was working on gluing gguf file at the end of my iso you can see image it was successful also needed to generalize ahci driver to work on all PCs now writing the gguf retrieve from disk code"}, {"post_id": 51949, "ts": "2026-08-21T22:06:31Z", "hours": 6.9186, "text": "Ok so uuuh….. Somehow secr destroyditself up and I had to fix it the thing is that from 0xffffff… Somehow one of the f magically dissapeared and I had to basically trace whole Drs sector to find what was wrong also waking aps for some reason isn’t working even I am using textbook code to wake it up I now have no idea why is it not working mameybie I will gat back to it at the end and now do the special function because everyone on stardance for some reason started doing X64 os so I had to come up with something radical, I am going to make a full local assembly llm chat engine like llama.cpp fully in assembly for sofaos all things from scratch tokenizer network loading calculation and other stuff I have nothing really to show so just enjoy some random pic from my gallery"}, {"post_id": 50626, "ts": "2026-08-19T21:25:41Z", "hours": 1.5097, "text": "Aps not responding should put 67 to px67 but aps not doing idk if because of qemu or whatever I don’t want to debug this piece of shi"}, {"post_id": 48801, "ts": "2026-08-17T10:37:03Z", "hours": 9.8594, "text": "Spent I don’t even know how much time I lost track of time doing this shit I did it whole night I am happy that I am going to sleep at 12:33 the error was that I wasn’t sending enough sipis so the aps didn’t actually wake up but I didn’t knew that so I was tracing the whole os to find the error then I actually checked on internet how should it be done and that’s when I was finally able to fix this simple ass problem"}, {"post_id": 46606, "ts": "2026-08-13T23:28:04Z", "hours": 9.4331, "text": "Finished the core wakeup now I can wakeup any numver of cores that I have and now I am going to make some serious multitasking i still need to do the trampoline to launch the cores to 64 bit mode but they will be fast also the limit of cores for legacy PCs is 255 but it is still engouh to wake up amd epyc"}, {"post_id": 45351, "ts": "2026-08-11T19:00:05Z", "hours": 7.7386, "text": "Ok I have found the number of cores which is a huge milestone now I need to find what is the bsp to not wakeup already woken up core number of cores is in a memory buffer 256 bytes big cous the CPU doesn’t have enough IDs for more than 255 cores so even In future it will be ok"}, {"post_id": 42209, "ts": "2026-08-06T20:25:10Z", "hours": 6.2731, "text": "Found Madt table finally going to get number of cores to wakeup"}, {"post_id": 41610, "ts": "2026-08-05T22:27:33Z", "hours": 7.7322, "text": "I did some preparations for init sipi sipi trampoline to wake up more cores for multitasking it just finds acpi rsdp in memory I also want to be able for user to chose how many cores to wakeup"}, {"post_id": 39343, "ts": "2026-08-02T08:01:35Z", "hours": 9.4314, "text": "Added the ability to read what’s on the disk there was a problem with R14 cuz one function that I called used it but push and pop fixed it after I traced the problem without it would print 20 endlessly till it crashed"}, {"post_id": 36740, "ts": "2026-07-29T00:11:34Z", "hours": 4.6686, "text": "Ok I have found the solution instead of looking trough all ports it stops on the firt found idk how it works but it works now I can extract data from disk"}, {"post_id": 35588, "ts": "2026-07-27T03:43:28Z", "hours": 9.2492, "text": "Something is very wrong here. Every debug marker along the boot/init path prints exactly like it should, and it still never makes it to the shell. Going to need a proper trace through this instead of guessing."}, {"post_id": 32921, "ts": "2026-07-22T12:09:35Z", "hours": 8.0367, "text": "PCI bus enumeration, done by brute-force, but like every os does it this way loop over every bus, device, and function number, write a config address to IO port 0xCF8 , read whatever comes back from 0xCFC . All ones means nothing’s there; anything else gets recorded. Once every device on the bus is found, it scans the results for a class code matching AHCI (SATA storage), grabs that device’s BAR5, and starts bringing the controller up — reset bit set, poll until it clears, enable global host control. This is what opens up actual disk read/write instead of relying on BIOS"}, {"post_id": 29065, "ts": "2026-07-15T18:30:38Z", "hours": 0.2567, "text": "Added whatindr just copied function whatincr and changed registers from control to debug"}, {"post_id": 28980, "ts": "2026-07-15T16:38:29Z", "hours": 12.4869, "text": "I added so when the user types it automatically moves screen to VGA buffer so it doesn’t overwrite bad memmory and implemented this thing for cpritn too so if you are near end of the screen it automatically moves up (number of rewrites this function took 3) in pic you can see how cpritn automatically moved up"}, {"post_id": 26737, "ts": "2026-07-11T18:16:27Z", "hours": 9.8742, "text": "Added translate which translates number from hex to dec and also the other way and command to see what in memory I had to make a new function to accept hex and Dec and figure out which one is which than grab byte from memory not 8 bytes was stuck on that then output which was easy cus I already have function for that then added translate which just uses hexbin function for Dec and bin for hex and outputs in the other format also I don’t have much time to code because I am a slave on a construction now and I get paid absolute minimum"}, {"post_id": 20804, "ts": "2026-07-02T14:45:38Z", "hours": 7.6444, "text": "Ok so today I have made saythis command which is basically echo (system says what you tell it to) and whatincr which basically spits out what is in control registers which might be useful for some repairman or whatever but I had to make new functions like bintrn which turns normal pc number into decimal ASCII string but I had the loop wrong it started at wrong point but now it should work"}, {"post_id": 18754, "ts": "2026-06-29T23:04:10Z", "hours": 7.3631, "text": "Added scroll up, just the reverse of scroll down — but still needed its own direction logic and its own set of variables reset correctly, and the first version was so badly written that i just rewrote the thing"}, {"post_id": 16826, "ts": "2026-06-27T10:08:25Z", "hours": 14.0714, "text": "Limited coding time cuz i am on vacation in Berlin but made progress on scrolling the screen now scrolls down good text overflows the bottom. Scroll up still doesn’t exist the first attempt was so tangled it wasn’t worth saving, so that one got scrapped rather than patched."}, {"post_id": 14559, "ts": "2026-06-23T18:40:49Z", "hours": 15.5939, "text": "Added more text commands and started on ones that actually do something, like echo. Also started work on moving text up and down the screen, which is lowk hard"}, {"post_id": 12479, "ts": "2026-06-20T11:33:22Z", "hours": 9.3064, "text": "Completed the command system — a compare routine ( cmper ) checks whatever’s typed against a table of known command strings and jumps straight to that command’s handler on a match. First command wired up was cls , mostly because the screen clearer routine already existed. Everything else gets added the same way from here."}, {"post_id": 11616, "ts": "2026-06-18T22:21:16Z", "hours": 5.1686, "text": "Terminal UI is functional now — Enter does something, and extended interrupts (arrow keys) get decoded properly instead of coming through as garbage. Also added a distinct sys response visual state vs just characters The color choices right now are not best need to actually look into color theory."}, {"post_id": 11321, "ts": "2026-06-18T15:03:42Z", "hours": 3.1789, "text": "Forgot to say this last time, but there’s now a basic (not working) concept of user input reaching the system layer — just the shape of how it should work, not the real thing yet. Finishing that up next so it actually looks like a terminal. Worth sayi the cursor ( curzor ) tracking and the cls screen-clear command both went in a little earlier and are what everything since has been built on top of."}, {"post_id": 11192, "ts": "2026-06-18T09:50:01Z", "hours": 8.1875, "text": "Text now behaves like a normal shell — typing lands where it should, and added a working delete/backspace key plus some general UI cleanup. Starting to lok like an actual terminal instead of a proof of concept."}, {"post_id": 10930, "ts": "2026-06-17T22:14:13Z", "hours": 4.3675, "text": "Keyboard handler is fixed. Can freely type now. thought: there’s currently nothing stopping unrestricted writes from going past where they should, which means someone could in theory type their way into overwriting parts of the running system. Needs boundaries before this goes further."}, {"post_id": 10672, "ts": "2026-06-17T15:09:06Z", "hours": 4.9003, "text": "Fixed yesterday’s error. Now testing on real hardware to check whether the machine actually virtualizes PS2 keyboard controller the same way QEMU does, since the handler logic depends on that"}, {"post_id": 10316, "ts": "2026-06-16T23:51:15Z", "hours": 8.5125, "text": "Tried implementing a keyboard press handler. Sadly, it does not work. Something in the interrupt handling isn’t right — more debugging needed before typing does anything useful."}, {"post_id": 9785, "ts": "2026-06-16T07:03:14Z", "hours": 6.5003, "text": "Finally transitioned into 64-bit mode, so the actual OS can start getting written now. Not going to explain every step in detail since it’s always the same , but simple: built page tables using 2MB pages so the fourth paging level (the 4KB page table) could be skipped entirely, set up the stack, and did the rest of the long-mode setup (PAE, the EFER long-mode-enable bit, then paging itself) before the far jump into 64-bit code."}, {"post_id": 9416, "ts": "2026-06-15T19:29:46Z", "hours": 6.1778, "text": "Big milestone got it running on an actual my pc instead of just QEMU. Had to go back into stage 1 real BIOSes are pickier than QEMU’s about a few things. Nothing structural changed, just les forgiving to handle."}, {"post_id": 9090, "ts": "2026-06-15T05:59:09Z", "hours": 5.4553, "text": "Ok found the bug it was bad cmp flag check still a bad Habit I have from arm to instead of je is Zero try to do arm syntax and do jz, (BZ branch if zero) but now it works ok"}, {"post_id": 8967, "ts": "2026-06-14T22:37:16Z", "hours": 14.9994, "text": "Pulled an all-nighter and finally got a boot working — turned out QEMU was set to -nographic, so my VGA output was being generated correctly but never actually displayed. Once I fixed that, i found a new problem up: once in 32-bit mode, my code started printing from the top of the screen and overwriting text the BIOS had already written. Progress, but a new bug was right behind the old one. Still it doesn’t want to move forward it should print k at the end so something is wrong I am going to investigate It."}, {"post_id": 8362, "ts": "2026-06-13T22:01:15Z", "hours": 16.1964, "text": "I hate this stupid code , literally the only thing I do is find an error, find what could possibly cause it, fix it, and it still doesn’t work. Do that a hundred times, and it turns out the BIOS — which promises not to touch DL — corrupts it anyway during interrupt 0x16. Whatever. Still not fully working, but at least I’ve got the core structure for moving into 32-bit mode. I hate this — why do all x64 processors have to wake up going “uhm I think I’m an IBM processor from 1967” instead of just dropping into 64-bit like ARM does? Also my PC screen broke, so now I’m SSH’d in through Termux to code this thing. I hate assembly but low-key need a new PC — that old Compaq 6510b with 2GHz and two cores isn’t cutting it anymore."}, {"post_id": 7061, "ts": "2026-06-11T20:39:29Z", "hours": 3.8658, "text": "Getting close to 32-bit mode. Added a memory tester using INT 0x15, EAX=0xE820 so the OS actually knows how much RAM exists and where, instead of assuming. Also built two different A20 gate openers — the fast method through port 0x92 first, and a manual read/write test on mirrored addresses as a fallback if that doesn’t take. If one fails, the other starts"}, {"post_id": 6770, "ts": "2026-06-11T10:43:03Z", "hours": 5.9658, "text": "Went back and leaned stage 1 more heavily on the print funtion ( cpritn ) instead of duplicating printing logic, and tightened up the handoff into stage 2. Stage 2 now loads the kernel using a preset Disk Address Packet instead of recalculating the sector count and offset from scratch every single time it runs."}, {"post_id": 5895, "ts": "2026-06-09T21:12:59Z", "hours": 2.0008, "text": "Added LBA (logical block addressing) table implementation — sadly no support hard drives that don’t support it. Also added a test so if the computer’s too old to do extended reads, it just refuses to boot instead of silently corrupting stuff. Auto-retry if something goes wrong, and it jumps to address 0x7E00, where the end of the 2# stage starts."}, {"post_id": 5202, "ts": "2026-06-08T21:59:31Z", "hours": 0.3206, "text": "Did some testing on the 1# stage bootloader today. Now I need to link it up to the 2# stage and then to the actual OS — right now the 1# stage basically just saves what the BIOS hands us (bios present) and tells the system where the 2# stage lives."}]...
|
Title: Assembly os x64 custom kernel and bootloade Title: Assembly os x64 custom kernel and bootloader by @scrt401 | Stardance
Devlogs:
Did some testing on the 1# stage bootloader today. Now I need to link it up to the 2# stage and then to the actual OS — right now the 1# stage basically just saves what the BIOS hands us (bios present) and tells the system where the 2# stage lives.
Added LBA (logical block addressing) table implementation — sadly no support hard drives that don’t support it. Also added a test so if the computer’s too old to do extended reads, it just refuses to boot instead of silently corrupting stuff. Auto-retry if something goes wrong, and it jumps to address 0x7E00, where the end of the 2# stage starts.
Went back and leaned stage 1 more heavily on the print funtion ( cpritn ) instead of duplicating printing logic, and tightened up the handoff into stage 2. Stage 2 now loads the kernel using a preset Disk Address Packet instead of recalculating the sector count and offset from scratch every single time it runs.
Getting close to 32-bit mode. Added a memory tester using INT 0x15, EAX=0xE820 so the OS actually knows how much RAM exists and where, instead of assuming. Also built two different A20 gate openers — the fast method through port 0x92 first, and a manual read/write test on mirrored addresses as a fallback if that doesn’t take. If one fails, the other starts
I hate this stupid code , literally the only thing I do is find an error, find what could possibly cause it, fix it, and it still doesn’t work. Do that a hundred times, and it turns out the BIOS — which promises not to touch DL — corrupts it anyway during interrupt 0x16. Whatever. Still not fully working, but at least I’ve got the core structure for moving into 32-bit mode. I hate this — why do all x64 processors have to wake up going “uhm I think I’m an IBM processor from 1967” instead of just dropping into 64-bit like ARM does? Also my PC screen broke, so now I’m SSH’d in through Termux to code this thing. I hate assembly but low-key need a new PC — that old Compaq 6510b with 2GHz and two cores isn’t cutting it anymore.
Pulled an all-nighter and finally got a boot working — turned out QEMU was set to -nographic, so my VGA output was being generated correctly but never actually displayed. Once I fixed that, i found a new problem up: once in 32-bit mode, my code started printing from the top of the screen and overwriting text the BIOS had already written. Progress, but a new bug was right behind the old one. Still it doesn’t want to move forward it should print k at the end so something is wrong I am going to investigate It.
Ok found the bug it was bad cmp flag check still a bad Habit I have from arm to instead of je is Zero try to do arm syntax and do jz, (BZ branch if zero) but now it works ok
Big milestone got it running on an actual my pc instead of just QEMU. Had to go back into stage 1 real BIOSes are pickier than QEMU’s about a few things. Nothing structural changed, just les forgiving to handle.
Finally transitioned into 64-bit mode, so the actual OS can start getting written now. Not going to explain every step in detail since it’s always the same , but simple: built page tables using 2MB pages so the fourth paging level (the 4KB page table) could be skipped entirely, set up the stack, and did the rest of the long-mode setup (PAE, the EFER long-mode-enable bit, then paging itself) before the far jump into 64-bit code.
Tried implementing a keyboard press handler. Sadly, it does not work. Something in the interrupt handling isn’t right — more debugging needed before typing does anything useful.
Fixed yesterday’s error. Now testing on real hardware to check whether the machine actually virtualizes PS2 keyboard controller the same way QEMU does, since the handler logic depends on that
Keyboard handler is fixed. Can freely type now. thought: there’s currently nothing stopping unrestricted writes from going past where they should, which means someone could in theory type their way into overwriting parts of the running system. Needs boundaries before this goes further.
Text now behaves like a normal shell — typing lands where it should, and added a working delete/backspace key plus some general UI cleanup. Starting to lok like an actual terminal instead of a proof of concept.
Forgot to say this last time, but there’s now a basic (not working) concept of user input reaching the system layer — just the shape of how it should work, not the real thing yet. Finishing that up next so it actually looks like a terminal. Worth sayi the cursor ( curzor ) tracking and the cls screen-clear command both went in a little earlier and are what everything since has been built on top of.
Terminal UI is functional now — Enter does something, and extended interrupts (arrow keys) get decoded properly instead of coming through as garbage. Also added a distinct sys response visual state vs just characters The color choices right now are not best need to actually look into color theory.
Completed the command system — a compare routine ( cmper ) checks whatever’s typed against a table of known command strings and jumps straight to that command’s handler on a match. First command wired up was cls , mostly because the screen clearer routine already existed. Everything else gets added the same way from here.
Added more text commands and started on ones that actually do something, like echo. Also started work on moving text up and down the screen, which is lowk hard
Limited coding time cuz i am on vacation in Berlin but made progress on scrolling the screen now scrolls down good text overflows the bottom. Scroll up still doesn’t exist the first attempt was so tangled it wasn’t worth saving, so that one got scrapped rather than patched.
Added scroll up, just the reverse of scroll down — but still needed its own direction logic and its own set of variables reset correctly, and the first version was so badly written that i just rewrote the thing
Ok so today I have made saythis command which is basically echo (system says what you tell it to) and whatincr which basically spits out what is in control registers which might be useful for some repairman or whatever but I had to make new functions like bintrn which turns normal pc number into decimal ASCII string but I had the loop wrong it started at wrong point but now it should work
Added translate which translates number from hex to dec and also the other way and command to see what in memory I had to make a new function to accept hex and Dec and figure out which one is which than grab byte from memory not 8 bytes was stuck on that then output which was easy cus I already have function for that then added translate which just uses hexbin function for Dec and bin for hex and outputs in the other format also I don’t have much time to code because I am a slave on a construction now and I get paid absolute minimum
I added so when the user types it automatically moves screen to VGA buffer so it doesn’t overwrite bad memmory and implemented this thing for cpritn too so if you are near end of the screen it automatically moves up (number of rewrites this function took 3) in pic you can see how cpritn automatically moved up
Added whatindr just copied function whatincr and changed registers from control to debug
PCI bus enumeration, done by brute-force, but like every os does it this way loop over every bus, device, and function number, write a config address to IO port 0xCF8 , read whatever comes back from 0xCFC . All ones means nothing’s there; anything else gets recorded. Once every device on the bus is found, it scans the results for a class code matching AHCI (SATA storage), grabs that device’s BAR5, and starts bringing the controller up — reset bit set, poll until it clears, enable global host control. This is what opens up actual disk read/write instead of relying on BIOS
Something is very wrong here. Every debug marker along the boot/init path prints exactly like it should, and it still never makes it to the shell. Going to need a proper trace through this instead of guessing.
Ok I have found the solution instead of looking trough all ports it stops on the firt found idk how it works but it works now I can extract data from disk
Added the ability to read what’s on the disk there was a problem with R14 cuz one function that I called used it but push and pop fixed it after I traced the problem without it would print 20 endlessly till it crashed
I did some preparations for init sipi sipi trampoline to wake up more cores for multitasking it just finds acpi rsdp in memory I also want to be able for user to chose how many cores to wakeup
Found Madt table finally going to get number of cores to wakeup
Ok I have found the number of cores which is a huge milestone now I need to find what is the bsp to not wakeup already woken up core number of cores is in a memory buffer 256 bytes big cous the CPU doesn’t have enough IDs for more than 255 cores so even In future it will be ok
Finished the core wakeup now I can wakeup any numver of cores that I have and now I am going to make some serious multitasking i still need to do the trampoline to launch the cores to 64 bit mode but they will be fast also the limit of cores for legacy PCs is 255 but it is still engouh to wake up amd epyc
Spent I don’t even know how much time I lost track of time doing this shit I did it whole night I am happy that I am going to sleep at 12:33 the error was that I wasn’t sending enough sipis so the aps didn’t actually wake up but I didn’t knew that so I was tracing the whole os to find the error then I actually checked on internet how should it be done and that’s when I was finally able to fix this simple ass problem
Aps not responding should put 67 to px67 but aps not doing idk if because of qemu or whatever I don’t want to debug this piece of shi
Ok so uuuh….. Somehow secr destroyditself up and I had to fix it the thing is that from 0xffffff… Somehow one of the f magically dissapeared and I had to basically trace whole Drs sector to find what was wrong also waking aps for some reason isn’t working even I am using textbook code to wake it up I now have no idea why is it not working mameybie I will gat back to it at the end and now do the special function because everyone on stardance for some reason started doing X64 os so I had to come up with something radical, I am going to make a full local assembly llm chat engine like llama.cpp fully in assembly for sofaos all things from scratch tokenizer network loading calculation and other stuff I have nothing really to show so just enjoy some random pic from my gallery
Ok so I was working on gluing gguf file at the end of my iso you can see image it was successful also needed to generalize ahci driver to work on all PCs now writing the gguf retrieve from disk code
Ok so I half rewritten the code for sector read I had to drop hard coded 0 and look for actuall devices to get the data from as you can see it works still
Ok I have made a new command inout it let’s user chose number port in and port to listen from and it spits out response from the port as you can see I tried corrupting time register and it worked
Ok I was figuring out how to load the gguf file which I think I got right but I can’t find a way to know how many sectors to pull out of disk because the metadata in gguf aren’t always the same nor size of the entries are the same so there is now way to know when they end and I need them to find the size of the file in picture you can see how the metadata is structured
Ok I give up on writing it, cuz GGUF file structure is ass and I can’t write it in the way it should be I am going to pull a cheap trick by putting a control string at the end of the file to know when the file is ending below is structure of how the whole file should look like
Ok sooo I made the code buuut it hangs when I do the loading idk what happening will have to debug
I have successfully loaded whole LLM problem was that It was loading 1 gb by 512 bytes and that takes very long and thats why it seemed it hanged I fixed it by giving it a counter so you can see that it doesn’t hang
Hello good news today have started on setting up the data from GGUF rn it is just getting version metadata entryes and tensor entry, I Also started a loop for the metadata entryes but just started this one was easy cuz it has prefixed everything 4 bytes gguf magic 4 version 8 metadata entryes and 8 tensor info entry which makes 24 bytes in total
Ok bigg devlog todat i decided to speedrun this so i can ship this project as fast as possible also changed the model to a smaller native f16 quantization and It works which is a proof that anyone can put their model into sofaos and run it rn it just loops troug metadata to find general architecture
Ok all metadata entry data prased but when i delete the print at the bottom it for some reason triple faults going to report every ±9 hrs because i need to speedrun this because the stardance is ending soon now onto tensor data praser
Ok i gave lost the war against the matadata praser i will not fight it now i will fix it in second ship for now i have hard coded the data needed and also made the core of the tokenizer which was relatively easy compared to the praser
Tokenizer done now for vector context calculator . The tokenizer was somwhat refusing to work but one rewrite later it subdued to my power it is split into teo parts the text decoder and encoder decoder formats the words for encoder and encoder finds tokens for the words
Made the metadata praser work i was using tensor format and nkt metadata Format also verifyed it works on pc
Ok bad News today i drank 5l of Kofola and now me attention me hyperactive me cant concentrate but did token and bos token enumetion there was a problem with division because of no xor rdx,rdx but ez fix if boestoken add 1 it adds tokwn
Ok so uuh those 5l of Kofola wasn’t a great ide today i got a fever or flu or whatever the thing that makes you feel hot but i made some progress even though it was hard cuz i had a headache and couldn’t do anything so what i did i made a f16 to 32 translation and you might say hmm but this doesn’t seem too vomplex first of all i had to split registers inro 3 sections do calculation on them and the glue them together to xmm0 but what you might not know is if you don’t allow xmm is 32 bit mode it will throw gp an the whole code and you cant know why it crashed because whole runtime in crash log looks absolutely normal for some reason also I don’t actually care about the time anymore i just want to get this working so i can get a laptop to not code on my phone
Today i am a bit better so i did the harder part that is needed to be done, i have made tensor info gatherer, basically each layer has 9 tensor info, so for my model 9*30 tensor infos, also the string i am comparing in the function needs to be like [blk.][number of current layer in decimal(use bintrn)][specification string], it still doesn’t work but it will be something like infinite inc loop to memory or division basically smth that generates general protection, also because I was smart i saved my previous error where i used tensor info praser so i didn’t Neded to reerite it.
I have no idea how to fix it so i retreated ro the ol reliable method by first hardcoding it and after some time actually fixing it
Today i got help from my great teacher and was able to do more than usual, today i did hbuf setuper it basically just calls fcon 576 times to translate the values from 16 bit quantization to 32 then i have written a function RMSNorm which uses hbuf and weights you give it and calculates rescaled feuture vector
There was a problem with pointers in rnsm found it when i did double check and from there errors just piled up but at least its fixed now
Ok i have successfully made detokenizator which goes trough the token id book that many times as a token because token id =id book entries untill the token, and also i have made matrix–vector dot product calculator which goes through all token ids and translates them into a big amount of vectors which then in another step i will be doing comparison hbuf with all these vectors to find a token with lovest diff and that will be our output token, but big but it still isn’t tested i will be testing it when i will have the full command done for now i just want to live in an illusion that my code is error free
So today i finished argmax which finds closest token to response, now i have everything but it still has some errors it prints 0 every time so meybie some register colision but the good thing is that it doesn’t crash.
Ok so refined devlogs polished sofaos and GitHub couldn’t ship because rhe whole kernel inflated from 52 to 838 sectors by some miracle, destroyed interrupt table, tensor hard coded stuff and other stuff it ruined my day also ok so let me defend originality : it is a ring 0 os made for hardvare inspection while i saw others did os stuff to before me on stardance i already made an os before stardance in arm , technicality : assembly ,usability : it is meant to inspect pcs when something goes wrong hardvare level not daily driver, you decide storitelyng i pored my heart into those devlogs
ok so let me defend originality : it is a ring 0 os made for hardvare inspection while i saw others did os stuff to before me on stardance i already made an os before stardance in arm , technicality : assembly ,usability : it is meant to inspect pcs when something goes wrong hardvare level not daily driver, you decide storitelyng i pored my heart into those devlogs
Ships:
Simple os with access to Ring 0 stuff the ai no work sadly...
|
1792128166.6835837
|
1792992166.6835837
|
|
29716
|
NYX by @Paulaner | Stardance
|
Paulaner
|
1
|
421.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-13T15:54:07Z", "hours": 421.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "nyx is a small operating-system kernel for 32-bit x86 PCs, written from scratch in Zig 0.15.2 with no C library and no external dependencies. It boots directly in QEMU and brings the machine up in 20 checked stages, from interrupts and timers through memory paging, a kernel heap, thread scheduling, disk and PCI drivers, and an in-memory filesystem loaded from an embedded tar archive. At boot it runs 15 built-in self-tests, then drops into an interactive shell with 30 commands that you can drive from the keyboard or over the serial port. It’s about 5,000 lines in total.", "repo": "https://github.com/Paul231007/nyx", "demo": "https://nyx-zeta-opal.vercel.app/"}]...
|
[{"post_id": 68723, "ts": "202 [{"post_id": 68723, "ts": "2026-09-15T16:57:50Z", "hours": 7.0203, "text": "📓 devlog · 2026-09-14 added initial architecture definition, establishing core components and their interactions for modularity. implemented key architectural components, focusing on separation of concerns to enhance maintainability. fleshed out various parts of the architecture, refining data flow and control structures between modules. wired up essential components to ensure proper communication and data exchange across the architecture. started multiple architectural elements concurrently, facilitating a more integrated approach to development. added several new architecture layers to improve scalability and support future feature additions. continued to implement and refine architecture, addressing edge cases related to component interaction and data integrity."}, {"post_id": 67883, "ts": "2026-09-14T05:39:42Z", "hours": 6.0667, "text": "📓 devlog · 2026-09-13 added initial implementation of the shell, establishing basic command parsing and execution flow. fleshed out shell functionality, improving command handling and improving error reporting for invalid inputs. wired up shell components, ensuring proper integration with existing modules for input and output processing. started multiple iterations of shell refinement, focusing on memory allocation strategies for command history storage. implemented additional features for the shell, including support for built-in commands and improved environment variable management. continued to flesh out shell behavior, addressing edge cases related to command substitution and pipeline execution."}, {"post_id": 67063, "ts": "2026-09-13T03:32:24Z", "hours": 10.8517, "text": "📓 devlog · 2026-09-12 implemented memory management, focused on allocation strategies and freeing unused memory blocks to optimize resource usage. fleshed out memory module, added support for variable-sized memory chunks, improving efficiency for dynamic allocation. started integration of memory system with existing components, ensuring compatibility and smooth data flow. added shell functionality, enabling user interaction with the memory management system through command-line inputs. wired up shell to the memory module, establishing command execution pathways for memory operations. performed multiple wiring adjustments in the shell, ensuring proper communication and error handling between components."}, {"post_id": 66150, "ts": "2026-09-11T19:42:45Z", "hours": 1.7425, "text": "📓 devlog · 2026-09-11 implemented the shell module, established basic command parsing and execution flow. fleshed out the shell with support for built-in commands, enhancing user interaction. added memory management functionality, introduced a structure for allocation tracking. wired up memory to the shell, enabling commands to manipulate memory directly. performed multiple whitespace fixes and formatting cleanups across all modules for better readability. started and fleshed out the memory module, ensuring proper initialization and allocation patterns. tidied shell code for improved maintainability, focusing on reducing complexity in command handling."}, {"post_id": 65818, "ts": "2026-09-11T06:38:13Z", "hours": 6.0333, "text": "📓 devlog · 2026-09-10 implemented the filesystem (fs), focused on directory structure and file allocation strategies for improved access speed. wired up the fs to ensure proper integration with existing modules, tested data flow between components during initial operations. started the shell, establishing basic command parsing and execution control flow to interface with the filesystem. added memory management capabilities, implemented a new allocation strategy to minimize fragmentation and optimize performance. cleaned up the shell code for readability, removed redundant whitespace to maintain consistent coding standards across the project. performed additional wiring for memory to ensure it interacts correctly with both the filesystem and shell for seamless operation. fleshed out the fs with additional features like file permissions and metadata handling, ensuring robustness for concurrent access."}, {"post_id": 65255, "ts": "2026-09-10T08:03:20Z", "hours": 6.4386, "text": "📓 devlog · 2026-09-09 implemented shell functionality, used a simple command parsing approach to handle user inputs effectively. added shell module, structured to handle basic commands and provide feedback to users. fleshed out shell with support for additional built-in commands, improving user experience and functionality. performed cleanup across multiple files, removing unused variables and optimizing control flow where necessary. started filesystem integration in shell, allowing for basic file operations within the command line. continued formatting work across the project, ensuring consistent code style and readability. tidied shell code for better organization, enhancing maintainability and future development efforts. 📓 devlog · 2026-09-09 implemented shell functionality, used a simple command parsing approach to handle user inputs effectively. added shell module, structured to handle basic commands and provide feedback to users. fleshed out shell with support for additional built-in commands, improving user experience and functionality. performed cleanup across multiple files, removing unused variables and optimizing control flow where necessary. started filesystem integration in shell, allowing for basic file operations within the command line. continued formatting work across the project, ensuring consistent code style and readability. tidied shell code for better organization, enhancing maintainability and future development efforts."}, {"post_id": 64632, "ts": "2026-09-09T05:28:16Z", "hours": 9.9, "text": "📓 devlog · 2026-09-08 added shell module, implemented basic command parsing and execution flow, using a simple function pointer array for command dispatch fleshed out shell functionality, included support for built-in commands and input handling, ensuring proper memory allocation for command buffers tidied up shell code, removed redundant whitespace and improved consistency in formatting to enhance readability performed multiple cleanups, refactored shell initialization code for better modularity and maintainability wired up shell to the main application loop, ensuring proper integration and execution flow with other components addressed multiple whitespace issues across files, ensuring consistent coding standards throughout the project"}, {"post_id": 63857, "ts": "2026-09-07T20:46:33Z", "hours": 12.5, "text": "📓 devlog · 2026-09-07 implemented fs, focused on the core file system structure, ensuring proper data layout for efficient file access. fixed a typo in the shell, improving command parsing accuracy and preventing potential runtime errors. tidied shell code by removing unnecessary whitespace and organizing functions for better readability and maintenance. performed multiple formatting updates across various files to adhere to coding standards, ensuring uniformity in style. continued work in progress on shell functionality, refining command handling and improving control flow for user input. completed cleanup tasks to remove unused variables and redundant code, optimizing memory usage and enhancing performance."}, {"post_id": 62472, "ts": "2026-09-05T20:33:49Z", "hours": 11.9333, "text": "📓 devlog · 2026-09-05 added drivers for peripheral devices, ensuring proper initialization and configuration settings. implemented a basic shell structure, allowing for command processing and execution. performed multiple whitespace fixes across various files for improved readability and consistency. cleaned up existing code, removing unused variables and dead code to streamline execution paths. created a rough outline for the shell functionality, defining command handling and parsing logic. updated shell implementation to handle user inputs and provide feedback on command execution. added stubs for future shell commands, preparing for further functionality expansion."}, {"post_id": 61112, "ts": "2026-09-03T20:52:00Z", "hours": 6.3667, "text": "📓 devlog · 2026-09-03 added drivers for peripheral communication, structured to allow for easier integration with existing modules. fleshed out driver implementations, ensuring proper handling of initialization and resource allocation. started sketching a shell interface, focusing on command parsing and execution flow. performed multiple whitespace fixes across various files for improved readability and consistency. conducted cleanup of redundant code segments in the driver files, reducing overall complexity. wired up drivers to interact with the new shell, establishing a basic command execution pathway. implemented additional driver functionality to support expanded hardware features, enhancing overall system capability."}, {"post_id": 60480, "ts": "2026-09-02T20:34:28Z", "hours": 6.4333, "text": "📓 devlog · 2026-09-02 tidied up the main module, removed unused imports and improved code readability through consistent formatting. wired up the main module with initial control flow, ensuring proper function calls and data handling. added a preliminary structure for the main module, including stubs for future function implementations. started development on drivers, implementing basic functionality and ensuring proper interaction with the main module. fleshed out the drivers with additional features, focusing on data handling and performance. sketched out the shell interface for user interaction, laying groundwork for input handling and command processing. performed multiple whitespace fixes across various files to maintain code clarity and consistency."}, {"post_id": 59835, "ts": "2026-09-01T20:12:40Z", "hours": 6.6333, "text": "📓 devlog · 2026-09-01 added main module, defined basic structure and entry point for the application flow. cleaned up code formatting across multiple files, improved readability and maintained consistency. fleshed out main functionality, implemented key features and logic required for initial operation. performed multiple whitespace fixes, ensured compliance with style guide and improved diff clarity. started additional main implementations, focused on refining specific functions and control flow. tidied main module, reorganized code for better logical grouping and clarity, enhanced maintainability. conducted cleanup, removed unused variables and functions, streamlined overall codebase."}, {"post_id": 59152, "ts": "2026-08-31T19:40:38Z", "hours": 7.5333, "text": "📓 devlog · 2026-08-31 added main module, set up initial structure and entry points for control flow. wired up main, ensured proper integration with existing components. cleaned up codebase, removed unused variables and streamlined functions for better readability. tidied up main, focused on consistent naming conventions and indentation. addressed multiple whitespace issues, ensuring uniform formatting throughout the code. fleshed out main with additional functionality, enh"}, {"post_id": 57902, "ts": "2026-08-30T07:19:42Z", "hours": 10.1333, "text": "📓 devlog · 2026-08-29 implemented main module, structured the control flow to handle various inputs and outputs efficiently. wired up main functionality, ensured integration with existing components while maintaining modularity. performed multiple whitespace fixes across the codebase to enhance readability and comply with formatting standards. cleaned up redundant code in main, improving maintainability without altering the core logic. fleshed out main, added necessary functions to support additional features and edge cases. tidied up main to simplify the execution path, reducing cognitive load for future development. formatted code consistently, aligning with project style guidelines for better collaboration."}, {"post_id": 56858, "ts": "2026-08-28T20:25:55Z", "hours": 2.1333, "text": "📓 devlog · 2026-08-28 cleaned up whitespace in several files to maintain code consistency and readability. implemented stub functions in module m8 to outline future functionality without full implementation. organized and tidied code in m8, removing unnecessary lines and improving structure. continued work in progress on module m8, addressing various incomplete sections. fleshed out details in module m8, adding logic to improve functionality and integration. added new features to m8, enhancing its capabilities based on recent requirements. performed additional cleanup in m8 to remove deprecated code and streamline performance."}, {"post_id": 56412, "ts": "2026-08-28T05:27:02Z", "hours": 10.4667, "text": "📓 devlog · 2026-08-27 cleaned up various sections of the codebase, focusing on removing redundant comments and unused variables for better readability. added module m7, defining its structure and initial state, laying groundwork for subsequent implementations. wired up m7 to existing systems, ensuring data flow and control paths are correctly established. fleshed out m7 with core functionality, implementing key methods and internal logic to meet specifications. began rough implementation of m9, setting up initial framework and placeholders for upcoming features. fixed typos in m9, correcting variable names and comments for clarity and consistency. implemented core functions for m9, following through on the designs sketched in earlier commits."}, {"post_id": 55216, "ts": "2026-08-26T20:02:26Z", "hours": 5.6, "text": "📓 devlog · 2026-08-26 implemented module m2, focused on core functionality, ensured proper data handling and state management wired up module m2, established connections with existing components, validated data flow between modules started development on module m7, created initial stubs to define interface and behavior expectations fixed a bug in module m7 related to incorrect state transitions, improved control flow conducted cleanup across various modules, removed unused variables and optimized memory layout worked on ktest, tidied up existing tests, improved structure for better readability and maintainability performed whitespace fixes across multiple files to maintain consistency and adhere to coding standards"}, {"post_id": 54746, "ts": "2026-08-25T20:40:36Z", "hours": 2.2667, "text": "📓 devlog · 2026-08-25- worked on scheduling system, added preliminary structures for new scheduling algorithms while ensuring compatibility with existing code.- performed code tidying in the scheduling module, improving readability and reducing cyclomatic complexity.- implemented core functionality for module m5, focusing on resource allocation and control flow for task management.- fixed whitespace issues throughout the codebase, ensuring consistent formatting and adherence to style guidelines.- completed the implementation of module m5, integrating features from earlier sketches and ensuring edge cases are handled.- conducted cleanup on multiple modules, removing redundant code and ensuring proper memory allocation practices are followed.- added preliminary sketches for module m2, laying groundwork for future functionality and ensuring alignment with overall architecture."}, {"post_id": 54346, "ts": "2026-08-25T09:29:39Z", "hours": 10.2333, "text": "📓 devlog · 2026-08-23- added ramfs module, implemented initial allocation and file structure layout for in-memory file system.- cleaned up whitespace and formatting across multiple files to improve readability and maintainability.- stubs created for m4 module, establishing the basic structure and placeholders for future development.- wired up ramfs to the existing system, ensuring proper integration with the kernel and other subsystems.- worked on m4 module, refining control flow and preparing it for handling input and output operations.- multiple sketches of ramfs and m4 completed, outlining potential features and behaviors for further implementation.- conducted overall cleanup of the codebase, addressing minor issues and ensuring consistent coding standards."}, {"post_id": 53333, "ts": "2026-08-23T20:21:43Z", "hours": 2.0667, "text": "📓 devlog · 2026-08-23 added ramfs module, implemented initial allocation and file structure layout for in-memory file system. cleaned up whitespace and formatting across multiple files to improve readability and maintainability. stubs created for m4 module, establishing the basic structure and placeholders for future development. wired up ramfs to the existing system, ensuring proper integration with the kernel and other subsystems. worked on m4 module, refining control flow and preparing it for handling input and output operations. multiple sketches of ramfs and m4 completed, outlining potential features and behaviors for further implementation. conducted overall cleanup of the codebase, addressing minor issues and ensuring consistent coding standards."}, {"post_id": 52832, "ts": "2026-08-23T05:57:49Z", "hours": 19.9, "text": "📓 devlog · 2026-08-22 implemented ramfs, defined basic structure and operations for file handling and memory layout fleshed out ramfs, added functions for reading and writing files, ensuring proper memory allocation started ramfs, established initial setup for in-memory filesystem structure and controls cleaned up code across multiple files, removed unnecessary whitespace for better readability performed formatting adjustments, ensured consistent code style and indentation throughout the project worked on rough elf, iterated on the ELF parsing logic and data structures for improved parsing accuracy added additional cleanup commits for better organization and maintainability of the codebase"}, {"post_id": 50669, "ts": "2026-08-19T23:15:32Z", "hours": 10.7733, "text": "📓 devlog · 2026-08-19 - cleaned up ktest, removed unnecessary code and improved readability for better maintainability. - began outlining ktest structure, defined major test cases and expected outcomes to streamline future development. - fleshed out vfs, added initial functions for file handling and directory structure, focusing on memory layout. - implemented basic elf loading, structured code to handle ELF file format parsing and memory allocation. - performed multiple cleanups across modules, consolidated formatting and fixed whitespace issues to adhere to style guidelines. - initiated elf module, set up initial framework for ELF support including header parsing and section handling."}, {"post_id": 49378, "ts": "2026-08-18T05:17:25Z", "hours": 14.9333, "text": "📓 devlog · 2026-08-17- implemented tar functionality, focusing on the compression algorithm and ensuring efficient file handling during archiving.- added multiple methods for extracting and listing files within the tar format, ensuring compatibility with various file types.- began work on the virtual file system (vfs), outlining the necessary data structures for managing file metadata and storage locations.- added initial stubs for vfs functions, setting up a foundation for future integration with the tar operations.- performed formatting changes across several files to improve code readability and maintain consistency in style.- addressed whitespace issues in the codebase to enhance clarity and adhere to coding standards.- continued development on vfs, sketching out control flow and interactions between the file system and tar operations."}, {"post_id": 47755, "ts": "2026-08-15T21:51:30Z", "hours": 5.7333, "text": "added module m6, structured to handle new data processing tasks with lower memory overhead.- wired up module m6, integrated it into the existing control flow to ensure correct data handling.- implemented core functionality for module m6, focusing on efficient allocation and deallocation.- wired up the hello module, ensuring it interfaces properly with other components.- implemented motd, providing a simple message on system start to enhance user experience.- worked on tar, stubbing out initial functionality while preparing for future enhancements.- performed cleanup across various modules, focusing on code readability and eliminating unused variables."}, {"post_id": 47187, "ts": "2026-08-14T22:17:59Z", "hours": 8.0667, "text": "📓 devlog · 2026-08-14 added initial sketches for ktest and pci modules, outlining the basic structure and intended functionality. conducted general cleanup across the repository, removing unused code and improving overall organization. made multiple formatting adjustments to ensure consistent code style throughout the project. implemented the pci module, focusing on memory allocation and control flow to handle device interactions. fixed typos in ktest documentation and comments to improve clarity and maintainability. worked on stubbing out ktest functionality, laying the groundwork for future testing features. addressed whitespace issues in several files to maintain code readability and adherence to style guidelines."}, {"post_id": 46521, "ts": "2026-08-13T20:07:57Z", "hours": 6.1667, "text": "📓 devlog · 2026-08-13 formatted various files for consistency, improved readability across the codebase. performed multiple cleanup tasks, removing dead code and refactoring functions for better maintainability. wired up the pci subsystem, ensuring proper connection and control flow with existing components. started initial implementation of ktest, laying out the basic structure and functions required for testing. tidied up the pci module by organizing functions and consolidating related code segments. addressed whitespace issues in several files to enhance overall code quality. stubbed out ktest functions to create placeholders for future testing scenarios and implementations."}, {"post_id": 45973, "ts": "2026-08-12T20:06:31Z", "hours": 5.5333, "text": "📓 devlog · 2026-08-12 cleaned up various modules, removed unused imports and redundant code for better readability and maintainability. fixed whitespace issues across multiple files to ensure consistent formatting and adhere to coding standards. fleshed out the pci module, implementing initial structures and outlining the control flow for device communication. tidied up the ktest module, improved the organization of test cases and ensured proper initialization of test variables. stubbed the ktest module to establish a framework for future unit tests, setting up basic test cases without implementation. started the pci module, laying the groundwork for further development and integration with existing components."}, {"post_id": 45412, "ts": "2026-08-11T20:47:58Z", "hours": 6.0333, "text": "📓 devlog · 2026-08-11 added initial implementation for pci, structured to facilitate device communication in the system. performed multiple cleanup operations across the codebase, focusing on removing redundant code and improving readability. fixed whitespace issues in several files, enhancing consistency in formatting. refined the pci module’s layout to ensure efficient data flow and reduce memory overhead. ensured all cleanup efforts adhered to the existing coding standards, promoting maintainability. adjusted comments and documentation to reflect recent changes, particularly for the pci module."}, {"post_id": 44820, "ts": "2026-08-10T20:53:14Z", "hours": 6.4667, "text": "📓 plan · 2026-08-10 I’m starting the day later than usual, so I plan to tackle the whitespace fixes first to ensure our code adheres to the style guide. Once those are out of the way, I’ll focus on fleshing out the PCI subsystem, aiming for a more robust memory layout and control flow that supports our concurrency model. The evening will be dedicated to cleanup and further tidying of the PCI components, wrapping up with formatting to maintain consistency. If all goes well, I’ll end the day with a well-structured and polished segment of the codebase."}, {"post_id": 44214, "ts": "2026-08-09T20:34:21Z", "hours": 12.7667, "text": "📓 devlog · 2026-08-09 added ata module, structured data layout to optimize access patterns and reduce allocation overhead. implemented ktest, focusing on the test harness for kernel functionalities, ensuring control flow is correctly validated. wired up pci, improved integration with ata, facilitating better data transfer between components. tidied up ata, removed unnecessary complexity in the data handling logic to enhance maintainability. fixed typos in ktest to improve readability and avoid potential confusion in the test cases. worked on rough ktest, established initial test cases for future enhancements and iterations."}, {"post_id": 42854, "ts": "2026-08-07T20:02:05Z", "hours": 5.3667, "text": "📓 devlog · 2026-08-07 implemented ata, added core functionality and basic data processing logic. started ktest, set up initial test structure with basic stubs for functionality. fleshed out ktest, integrated test cases and improved coverage for ata interactions. cleaned up codebase, removed unused variables and simplified function calls across modules. performed multiple formatting updates, ensured consistent indentation and styling in source files. created stubs for ata, outlined functions for future implementation. addressed whitespace issues, standardized whitespace across all files for better readability."}, {"post_id": 42227, "ts": "2026-08-06T20:52:42Z", "hours": 3.6333, "text": "📓 devlog · 2026-08-06 tidied up the acpi module, removed unused variables and streamlined function calls for better readability. started work on the acpi module, established initial data structures for handling ACPI tables. performed whitespace fixes across multiple files to maintain consistent formatting, aiding in code maintainability. initiated ktest module, set up basic test framework for kernel testing. tidied up ktest, improved code organization by grouping related functions and reducing code duplication. began rough implementation of ata support, focused on defining data structures for device management. implemented core ata functionality, ensuring proper handling of ATA commands and data transfers."}, {"post_id": 41635, "ts": "2026-08-05T23:41:07Z", "hours": 9.1, "text": "📓 devlog · 2026-08-05 added cpu module with basic structure and initial function outlines for core operations, set up initial memory allocation patterns. tidied up cpu code to improve readability, removed unused variables, and streamlined control flow in functions. began implementation of acpi, defining key data structures and laying out the function signatures required for system power management. wired up ktest to interface with cpu and acpi modules, ensuring proper data flow and control between the components. performed multiple cleanups throughout the codebase, focusing on removing redundant code and addressing formatting inconsistencies. fleshed out ktest to include test cases for cpu and acpi functionality, verifying expected behavior under various scenarios."}, {"post_id": 40954, "ts": "2026-08-04T20:19:12Z", "hours": 6.3667, "text": "📓 devlog · 2026-08-04 added initial structure for rtc, defined basic functions and headers for timekeeping. implemented core rtc functionality, allowing for setting and getting time with precision. cleaned up memory allocation in the cpu module, optimizing data access patterns. wired up cpu to handle rtc interrupts, ensuring correct handling of time-based events. fixed several whitespace and formatting issues across multiple files for consistency. addressed a typo in rtc definitions to prevent compilation errors. started work on syscall implementation, focusing on establishing foundational interfaces."}, {"post_id": 40355, "ts": "2026-08-03T20:02:26Z", "hours": 5.4667, "text": "📓 devlog · 2026-08-03 implemented syscall in the kernel, handling input and output operations for better interaction with user processes. wired up syscall to ensure proper communication between user space and kernel space, adjusting control flow for seamless execution. cleaned up codebase multiple times, focusing on removing redundant code and improving readability across various modules. added stub for rtc, laying the groundwork for real-time clock functionality, enabling time management features in future updates. addressed whitespace issues in several files, ensuring consistent formatting and adherence to style guidelines throughout the project."}, {"post_id": 39704, "ts": "2026-08-02T20:46:18Z", "hours": 6.2333, "text": "📓 devlog · 2026-08-02 started initial implementation of the scheduling module, focusing on basic structure and control flow. sketched out the keyboard input handling, defining data layout and key event management. performed a cleanup of the existing codebase, removing unused variables and improving readability. fixed a typo in the scheduling module that could lead to misinterpretation of scheduling logic. wired up the keyboard functionality to capture input events, ensuring proper allocation of resources for key states. cleaned up whitespace across multiple files, improving overall code consistency and formatting. stubs created for keyboard handling, setting the stage for future development of input features."}, {"post_id": 39124, "ts": "2026-08-01T20:39:59Z", "hours": 12.5667, "text": "📓 devlog · 2026-08-01 implemented physical memory management (pmm), structured memory allocation routines to handle page frames efficiently. added a programmable interrupt controller (pic), designed to manage hardware interrupts with a focus on prioritization and handling edge cases. started input subsystem, defined initial data structures and control flow for handling keyboard events. fixed typos and cleaned up whitespace across various files to improve code readability and maintainability. implemented keyboard handling, established key state tracking and event generation for input processing. performed multiple rounds of formatting and organization on the input code to align with project standards. created stubs for future input features, ensuring basic structure without full implementation for now."}, {"post_id": 37846, "ts": "2026-07-30T20:17:09Z", "hours": 6.4333, "text": "📓 devlog · 2026-07-30 added physical memory management (pmm) module, implemented basic allocation and deallocation routines for memory blocks. fleshed out pmm with additional functions for tracking free memory and fragmentation reduction strategies. wired up pmm with the scheduler, ensuring proper memory allocation during task creation and context switching. started work on the scheduler, focusing on establishing control flow for task prioritization and execution sequence. performed whitespace fixes across multiple files to improve code readability and maintain consistency."}, {"post_id": 37240, "ts": "2026-07-29T19:55:46Z", "hours": 3.1333, "text": "📓 devlog · 2026-07-29 removed unused variables in the scheduler module, improving readability and reducing confusion. organized the scheduling logic into smaller functions, enhancing maintainability and clarity in control flow. started work on the physical memory manager, focusing on the initial layout and allocation strategy. added basic structure for the physical memory manager, ensuring it aligns with existing memory management routines. performed multiple cleanups across the codebase, addressing formatting issues and whitespace for consistent style. iterated on the physical memory manager with rough implementations to establish a foundation for future development."}, {"post_id": 36718, "ts": "2026-07-28T23:16:55Z", "hours": 8.6667, "text": "📓 devlog · 2026-07-28 implemented basic structure for the ring buffer, focusing on data insertion and deletion mechanics. fixed issues in the ring buffer related to overflow conditions, ensuring proper wrap-around logic. started initial work on the scheduler module, defining its role in managing task execution order. cleaned up code in various modules, removing unused variables and optimizing function calls for clarity. made progress on physical memory management (pmm), refining allocation strategies and data structures. wired up pmm with the existing memory system, ensuring compatibility with current allocation patterns. cleaned up and sketched additional plans for pmm, setting groundwork for more advanced features."}, {"post_id": 35423, "ts": "2026-07-26T20:27:13Z", "hours": 2.0667, "text": "📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later. 📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later."}, {"post_id": 35069, "ts": "2026-07-26T08:05:46Z", "hours": 8.6, "text": "📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later."}, {"post_id": 34314, "ts": "2026-07-24T22:08:52Z", "hours": 3.6667, "text": "📓 devlog · 2026-07-24 implemented paging, added core functionality for memory management, ensuring proper control flow for page allocation and deallocation. fleshed out paging, defined page structures and their associated metadata for efficient access patterns. wired up slab, integrated slab allocation with paging to optimize memory usage and reduce fragmentation. rough paging, established initial framework for paging algorithms, focusing on basic page replacement strategies. performed cleanup in various modules, removing redundant code and improving readability. formatted code across multiple files, ensuring consistency in style and adherence to project guidelines. worked on libk, progressing on utility functions to support paging and slab management."}, {"post_id": 33893, "ts": "2026-07-24T05:28:56Z", "hours": 10.8333, "text": "📓 devlog · 2026-07-23 performed general cleanup across multiple files, removed unused variables and streamlined functions for better readability. initiated work on libk, added initial sketches for core functions and data structures, focused on modular design. formatted existing code for consistency, ensured alignment with style guide across all modified files. stubbed out additional functions in libk, set up basic structure for future implementation, no functional changes yet. implemented rough drafts of key algorithms in libk, focused on establishing functional outlines and placeholders. added sketches for paging functionality, laid ground for memory management, still a work in progress. fixed multiple instances of whitespace inconsistencies, ensured code meets formatting standards."}, {"post_id": 33142, "ts": "2026-07-22T19:42:34Z", "hours": 5.7667, "text": "📓 devlog · 2026-07-22 stub libk, added initial placeholder functions to define the interface and structure for future implementation. sketch libk, outlined key functionalities and features expected in libk to guide further development. ok actually fix libk, resolved an existing issue in the libk implementation that impacted function performance. cleanup, removed unnecessary code and comments in multiple files to improve readability and maintainability. formatting, standardized code formatting across several modules to ensure consistency in style and layout. add pic, integrated initial assets and images required for the project, ensuring proper paths and references. rough libk, created a basic version of libk to provide a foundational structure for ongoing enhancements."}, {"post_id": 32547, "ts": "2026-07-21T20:05:00Z", "hours": 3.4333, "text": "📓 devlog · 2026-07-21 added rough implementation of timefmt, establishing a basic structure for time formatting functionality. cleaned up code formatting across several modules to improve readability and maintainability. created stubs for timefmt, setting up placeholder functions for future development and integration. fixed a typo in the timefmt module, ensuring correct naming and preventing potential lookup errors. began work on paging, focusing on the initial design for memory management and data access. started implementing libk, aiming to enhance core library functions related to kernel operations. tidied up libk, removing unused code and optimizing existing functions for better performance."}, {"post_id": 32056, "ts": "2026-07-20T23:05:31Z", "hours": 8.8667, "text": "📓 devlog · 2026-07-20 implemented rough version of timefmt, focusing on initial parsing logic for time strings. wired up timefmt to the main application flow, ensuring it integrates correctly with existing date handling. sketched out the overall structure of timefmt, laying the groundwork for future enhancements. fixed whitespace inconsistencies in several files for better readability and maintainability. addressed a typo in the timefmt module to prevent potential runtime errors. performed additional cleanup across the codebase, removing unused variables and functions. added a stub for timefmt to facilitate further development and testing."}, {"post_id": 31435, "ts": "2026-07-19T20:03:21Z", "hours": 6.1, "text": "📓 devlog · 2026-07-19 implemented rough version of timefmt, focusing on initial parsing logic for time strings. wired up timefmt to the main application flow, ensuring it integrates correctly with existing date handling. sketched out the overall structure of timefmt, laying the groundwork for future enhancements. fixed whitespace inconsistencies in several files for better readability and maintainability. addressed a typo in the timefmt module to prevent potential runtime errors. performed additional cleanup across the codebase, removing unused variables and functions. added a stub for timefmt to facilitate further development and testing."}, {"post_id": 30855, "ts": "2026-07-18T20:05:37Z", "hours": 5.6028, "text": "📓 devlog · 2026-07-18 modified pic module to include initial implementation and basic structure, established interface for adding images. expanded functionality of pic module, incorporated methods for adding and manipulating image data. began initial work on timefmt module, implemented rough outline for time formatting functions. fixed identified issues in timefmt, corrected incorrect time string conversions and edge cases. performed multiple iterations and cleanups on timefmt, ensuring consistent formatting and removal of redundant code. addressed whitespace issues throughout the codebase, maintaining code readability and standards. completed additional stubs for timefmt, preparing for future enhancements and detailed functionality."}, {"post_id": 30370, "ts": "2026-07-17T20:56:25Z", "hours": 6.6667, "text": "📓 devlog · 2026-07-17 started working on the vga module, established initial structure and placeholder functions for further development. cleaned up existing code, focused on reducing redundant lines and improving readability across various modules. fleshed out vga functionality, added basic rendering capabilities and memory layout for pixel data. implemented a timer system, ensuring precise tracking of time intervals, adjusted allocation for timer objects. added stubs for pic and timefmt modules, set up basic function signatures for future implementation. made multiple whitespace fixes across all files to conform to coding standards and improve consistency. tidied up pic module, streamlined control flow and ensured compatibility with vga rendering logic."}, {"post_id": 29723, "ts": "2026-07-16T20:17:42Z", "hours": 6.6667, "text": "📓 devlog · 2026-07-16 implemented serial communication module, established basic data transfer protocols and control flow. added serial interface to the main system, allowing for external device communication. fleshed out serial functionality, including error checking and buffer management. wired up serial connections for data transmission, ensuring correct pin mappings and signal integrity. sketched out io module structure, focusing on input/output handling and data processing paths. added initial io functions, implementing basic read/write capabilities for peripheral devices. began rough implementation of vga module, focusing on pixel data handling and display timing."}, {"post_id": 29115, "ts": "2026-07-15T19:34:57Z", "hours": 5.3667, "text": "📓 devlog · 2026-07-15 implemented console, added basic input/output functionality for user interaction through standard input and output streams. wired up console, ensured proper integration with the main application loop for event handling. implemented blockcache, optimized data retrieval by caching frequently accessed blocks in memory. wired up blockcache, linked it to the data storage layer to enhance read performance. stubbed and tidied paging, established the foundational structure for memory paging without full implementation yet. tidied serial, cleaned up the existing codebase for serial communication, improving readability and maintainability. added serial, integrated serial port communication for external device interaction, allowing data transfer between the application and peripherals."}, {"post_id": 28515, "ts": "2026-07-14T20:24:25Z", "hours": 6.6283, "text": "📓 devlog · 2026-07-14 added initial work on interrupt handling, defined basic structure for interrupt service routines. performed code cleanup to improve readability, removed unnecessary comments and streamlined function definitions. cleaned up formatting across several files to adhere to style guidelines, ensuring consistent indentation and spacing. created stub implementations for interrupt handlers, laying groundwork for future development and testing. sketched out a more detailed design for interrupt architecture, focusing on data flow and control mechanisms. tidied up existing interrupt code, organized functions, and reduced duplication in the implementation. continued refining interrupt handling logic, addressing edge cases and ensuring proper allocation of resources."}, {"post_id": 27885, "ts": "2026-07-13T19:57:58Z", "hours": 6.5711, "text": "📓 devlog · 2026-07-13 added stub interrupts to initialize interrupt handling in the system, setting up for further implementation. created a work-in-progress blockcache module, laying the groundwork for efficient data storage and retrieval. implemented the timer functionality, ensuring accurate time tracking within the system for scheduling tasks. cleaned up various modules including blockcache and interrupts, improving readability and maintainability of the code. fleshed out timer implementation details, refining the control flow for better performance in timing operations. performed multiple formatting fixes across files for consistent coding style, aiding in future collaboration. organized and tidied blockcache code, improving memory layout and preparing it for future enhancements."}, {"post_id": 27323, "ts": "2026-07-12T20:03:59Z", "hours": 6.5561, "text": "📓 devlog · 2026-07-12 cleaned up interrupt handling code, focused on reducing redundancy and improving readability without changing functionality. implemented stubs for interrupt functions to facilitate future development, allowing for easier testing and integration. performed multiple whitespace fixes throughout the codebase to maintain consistency in style, improving overall readability. formatted code to align with the project’s style guide, ensuring uniformity across various modules and files. addressed various cleanup tasks, removing unused variables and optimizing import statements for better organization. worked on interrupt-related functionality, marked as work in progress, which requires further testing and validation. applied additional tidying to interrupt handling to ensure clear control flow and efficient resource management."}, {"post_id": 26805, "ts": "2026-07-11T20:12:50Z", "hours": 7.3297, "text": "📓 devlog · 2026-07-11 added basic interrupt handling, defined interrupt vectors and handlers for specific events, ensuring correct execution flow. cleaned up existing code, removed unused variables and streamlined function definitions for better readability and maintainability. implemented rough interrupt logic, focused on initial data capture and processing for incoming signals from hardware. tidied up the interrupt code, organized structure for clarity, and ensured consistent naming conventions across handlers. performed multiple whitespace fixes and formatting adjustments, ensuring adherence to style guidelines throughout the project. worked in progress on interrupt functionality, laying groundwork for future enhancements and optimizations in response handling."}, {"post_id": 26151, "ts": "2026-07-10T19:35:47Z", "hours": 1.6197, "text": "📓 devlog · 2026-07-10 implemented wiring for idt, ensuring proper interrupt handling flow. created initial sketches for gdt, focusing on data structure layout and alignment. performed multiple whitespace fixes across files for improved readability. refined gdt implementation with rough and tidy stages, optimizing memory layout. wired up gdt, enabling segment-based memory management for the system. cleaned up interrupt wiring, enhancing control flow during interrupt processing. standardized formatting across the codebase to maintain consistency and clarity."}, {"post_id": 25764, "ts": "2026-07-10T06:38:12Z", "hours": 13.3744, "text": "📓 devlog · 2026-07-09 fleshed out README content to provide clearer project guidelines and usage instructions, improved overall clarity. made multiple formatting adjustments across the README files to ensure consistency and readability. started and wired up the initial draft of the interrupt descriptor table (idt), focusing on basic structure and future implementation. added stubs for idt functions, preparing for further development while ensuring initial code integrity. corrected a typo in the idt implementation, ensuring accurate naming conventions in the codebase. performed cleanup tasks on both README and idt files, removing redundant lines and improving organization."}]...
|
Title: NYX by @Paulaner | Stardance
Devlogs:
📓 de Title: NYX by @Paulaner | Stardance
Devlogs:
📓 devlog · 2026-07-09 fleshed out README content to provide clearer project guidelines and usage instructions, improved overall clarity. made multiple formatting adjustments across the README files to ensure consistency and readability. started and wired up the initial draft of the interrupt descriptor table (idt), focusing on basic structure and future implementation. added stubs for idt functions, preparing for further development while ensuring initial code integrity. corrected a typo in the idt implementation, ensuring accurate naming conventions in the codebase. performed cleanup tasks on both README and idt files, removing redundant lines and improving organization.
📓 devlog · 2026-07-10 implemented wiring for idt, ensuring proper interrupt handling flow. created initial sketches for gdt, focusing on data structure layout and alignment. performed multiple whitespace fixes across files for improved readability. refined gdt implementation with rough and tidy stages, optimizing memory layout. wired up gdt, enabling segment-based memory management for the system. cleaned up interrupt wiring, enhancing control flow during interrupt processing. standardized formatting across the codebase to maintain consistency and clarity.
📓 devlog · 2026-07-11 added basic interrupt handling, defined interrupt vectors and handlers for specific events, ensuring correct execution flow. cleaned up existing code, removed unused variables and streamlined function definitions for better readability and maintainability. implemented rough interrupt logic, focused on initial data capture and processing for incoming signals from hardware. tidied up the interrupt code, organized structure for clarity, and ensured consistent naming conventions across handlers. performed multiple whitespace fixes and formatting adjustments, ensuring adherence to style guidelines throughout the project. worked in progress on interrupt functionality, laying groundwork for future enhancements and optimizations in response handling.
📓 devlog · 2026-07-12 cleaned up interrupt handling code, focused on reducing redundancy and improving readability without changing functionality. implemented stubs for interrupt functions to facilitate future development, allowing for easier testing and integration. performed multiple whitespace fixes throughout the codebase to maintain consistency in style, improving overall readability. formatted code to align with the project’s style guide, ensuring uniformity across various modules and files. addressed various cleanup tasks, removing unused variables and optimizing import statements for better organization. worked on interrupt-related functionality, marked as work in progress, which requires further testing and validation. applied additional tidying to interrupt handling to ensure clear control flow and efficient resource management.
📓 devlog · 2026-07-13 added stub interrupts to initialize interrupt handling in the system, setting up for further implementation. created a work-in-progress blockcache module, laying the groundwork for efficient data storage and retrieval. implemented the timer functionality, ensuring accurate time tracking within the system for scheduling tasks. cleaned up various modules including blockcache and interrupts, improving readability and maintainability of the code. fleshed out timer implementation details, refining the control flow for better performance in timing operations. performed multiple formatting fixes across files for consistent coding style, aiding in future collaboration. organized and tidied blockcache code, improving memory layout and preparing it for future enhancements.
📓 devlog · 2026-07-14 added initial work on interrupt handling, defined basic structure for interrupt service routines. performed code cleanup to improve readability, removed unnecessary comments and streamlined function definitions. cleaned up formatting across several files to adhere to style guidelines, ensuring consistent indentation and spacing. created stub implementations for interrupt handlers, laying groundwork for future development and testing. sketched out a more detailed design for interrupt architecture, focusing on data flow and control mechanisms. tidied up existing interrupt code, organized functions, and reduced duplication in the implementation. continued refining interrupt handling logic, addressing edge cases and ensuring proper allocation of resources.
📓 devlog · 2026-07-15 implemented console, added basic input/output functionality for user interaction through standard input and output streams. wired up console, ensured proper integration with the main application loop for event handling. implemented blockcache, optimized data retrieval by caching frequently accessed blocks in memory. wired up blockcache, linked it to the data storage layer to enhance read performance. stubbed and tidied paging, established the foundational structure for memory paging without full implementation yet. tidied serial, cleaned up the existing codebase for serial communication, improving readability and maintainability. added serial, integrated serial port communication for external device interaction, allowing data transfer between the application and peripherals.
📓 devlog · 2026-07-16 implemented serial communication module, established basic data transfer protocols and control flow. added serial interface to the main system, allowing for external device communication. fleshed out serial functionality, including error checking and buffer management. wired up serial connections for data transmission, ensuring correct pin mappings and signal integrity. sketched out io module structure, focusing on input/output handling and data processing paths. added initial io functions, implementing basic read/write capabilities for peripheral devices. began rough implementation of vga module, focusing on pixel data handling and display timing.
📓 devlog · 2026-07-17 started working on the vga module, established initial structure and placeholder functions for further development. cleaned up existing code, focused on reducing redundant lines and improving readability across various modules. fleshed out vga functionality, added basic rendering capabilities and memory layout for pixel data. implemented a timer system, ensuring precise tracking of time intervals, adjusted allocation for timer objects. added stubs for pic and timefmt modules, set up basic function signatures for future implementation. made multiple whitespace fixes across all files to conform to coding standards and improve consistency. tidied up pic module, streamlined control flow and ensured compatibility with vga rendering logic.
📓 devlog · 2026-07-18 modified pic module to include initial implementation and basic structure, established interface for adding images. expanded functionality of pic module, incorporated methods for adding and manipulating image data. began initial work on timefmt module, implemented rough outline for time formatting functions. fixed identified issues in timefmt, corrected incorrect time string conversions and edge cases. performed multiple iterations and cleanups on timefmt, ensuring consistent formatting and removal of redundant code. addressed whitespace issues throughout the codebase, maintaining code readability and standards. completed additional stubs for timefmt, preparing for future enhancements and detailed functionality.
📓 devlog · 2026-07-19 implemented rough version of timefmt, focusing on initial parsing logic for time strings. wired up timefmt to the main application flow, ensuring it integrates correctly with existing date handling. sketched out the overall structure of timefmt, laying the groundwork for future enhancements. fixed whitespace inconsistencies in several files for better readability and maintainability. addressed a typo in the timefmt module to prevent potential runtime errors. performed additional cleanup across the codebase, removing unused variables and functions. added a stub for timefmt to facilitate further development and testing.
📓 devlog · 2026-07-20 implemented rough version of timefmt, focusing on initial parsing logic for time strings. wired up timefmt to the main application flow, ensuring it integrates correctly with existing date handling. sketched out the overall structure of timefmt, laying the groundwork for future enhancements. fixed whitespace inconsistencies in several files for better readability and maintainability. addressed a typo in the timefmt module to prevent potential runtime errors. performed additional cleanup across the codebase, removing unused variables and functions. added a stub for timefmt to facilitate further development and testing.
📓 devlog · 2026-07-21 added rough implementation of timefmt, establishing a basic structure for time formatting functionality. cleaned up code formatting across several modules to improve readability and maintainability. created stubs for timefmt, setting up placeholder functions for future development and integration. fixed a typo in the timefmt module, ensuring correct naming and preventing potential lookup errors. began work on paging, focusing on the initial design for memory management and data access. started implementing libk, aiming to enhance core library functions related to kernel operations. tidied up libk, removing unused code and optimizing existing functions for better performance.
📓 devlog · 2026-07-22 stub libk, added initial placeholder functions to define the interface and structure for future implementation. sketch libk, outlined key functionalities and features expected in libk to guide further development. ok actually fix libk, resolved an existing issue in the libk implementation that impacted function performance. cleanup, removed unnecessary code and comments in multiple files to improve readability and maintainability. formatting, standardized code formatting across several modules to ensure consistency in style and layout. add pic, integrated initial assets and images required for the project, ensuring proper paths and references. rough libk, created a basic version of libk to provide a foundational structure for ongoing enhancements.
📓 devlog · 2026-07-23 performed general cleanup across multiple files, removed unused variables and streamlined functions for better readability. initiated work on libk, added initial sketches for core functions and data structures, focused on modular design. formatted existing code for consistency, ensured alignment with style guide across all modified files. stubbed out additional functions in libk, set up basic structure for future implementation, no functional changes yet. implemented rough drafts of key algorithms in libk, focused on establishing functional outlines and placeholders. added sketches for paging functionality, laid ground for memory management, still a work in progress. fixed multiple instances of whitespace inconsistencies, ensured code meets formatting standards.
📓 devlog · 2026-07-24 implemented paging, added core functionality for memory management, ensuring proper control flow for page allocation and deallocation. fleshed out paging, defined page structures and their associated metadata for efficient access patterns. wired up slab, integrated slab allocation with paging to optimize memory usage and reduce fragmentation. rough paging, established initial framework for paging algorithms, focusing on basic page replacement strategies. performed cleanup in various modules, removing redundant code and improving readability. formatted code across multiple files, ensuring consistency in style and adherence to project guidelines. worked on libk, progressing on utility functions to support paging and slab management.
📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later.
📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later. 📓 devlog · 2026-07-25 added a slab allocator to manage memory allocation more efficiently, reducing fragmentation and improving performance for small objects. implemented a rough version of the slab with basic allocation and deallocation logic, focusing on a fixed-size object layout. created a sketch for the slab design, outlining the data structures needed for cache management and object tracking. performed multiple cleanup commits to improve code readability, removing unnecessary whitespace and standardizing formatting. fixed a typo in the slab implementation to ensure consistency in naming conventions across the module. added stubs for future slab functionality, allowing for easier expansion and integration of additional features later.
📓 devlog · 2026-07-28 implemented basic structure for the ring buffer, focusing on data insertion and deletion mechanics. fixed issues in the ring buffer related to overflow conditions, ensuring proper wrap-around logic. started initial work on the scheduler module, defining its role in managing task execution order. cleaned up code in various modules, removing unused variables and optimizing function calls for clarity. made progress on physical memory management (pmm), refining allocation strategies and data structures. wired up pmm with the existing memory system, ensuring compatibility with current allocation patterns. cleaned up and sketched additional plans for pmm, setting groundwork for more advanced features.
📓 devlog · 2026-07-29 removed unused variables in the scheduler module, improving readability and reducing confusion. organized the scheduling logic into smaller functions, enhancing maintainability and clarity in control flow. started work on the physical memory manager, focusing on the initial layout and allocation strategy. added basic structure for the physical memory manager, ensuring it aligns with existing memory management routines. performed multiple cleanups across the codebase, addressing formatting issues and whitespace for consistent style. iterated on the physical memory manager with rough implementations to establish a foundation for future development.
📓 devlog · 2026-07-30 added physical memory management (pmm) module, implemented basic allocation and deallocation routines for memory blocks. fleshed out pmm with additional functions for tracking free memory and fragmentation reduction strategies. wired up pmm with the scheduler, ensuring proper memory allocation during task creation and context switching. started work on the scheduler, focusing on establishing control flow for task prioritization and execution sequence. performed whitespace fixes across multiple files to improve code readability and maintain consistency.
📓 devlog · 2026-08-01 implemented physical memory management (pmm), structured memory allocation routines to handle page frames efficiently. added a programmable interrupt controller (pic), designed to manage hardware interrupts with a focus on prioritization and handling edge cases. started input subsystem, defined initial data structures and control flow for handling keyboard events. fixed typos and cleaned up whitespace across various files to improve code readability and maintainability. implemented keyboard handling, established key state tracking and event generation for input processing. performed multiple rounds of formatting and organization on the input code to align with project standards. created stubs for future input features, ensuring basic structure without full implementation for now.
📓 devlog · 2026-08-02 started initial implementation of the scheduling module, focusing on basic structure and control flow. sketched out the keyboard input handling, defining data layout and key event management. performed a cleanup of the existing codebase, removing unused variables and improving readability. fixed a typo in the scheduling module that could lead to misinterpretation of scheduling logic. wired up the keyboard functionality to capture input events, ensuring proper allocation of resources for key states. cleaned up whitespace across multiple files, improving overall code consistency and formatting. stubs created for keyboard handling, setting the stage for future development of input features.
📓 devlog · 2026-08-03 implemented syscall in the kernel, handling input and output operations for better interaction with user processes. wired up syscall to ensure proper communication between user space and kernel space, adjusting control flow for seamless execution. cleaned up codebase multiple times, focusing on removing redundant code and improving readability across various modules. added stub for rtc, laying the groundwork for real-time clock functionality, enabling time management features in future updates. addressed whitespace issues in several files, ensuring consistent formatting and adherence to style guidelines throughout the project.
📓 devlog · 2026-08-04 added initial structure for rtc, defined basic functions and headers for timekeeping. implemented core rtc functionality, allowing for setting and getting time with precision. cleaned up memory allocation in the cpu module, optimizing data access patterns. wired up cpu to handle rtc interrupts, ensuring correct handling of time-based events. fixed several whitespace and formatting issues across multiple files for consistency. addressed a typo in rtc definitions to prevent compilation errors. started work on syscall implementation, focusing on establishing foundational interfaces.
📓 devlog · 2026-08-05 added cpu module with basic structure and initial function outlines for core operations, set up initial memory allocation patterns. tidied up cpu code to improve readability, removed unused variables, and streamlined control flow in functions. began implementation of acpi, defining key data structures and laying out the function signatures required for system power management. wired up ktest to interface with cpu and acpi modules, ensuring proper data flow and control between the components. performed multiple cleanups throughout the codebase, focusing on removing redundant code and addressing formatting inconsistencies. fleshed out ktest to include test cases for cpu and acpi functionality, verifying expected behavior under various scenarios.
📓 devlog · 2026-08-06 tidied up the acpi module, removed unused variables and streamlined function calls for better readability. started work on the acpi module, established initial data structures for handling ACPI tables. performed whitespace fixes across multiple files to maintain consistent formatting, aiding in code maintainability. initiated ktest module, set up basic test framework for kernel testing. tidied up ktest, improved code organization by grouping related functions and reducing code duplication. began rough implementation of ata support, focused on defining data structures for device management. implemented core ata functionality, ensuring proper handling of ATA commands and data transfers.
📓 devlog · 2026-08-07 implemented ata, added core functionality and basic data processing logic. started ktest, set up initial test structure with basic stubs for functionality. fleshed out ktest, integrated test cases and improved coverage for ata interactions. cleaned up codebase, removed unused variables and simplified function calls across modules. performed multiple formatting updates, ensured consistent indentation and styling in source files. created stubs for ata, outlined functions for future implementation. addressed whitespace issues, standardized whitespace across all files for better readability.
📓 devlog · 2026-08-09 added ata module, structured data layout to optimize access patterns and reduce allocation overhead. implemented ktest, focusing on the test harness for kernel functionalities, ensuring control flow is correctly validated. wired up pci, improved integration with ata, facilitating better data transfer between components. tidied up ata, removed unnecessary complexity in the data handling logic to enhance maintainability. fixed typos in ktest to improve readability and avoid potential confusion in the test cases. worked on rough ktest, established initial test cases for future enhancements and iterations.
📓 plan · 2026-08-10 I’m starting the day later than usual, so I plan to tackle the whitespace fixes first to ensure our code adheres to the style guide. Once those are out of the way, I’ll focus on fleshing out the PCI subsystem, aiming for a more robust memory layout and control flow that supports our concurrency model. The evening will be dedicated to cleanup and further tidying of the PCI components, wrapping up with formatting to maintain consistency. If all goes well, I’ll end the day with a well-structured and polished segment of the codebase.
📓 devlog · 2026-08-11 added initial implementation for pci, structured to facilitate device communication in the system. performed multiple cleanup operations across the codebase, focusing on removing redundant code and improving readability. fixed whitespace issues in several files, enhancing consistency in formatting. refined the pci module’s layout to ensure efficient data flow and reduce memory overhead. ensured all cleanup efforts adhered to the existing coding standards, promoting maintainability. adjusted comments and documentation to reflect recent changes, particularly for the pci module.
📓 devlog · 2026-08-12 cleaned up various modules, removed unused imports and redundant code for better readability and maintainability. fixed whitespace issues across multiple files to ensure consistent formatting and adhere to coding standards. fleshed out the pci module, implementing initial structures and outlining the control flow for device communication. tidied up the ktest module, improved the organization of test cases and ensured proper initialization of test variables. stubbed the ktest module to establish a framework for future unit tests, setting up basic test cases without implementation. started the pci module, laying the groundwork for further development and integration with existing components.
📓 devlog · 2026-08-13 formatted various files for consistency, improved readability across the codebase. performed multiple cleanup tasks, removing dead code and refactoring functions for better maintainability. wired up the pci subsystem, ensuring proper connection and control flow with existing components. started initial implementation of ktest, laying out the basic structure and functions required for testing. tidied up the pci module by organizing functions and consolidating related code segments. addressed whitespace issues in several files to enhance overall code quality. stubbed out ktest functions to create placeholders for future testing scenarios and implementations.
📓 devlog · 2026-08-14 added initial sketches for ktest and pci modules, outlining the basic structure and intended functionality. conducted general cleanup across the repository, removing unused code and improving overall organization. made multiple formatting adjustments to ensure consistent code style throughout the project. implemented the pci module, focusing on memory allocation and control flow to handle device interactions. fixed typos in ktest documentation and comments to improve clarity and maintainability. worked on stubbing out ktest functionality, laying the groundwork for future testing features. addressed whitespace issues in several files to maintain code readability and adherence to style guidelines.
added module m6, structured to handle new data processing tasks with lower memory overhead.- wired up module m6, integrated it into the existing control flow to ensure correct data handling.- implemented core functionality for module m6, focusing on efficient allocation and deallocation.- wired up the hello module, ensuring it interfaces properly with other components.- implemented motd, providing a simple message on system start to enhance user experience.- worked on tar, stubbing out initial functionality while preparing for future enhancements.- performed cleanup across various modules, focusing on code readability and eliminating unused variables.
📓 devlog · 2026-08-17- implemented tar functionality, focusing on the compression algorithm and ensuring efficient file handling during archiving.- added multiple methods for extracting and listing files within the tar format, ensuring compatibility with various file types.- began work on the virtual file system (vfs), outlining the necessary data structures for managing file metadata and storage locations.- added initial stubs for vfs functions, setting up a foundation for future integration with the tar operations.- performed formatting changes across several files to improve code readability and maintain consistency in style.- addressed whitespace issues in the codebase to enhance clarity and adhere to coding standards.- continued development on vfs, sketching out control flow and interactions between the file system and tar operations.
📓 devlog · 2026-08-19 - cleaned up ktest, removed unnecessary code and improved readability for better maintainability. - began outlining ktest structure, defined major test cases and expected outcomes to streamline future development. - fleshed out vfs, added initial functions for file handling and directory structure, focusing on memory layout. - implemented basic elf loading, structured code to handle ELF file format parsing and memory allocation. - performed multiple cleanups across modules, consolidated formatting and fixed whitespace issues to adhere to style guidelines. - initiated elf module, set up initial framework for ELF support including header parsing and section handling.
📓 devlog · 2026-08-22 implemented ramfs, defined basic structure and operations for file handling and memory layout fleshed out ramfs, added functions for reading and writing files, ensuring proper memory allocation started ramfs, established initial setup for in-memory filesystem structure and controls cleaned up code across multiple files, removed unnecessary whitespace for better readability performed formatting adjustments, ensured consistent code style and indentation throughout the project worked on rough elf, iterated on the ELF parsing logic and data structures for improved parsing accuracy added additional cleanup commits for better organization and maintainability of the codebase
📓 devlog · 2026-08-23 added ramfs module, implemented initial allocation and file structure layout for in-memory file system. cleaned up whitespace and formatting across multiple files to improve readability and maintainability. stubs created for m4 module, establishing the basic structure and placeholders for future development. wired up ramfs to the existing system, ensuring proper integration with the kernel and other subsystems. worked on m4 module, refining control flow and preparing it for handling input and output operations. multiple sketches of ramfs and m4 completed, outlining potential features and behaviors for further implementation. conducted overall cleanup of the codebase, addressing minor issues and ensuring consistent coding standards.
📓 devlog · 2026-08-23- added ramfs module, implemented initial allocation and file structure layout for in-memory file system.- cleaned up whitespace and formatting across multiple files to improve readability and maintainability.- stubs created for m4 module, establishing the basic structure and placeholders for future development.- wired up ramfs to the existing system, ensuring proper integration with the kernel and other subsystems.- worked on m4 module, refining control flow and preparing it for handling input and output operations.- multiple sketches of ramfs and m4 completed, outlining potential features and behaviors for further implementation.- conducted overall cleanup of the codebase, addressing minor issues and ensuring consistent coding standards.
📓 devlog · 2026-08-25- worked on scheduling system, added preliminary structures for new scheduling algorithms while ensuring compatibility with existing code.- performed code tidying in the scheduling module, improving readability and reducing cyclomatic complexity.- implemented core functionality for module m5, focusing on resource allocation and control flow for task management.- fixed whitespace issues throughout the codebase, ensuring consistent formatting and adherence to style guidelines.- completed the implementation of module m5, integrating features from earlier sketches and ensuring edge cases are handled.- conducted cleanup on multiple modules, removing redundant code and ensuring proper memory allocation practices are followed.- added preliminary sketches for module m2, laying groundwork for future functionality and ensuring alignment with overall architecture.
📓 devlog · 2026-08-26 implemented module m2, focused on core functionality, ensured proper data handling and state management wired up module m2, established connections with existing components, validated data flow between modules started development on module m7, created initial stubs to define interface and behavior expectations fixed a bug in module m7 related to incorrect state transitions, improved control flow conducted cleanup across various modules, removed unused variables and optimized memory layout worked on ktest, tidied up existing tests, improved structure for better readability and maintainability performed whitespace fixes across multiple files to maintain consistency and adhere to coding standards
📓 devlog · 2026-08-27 cleaned up various sections of the codebase, focusing on removing redundant comments and unused variables for better readability. added module m7, defining its structure and initial state, laying groundwork for subsequent implementations. wired up m7 to existing systems, ensuring data flow and control paths are correctly established. fleshed out m7 with core functionality, implementing key methods and internal logic to meet specifications. began rough implementation of m9, setting up initial framework and placeholders for upcoming features. fixed typos in m9, correcting variable names and comments for clarity and consistency. implemented core functions for m9, following through on the designs sketched in earlier commits.
📓 devlog · 2026-08-28 cleaned up whitespace in several files to maintain code consistency and readability. implemented stub functions in module m8 to outline future functionality without full implementation. organized and tidied code in m8, removing unnecessary lines and improving structure. continued work in progress on module m8, addressing various incomplete sections. fleshed out details in module m8, adding logic to improve functionality and integration. added new features to m8, enhancing its capabilities based on recent requirements. performed additional cleanup in m8 to remove deprecated code and streamline performance.
📓 devlog · 2026-08-29 implemented main module, structured the control flow to handle various inputs and outputs efficiently. wired up main functionality, ensured integration with existing components while maintaining modularity. performed multiple whitespace fixes across the codebase to enhance readability and comply with formatting standards. cleaned up redundant code in main, improving maintainability without altering the core logic. fleshed out main, added necessary functions to support additional features and edge cases. tidied up main to simplify the execution path, reducing cognitive load for future development. formatted code consistently, aligning with project style guidelines for better collaboration.
📓 devlog · 2026-08-31 added main module, set up initial structure and entry points for control flow. wired up main, ensured proper integration with existing components. cleaned up codebase, removed unused variables and streamlined functions for better readability. tidied up main, focused on consistent naming conventions and indentation. addressed multiple whitespace issues, ensuring uniform formatting throughout the code. fleshed out main with additional functionality, enh
📓 devlog · 2026-09-01 added main module, defined basic structure and entry point for the application flow. cleaned up code formatting across multiple files, improved readability and maintained consistency. fleshed out main functionality, implemented key features and logic required for initial operation. performed multiple whitespace fixes, ensured compliance with style guide and improved diff clarity. started additional main implementations, focused on refining specific functions and control flow. tidied main module, reorganized code for better logical grouping and clarity, enhanced maintainability. conducted cleanup, removed unused variables and functions, streamlined overall codebase.
📓 devlog · 2026-09-02 tidied up the main module, removed unused imports and improved code readability through consistent formatting. wired up the main module with initial control flow, ensuring proper function calls and data handling. added a preliminary structure for the main module, including stubs for future function implementations. started development on drivers, implementing basic functionality and ensuring proper interaction with the main module. fleshed out the drivers with additional features, focusing on data handling and performance. sketched out the shell interface for user interaction, laying groundwork for input handling and command processing. performed multiple whitespace fixes across various files to maintain code clarity and consistency.
📓 devlog · 2026-09-03 added drivers for peripheral communication, structured to allow for easier integration with existing modules. fleshed out driver implementations, ensuring proper handling of initialization and resource allocation. started sketching a shell interface, focusing on command parsing and execution flow. performed multiple whitespace fixes across various files for improved readability and consistency. conducted cleanup of redundant code segments in the driver files, reducing overall complexity. wired up drivers to interact with the new shell, establishing a basic command execution pathway. implemented additional driver functionality to support expanded hardware features, enhancing overall system capability.
📓 devlog · 2026-09-05 added drivers for peripheral devices, ensuring proper initialization and configuration settings. implemented a basic shell structure, allowing for command processing and execution. performed multiple whitespace fixes across various files for improved readability and consistency. cleaned up existing code, removing unused variables and dead code to streamline execution paths. created a rough outline for the shell functionality, defining command handling and parsing logic. updated shell implementation to handle user inputs and provide feedback on command execution. added stubs for future shell commands, preparing for further functionality expansion.
📓 devlog · 2026-09-07 implemented fs, focused on the core file system structure, ensuring proper data layout for efficient file access. fixed a typo in the shell, improving command parsing accuracy and preventing potential runtime errors. tidied shell code by removing unnecessary whitespace and organizing functions for better readability and maintenance. performed multiple formatting updates across various files to adhere to coding standards, ensuring uniformity in style. continued work in progress on shell functionality, refining command handling and improving control flow for user input. completed cleanup tasks to remove unused variables and redundant code, optimizing memory usage and enhancing performance.
📓 devlog · 2026-09-08 added shell module, implemented basic command parsing and execution flow, using a simple function pointer array for command dispatch fleshed out shell functionality, included support for built-in commands and input handling, ensuring proper memory allocation for command buffers tidied up shell code, removed redundant whitespace and improved consistency in formatting to enhance readability performed multiple cleanups, refactored shell initialization code for better modularity and maintainability wired up shell to the main application loop, ensuring proper integration and execution flow with other components addressed multiple whitespace issues across files, ensuring consistent coding standards throughout the project
📓 devlog · 2026-09-09 implemented shell functionality, used a simple command parsing approach to handle user inputs effectively. added shell module, structured to handle basic commands and provide feedback to users. fleshed out shell with support for additional built-in commands, improving user experience and functionality. performed cleanup across multiple files, removing unused variables and optimizing control flow where necessary. started filesystem integration in shell, allowing for basic file operations within the command line. continued formatting work across the project, ensuring consistent code style and readability. tidied shell code for better organization, enhancing maintainability and future development efforts. 📓 devlog · 2026-09-09 implemented shell functionality, used a simple command parsing approach to handle user inputs effectively. added shell module, structured to handle basic commands and provide feedback to users. fleshed out shell with support for additional built-in commands, improving user experience and functionality. performed cleanup across multiple files, removing unused variables and optimizing control flow where necessary. started filesystem integration in shell, allowing for basic file operations within the command line. continued formatting work across the project, ensuring consistent code style and readability. tidied shell code for better organization, enhancing maintainability and future development efforts.
📓 devlog · 2026-09-10 implemented the filesystem (fs), focused on directory structure and file allocation strategies for improved access speed. wired up the fs to ensure proper integration with existing modules, tested data flow between components during initial operations. started the shell, establishing basic command parsing and execution control flow to interface with the filesystem. added memory management capabilities, implemented a new allocation strategy to minimize fragmentation and optimize performance. cleaned up the shell code for readability, removed redundant whitespace to maintain consistent coding standards across the project. performed additional wiring for memory to ensure it interacts correctly with both the filesystem and shell for seamless operation. fleshed out the fs with additional features like file permissions and metadata handling, ensuring robustness for concurrent access.
📓 devlog · 2026-09-11 implemented the shell module, established basic command parsing and execution flow. fleshed out the shell with support for built-in commands, enhancing user interaction. added memory management functionality, introduced a structure for allocation tracking. wired up memory to the shell, enabling commands to manipulate memory directly. performed multiple whitespace fixes and formatting cleanups across all modules for better readability. started and fleshed out the memory module, ensuring proper initialization and allocation patterns. tidied shell code for improved maintainability, focusing on reducing complexity in command handling.
📓 devlog · 2026-09-12 implemented memory management, focused on allocation strategies and freeing unused memory blocks to optimize resource usage. fleshed out memory module, added support for variable-sized memory chunks, improving efficiency for dynamic allocation. started integration of memory system with existing components, ensuring compatibility and smooth data flow. added shell functionality, enabling user interaction with the memory management system through command-line inputs. wired up shell to the memory module, establishing command execution pathways for memory operations. performed multiple wiring adjustments in the shell, ensuring proper communication and error handling between components.
📓 devlog · 2026-09-13 added initial implementation of the shell, establishing basic command parsing and execution flow. fleshed out shell functionality, improving command handling and improving error reporting for invalid inputs. wired up shell components, ensuring proper integration with existing modules for input and output processing. started multiple iterations of shell refinement, focusing on memory allocation strategies for command history storage. implemented additional features for the shell, including support for built-in commands and improved environment variable management. continued to flesh out shell behavior, addressing edge cases related to command substitution and pipeline execution.
📓 devlog · 2026-09-14 added initial architecture definition, establishing core components and their interactions for modularity. implemented key architectural components, focusing on separation of concerns to enhance maintainability. fleshed out various parts of the architecture, refining data flow and control structures between modules. wired up essential components to ensure proper communication and data exchange across the architecture. started multiple architectural elements concurrently, facilitating a more integrated approach to development. added several new architecture layers to improve scalability and support future feature additions. continued to implement and refine architecture, addressing edge cases related to component interaction and data integrity.
Ships:
nyx is a small operating-system kernel for 32-bit x86 PCs, written from scratch in Zig 0.15.2 with no C library and no external dependencies. It boots directly in QEMU and brings the machine up in 20 checked stages, from interrupts and timers through memory paging, a kernel heap, thread scheduling, disk and PCI drivers, and an in-memory filesystem loaded from an embedded tar archive. At boot it runs 15 built-in self-tests, then drops into an interactive shell with 30 commands that you can drive from the keyboard or over the serial port. It’s about 5,000 lines in total....
|
1792604855.109941
|
1792691255.109941
|
|
2155
|
obliberry by @torkel | Stardance
|
torkel
|
1
|
433.12
|
5134
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-04T09:34:08Z", "hours": 270.0, "multiplier": 19.51, "payout": 5134, "blessing": "neutral", "text": "obliberry feels usable enough that i think its a good time for a first ship :) obliberry is a fallout-inspired isometric game engine for hex-grid games, written in C++20 with OpenGL, featuring a visual editor, an ECS core, its own scripting language, and single-file packaging/exports. this has all been rather challenging, but an incredibly fun learning project, especially regarding using modern C++, OpenGL, and making my own programming language it is still obviously not fully complete of course, but I think it’s in a rather good state :D", "repo": "https://github.com/torkelicious/obliberry", "demo": "https://github.com/torkelicious/obliberry/releases"}]...
|
[{"post_id": 81496, "ts": "202 [{"post_id": 81496, "ts": "2026-10-21T14:23:50Z", "hours": 7.1158, "text": "script properties & UUID types scripts can now declare properties that show up in the inspector and get saved per entity. also ripped std::string UUIDs out of most of the engine in favor of an actual Core::UUID type, plus some scripting additions and a few tests. changes script properties Prop(\"SpeedOrSomething\", 2.5) , PropEntity(\"TargetEntity\") and PropUI(\"MyRect\") for regular values, entities and UI elements properties show up under each script slot in the inspector, with appropriate controls and per-slot values values are only readable during top-level script execution, so store them in variables for use in hooks. Prop in a hook just returns the fallback saved as scriptProperties in scene JSON, omitted when empty property edits support undo, including live number/string editing. unused saved properties can be pruned with undo too.. ScriptSlot is move-only now Core::UUID replaced string UUIDs across the registry, UI, editor commands, project config, save directories and scripting with a 16-byte Core::UUID registry UUID lookups now use an index instead of looping through entities malformed UUIDs in files fall back to generated or nil UUIDs UI UUIDs are saved and restored, including nested elements. duplicate UI UUIDs are handled without crashing the loader savegame directories etc take a UUID directly scripting & UI script objects now have identity values and wrappers are readonly , along with various scripting result objects. came with an ObSL bump UI wrappers get SetParent(parent) and a uuid field. null reparents an element to the root UISystem::Reparent preserves ownership and prevents parenting an element under its own descendant new created scripts use fn on_update(dt) (I wrote on_update() last time …oops…) smaller stuff UndoManager::Execute returns whether the command applied script list shows filenames with Remove beside them tests and docs more tests and docs updated ofc… so u can reference entities in scripts without using Find() now!!!"}, {"post_id": 80249, "ts": "2026-10-16T21:56:07Z", "hours": 3.8333, "text": "uuid-bound script wrappers…, logger sinks…., and a pile of small editor stuff…. mostly scripting + logging plumbing this time, plus a couple of editor things I’d been wanting… changes script wrappers are uuid-bound now entity wrappers used to capture the raw runtime id, which is a problem if ids get recycled or the registry gets rebuilt. now every wrapper holds the entity’s uuid and resolves the live id on each call, so it keeps pointing at the right entity (or does nothing if it’s gone). new FindEntityByUUID(uuid) global and GetUUID() / .uuid on entity objects SetParent matches an entity object by uuid, a plain number is still a runtime id same treatment for UI wrappers: they resolve by uuid instead of name, so renaming or duplicate names don’t break them added FindUIByUUID , GetUUID() and Destroy() on UI elements, and SetImage / GetImage on images (acquires the texture through the scene asset scope like fonts do) still by name: FindUI , DestroyUI and the button state queries ( WasClicked / IsHovered / IsHeld ). UI scripting is still weird… work in progress i guess… logger sinks the old way was swapping the logger’s std::ostream for a stringstream that the UI panel also read from, which was a data race waiting to happen (logger thread writes, main thread reads). replaced it with actual sinks: ILogSink with ConsoleSink (stdout/stderr like before) and UILogSink (mutex -ed pending buffer the panel drains each frame) the editor and runtime both register a ConsoleSink , and the editor adds the UI sink on top, so the Logs panel is always there now instead of only when there’s no tty console panels color lines by severity now interpreter output goes through a small UiStream ostream into the ObSL panel, with stdout and stderr split (needed the bumped obsl, Interpreter takes both streams now…) ObSL panel clears when you enter play mode editor F focuses the camera on the selected entity, press it again to go back to the origin. its smooth…., ..panning cancels the focus keyboard pan only gets called when there’s actually input now.. editing a material in the inspector no longer mutates shared runtime-only materials. if it isn’t a catalog asset it gets cloned into assets.json first, and edits to catalog materials get “upserted” back to the catalog. “Clone Material” writes to the catalog too new scripts from the project browser come with an on_update stub instead of just a comment scripting runtime script top-level code now runs with the command buffer in “immediate” mode ( BeginImmediate / EndImmediate ), so registry writes at the top of a script apply right away instead of waiting for a flush that hasn’t been set up yet during init Hex_GetNeighbors wasn’t GC protecting its array while filling it, fixed…. grid tile textures a tile type with no texture used to fall back to hex_tex both when collecting dependencies and when loading scenes, which would pull in a texture that might not exist. now no texture means no texture… as it should… misc bumped obsl (new using alias feature, and err output stream settings) docs for all the uuid stuff, the F key, and the new UI/image methods… of course… oh also … new demo scene testin thingamabob im messing with…"}, {"post_id": 79544, "ts": "2026-10-14T15:18:47Z", "hours": 7.9614, "text": "map edit kinda overhauled changes map edit stuff the brush size is now 1 to 8 instead of 1 to 5. size 1 is one hex, size 2 is 7, size 3 is 19, etc. Ctrl +scroll also changes the size added Rect and Circle shapes alongside the brush. they work with Paint, Erase and Select. Rect uses opposite corners, Circle goes from a center out to the hex you release on. both apply on release paint previews are green, erase previews are red, and selection previews are yellow. selected tiles get a blue overlay added tool hotkeys: B for Paint, E for Erase and Q for Select Esc cancels a drag. Rect and Circle do nothing if cancelled, while a brush stroke gets reverted instead of leaving half the changes behind loading a map now prompts before discarding a dirty map, and successfully creating or loading a map clears the old undo history selecting and editing multiple tiles Select now supports click and drag, Shift +drag to add to the selection and Ctrl +drag to remove from it the toolbar shows the selection count and has Clear and Delete buttons. Delete removes all selected tiles in one undo step the Tile Editor can edit the type and walkability of the whole selection at once. when selected tiles differ, the controls show mixed values etc. material editing only appears when every selected tile shares a type. Override Current Type changes the material for every tile using that type, while Save as New Type assigns a matching type to the selection without changing every other tile using the old type brush strokes, Rect/Circle fills, deletes and bulk type or walkability changes are each grouped into one undo step. changing a type’s material itself is still not undoable…. the console…. logging now has a sink system, so the same formatted log messages can go to different outputs the editor now has separate Logs and ObSL panels. engine/application logs go to Logs now, and script stdout goes to ObSL the panels have Clear and Copy buttons and keep the latest 2000 lines. the UI sink buffers incoming logs under a mutex before the editor consumes them closing the editor closing the window now goes through a callback, so unsaved scene or project changes trigger the save/discard prompt instead of immediately closing removed the old global Esc -to-quit shortcut. ObSL’s CloseWindow() no longer closes the editor while in Editor mode. it logs that it was called instead. in the runtime, it still closes the window windows and smaller fixes enabled /MP for MSVC builds, and the editor/runtime targets use the Windows GUI subsystem so they don’t launch with a console window attached atomic file writes now write the byte buffer explicitly and retry Windows file replacement when it fails with access-denied or sharing-violation errors, for up to about 2 seconds a bit of cleanup around collision pair sorting, const-correctness and naming docs updated the editor guide and screenshot to cover the new tools, shapes, selection controls, shortcuts and undo behavior. blah blah …map editing is finally a lot less barebones…"}, {"post_id": 78861, "ts": "2026-10-11T19:54:19Z", "hours": 3.0197, "text": "uhhh changes dont nuke scene on failed load scene deserialization moved out of Scene::OnEnter into SceneManager::LoadScene , and now runs before the old scene gets torn down. if the new one fails, you stay in the old scene ( LoadSceneByPath returns a bool now) loading is stricter. missing map files, bad/out-of-range/cyclic parent values and broken UI sections fail the load instead of logging an error and limping on persistent entity migration happens before the swap too, so a failed asset acquire can’t leave you half in the new scene the editor’s LoadScene used to clear the current project before trying to load. now undo history and selection only get cleared once the load actually worked saving: map write failures now propagate instead of reporting success, and files get closed before the error check destroying entities DestroyEntity was recursive, now it’s iterative with a visited set. deep hierarchies, cycles and duplicate child entries no longer kaboom the stack or double delete, and children go first (wow that sounds dark) Reparent and SetParentDirect go through CanSetParent , which rejects cycles and stale parents, even if the existing hierarchy is already cyclic script DestroyEntity / entity.Destroy() now use RequestDestroy to tag the entity and its whole subtree instead of deleting immediately, so on_destroy runs before deletion. scene exit drains the destroy queue too, including entities tagged by exit hooks the script wrapper cache evicts an entity when it’s destroyed a dumb one…: the hot-reload cleanup list had on_exit in it twice and no on_destroy , so on_destroy GC roots never got released … the script system was holding raw ScriptComponent* across initialization, which dangles if a script spawns enough entities to grow the pool. it looks components up by entity ID now script runtime reinitialization after a scene change uses the VFS path and reruns setup, so using imports keep working from the mounted project ui undo UI elements have UUIDs now, and undo commands resolve them by UUID instead of holding raw pointers. removing an element captures the whole subtree plus its sibling position, so undo restores the hierarchy and order. renaming also updates the name index live. smaller fixes collision broadphase is a “spatial hash grid” now instead of checking every pair lightmap rebakes when ambient changes, and handles maps with no tiles atomic file writes use unique temp names so concurrent writers don’t trip over each other project changes wait for background asset loads to finish timeout timers are mutex-protected, and callbacks can schedule more timers without deadlocking SmallTask over-aligned captures fall back to the heap VFS::Resolve(\"..\") had UB from a std::mismatch that wasn’t bounded on the second range… PlayMusic stops, swaps and starts under the lock now instead of racing!!! tests wrote a pile of tests alongside all this: atomic writes, wrapper cache, hierarchy safety, map serialization, save concurrency, scene loading failures, script lifecycle, script modules, SmallTask and timeouts. expanded to the editor command, save game and VFS tests. so EVEN LESS explosions !!! Woo!"}, {"post_id": 78453, "ts": "2026-10-10T20:34:34Z", "hours": 4.7336, "text": "undo stuff + render lifetime fixes undo / redo the undo system relied way too much on runtime entity IDs and direct pointers into components. that works until an entity gets deleted, an ECS slot gets recycled, or a dense component pool moves stuff around… entity commands now store the entity UUID and resolve the current runtime entity when they execute / undo instead. this now applies to transforms, renaming, adding / removing components, script changes, component field edits and map painting. so older commands can still find the right entity even if it was deleted and later restored with a completely different runtime ID. deleting things is actually undoable now finally added proper undo for deleting entities. !!!!!! deleting an entity snapshots the whole subtree first, including components, UUIDs, names, hierarchy + sibling order, scripts, custom data and asset references. undo rebuilds the tree, reloads required assets, restores the UUIDs and puts everything back where it was. this also means edits from before the deletion still work afterwards, since those commands just resolve the restored entity by UUID. paste uses the same snapshot system now too, so undo / redo keeps the same pasted entity identities instead of creating unrelated ones every time. there are checks for conflicting UUIDs, missing parents, invalid hierarchies, missing assets etc. failed restores shouldn’t leave half-created entities behind. failed commands also no longer get added to undo history or wipe an existing redo chain. custom ObSL data custom script data needed special handling too. arrays / objects can share references or even be cyclic, so just copying ObSL::Value s wasn’t enough. there’s now a snapshot format that captures the object graph and rebuilds it through the interpreter + GC when an entity is restored. CustomDataComponent also roots stored ObSL values properly so GC-managed objects stay alive. runtime functions aren’t snapshotable though, so deletion just fails instead of restoring garbage. render thread lifetime stuff also did a pretty big pass over renderer resource lifetime, mostly because scene switching could unload resources while an already submitted frame was still using them. (this started because someone mightve pointed out a lil crash for me…) render commands now pin the meshes, materials, shaders and textures they need until that frame is done. same idea for UI textures and the editor viewport framebuffer. OpenGL objects also don’t call glDelete* from whichever thread destroys the C++ object anymore. textures, shaders, buffers, VAOs and framebuffers queue deletion for the render thread, while it actually owns the GL context. less bugs yay frame state + shutdown renderer state that can change while the render thread is behind is captured per frame now too, including clear color, post-processing and UI resolution / projection state. shutdown is also more deliberate now: worker threads stop first, background font loads finish, scripts stop, scenes/resources are cleared, renderer/UI resources shut down, then the remaining GL delete queue is processed while a context still exists. font loading uses tracked jthread s now too instead of detached threads. small things exporting now reports success / failure back to the editor and shows a little result popup instead of silently relying on the console. also added tests around delete / restore, UUID reuse, hierarchy restoration, script components, map edits, pasting, command failures and repeated undo / redo without leaking entities or asset references. so. .. . less explosions hopefully sorry if wording is weird.. character limit.."}, {"post_id": 78136, "ts": "2026-10-09T18:21:07Z", "hours": 3.2578, "text": "export dependencies + prefab asset loading redid how exporting figures out what needs to go into the package previously editor export was basically much closer to just packing the project directory. now it builds a dependency manifest first figuring out what to export export starts from the project + scenes and follows the things they reference: catalog assets used by entities, maps, UI and post processing map files attached ObSL scripts script using imports scenes loaded from scripts prefabs instantiated from scripts music / sound files material textures + shaders animation sheets shader #include s referenced scenes and prefabs get scanned too, dependencies keep chaining from there. it then generates a new filtered assets.json specifically for the package instead of sticking the entire project catalog in there. the actual project’s catalog is untouched. script analysis added a ScriptAssetAnalyzer which walks the ObSL AST without actually running anything. literal stuff can be narrowed down properly, including things like: PlayMusic(\"assets/audio/music.ogg\", 1.0) or even constant string concatenation… asset setters like SetTexture / SetFont get tracked too. if a texture or font ID is dynamic, export keeps that entire asset category. if a runtime file path for stuff like LoadScene , Instantiate , PlayMusic or PlaySound2D can’t be figured out, it falls back to keeping the eligible project files + full asset catalog. unknown / indirect calls are done the same too so simple projects get smaller exports, while weird dynamic scripting should still work… .pakignore still applies, and required files being missing or ignored is now an export error prefab assets also fixed prefabs properly interacting with the lazy asset system. instantiating a prefab now scans its components, acquires whatever catalog assets it needs, resolves their dependencies, and retains them in the scene before creating the entity. so a prefab can use an asset that wasn’t already referenced by the scene and it should just work. scene asset scopes got changed a bit for this too. instead of accumulating a new scope every time something acquires assets, they’re merged into one scene scope and duplicate asset references are ignored. also made prefab revert a little safer so the old entity isn’t destroyed unless the replacement prefab actually instantiated successfully. packaging / ci things editor packaging is stricter in general now. script dependency validation can fail the export, missing dependencies stop it, and PackageCurrentProject reports failure so the rest of the export doesn’t continue pretending everything is fine. shader includes are followed during dependency collection too, while the engine shader helpers still get bundled for runtime includes. also cleaned up CI a decent bit… also some more tests too for the packaging and script analysis lowk sorry for just posting an image of the logs idk how else to show it since it’s mostly backend / file stuff 😭"}, {"post_id": 77620, "ts": "2026-10-07T17:38:02Z", "hours": 3.62, "text": "more tests (more bugs) kept going with the unit tests the test suite now covers most of the important stuff, including: ECS / entity IDs / UUIDs serialization + hierarchies collision geometry, events and movement maps animation saves ObSL + some EngineLib bindings assets / asset lifetime VFS + packaged projects configuration editor undo commands also added a couple integration tests for audio and rendering (OpenGL tests are optional) finding things unsurprisingly this found some actual problems too. stale entity handles can no longer remove / access components from an entity that reused the same slot, and editor undo commands are a bit safer around entities or components disappearing. also fixed some hierarchy rotation decomposition weirdness, cleaned up VFS / package mounting state so old package data can’t leak into the next mount, and added a few other small null / cleanup checks around scenes and rendering resources."}, {"post_id": 76449, "ts": "2026-10-03T15:32:32Z", "hours": 3.1158, "text": "unit tests (& some fixes) uhhhh started adding actual unit tests… i was kinda putting it off but i gotta have it… set up GoogleTest + CTest and started covering some stuff ECS registry / generational IDs entity UUIDs entity serialization hierarchy / parenting collision events + movement blocking save games maps bugs bugs bugs… and unsurprisingly, writing tests immediately started exposing some smaller issues. fixed stale entity handles being able to mess with components belonging to a recycled entity slot, and cleaned up some hierarchy transform / rotation handling that wasn’t preserving transforms correctly in certain parenting cases. also tightened up a couple math helpers while testing them. im still gonna write even more tests.. its very needed at this point and will prolly help me find some more bugs i missed before…"}, {"post_id": 75890, "ts": "2026-10-01T14:46:00Z", "hours": 5.4794, "text": "uuids, collision layers, save settings, and other stuff bit of a mixed bag this time. mostly cleaning up some systems that were already there and filling in stuff I’d need… entity UUIDs entities have proper UUIDs now, separate from their normal runtime entity IDs. the regular generational ID still does all the normal ECS stuff, while the UUID is a stable identity that gets serialized with the entity. this mostly fixes how persistent entities work between scenes. previously I was deduplicating persistent entities by name , which was obviously not ideal since names aren’t actually identities. persistent entities + their children now keep their UUIDs when moving between scenes, and if the destination already has an entity with the same UUID it gets replaced by the carried-over one. two things can have the exact same name now without persistence randomly deciding they’re the same thing. normal prefab instances / newly created entities still get new UUIDs. collision layers colliders now have proper layers + masks. there are 32 collision layers, and every collider has: a layer a 32-bit mask of layers it accepts both colliders have to accept each other’s layer for the pair to interact. the same filtering is used for normal overlap events and movement blocking, so there isn’t a separate set of collision rules depending on which system happens to be asking. added editor controls for this too, including the layer selector, all 32 mask toggles, and select all / deselect all buttons because clicking 32 checkboxes individually sounds incredibly fun. scripts can also read / change the layer and mask now. collision-aware script movement also added Transform.TryMoveTo(x, y, z) to ObSL. unlike SetPosition , this checks whether the entity can actually occupy the destination before moving it. the normal hex movement system uses the same helper now too, so script-controlled collision-aware movement and normal movement go through the same path. direct SetPosition is still basically teleporting, which is intentional. also fixed on_collision_stay actually looking up the collision stay callback instead of the trigger stay callback. whoops. more save settings did some more work around the save system from the last update. saving can now be enabled / disabled per project, and projects can choose where save files go: Data Home , the normal OS application-data location Portable , relative to the executable both still use the project UUID underneath so different projects don’t start sharing save files because somebody named both of them game . these are editable from Project Settings now. also added a confirmation dialog when regenerating the project UUID since doing that changes which save directory the project looks at. the old saves aren’t deleted, the project just gets a new identity and stops finding them automatically. graphics config stuff changed packaged builds so graphics.json can live beside the executable and override the version inside the package. (i.e if someone decides to unignore the graphics config and package it) couple random fixes particle emitters now keep their actual live particle count, so GetAliveCount() in ObSL finally returns the real value instead of the completely useless placeholder it had before. fixed a prefab revert issue where the code was reading the prefab path from the component after destroying the entity. very intelligent. also made theme font loading a bit less fragile. missing / broken font files get logged and skipped instead of potentially taking the whole theme load down with them, plus some parsing cleanup. and updated another mountain of docs to match all the collision, persistence, save, prefab, post-processing and export changes."}, {"post_id": 73199, "ts": "2026-09-24T16:15:43Z", "hours": 7.0497, "text": "save system i wanted this to be pretty generic instead of the engine having some hardcoded idea of what a “player save” or whatever is, so the actual save data is ba sically just key/value storage that scripts can use for whatever they want!!! save data there’s now a SaveGameManager which keeps one active save in memory. save values can currently be: booleans numbers strings the file format is versioned and also stores a display name + created / updated timestamps. the actual save data itself doesn’t really care what the values mean. it is any key value pair that persists. there’s also locking around the active save since scripts can be running across multiple workers….. project UUIDs projects also have their own UUID now. it’s generated when the project is created or when a project that does not already have one is opened right now it’s mainly used to give each project its own save-data directory without name collisions but im sure its good to have outside that!!! save files the basic save file operations too create a new save write the current active save load a save delete a save list existing saves start a fresh unsaved “game” save filenames are generated from timestamps. the human-readable name stays inside the file, display names don’t need to also be valid / unique filenames. save_list() also gives creation + update timestamps, and saves are sorted by most recently updated. writes are atomic too, so it writes through a temporary file before replacing the real save instead of directly nuking the existing one and hoping for the best per-project save directories save data is stored outside the project itself in the normal OS application data home each project gets its own directory based on its UUID <data home>/obliberry/<project uuid>/saves/ projects with the same name don’t fight over the same saves.. (i have several projects just called “UntitledProject” lol) this is LocalAppData on Windows, Application Support on macOS, and XDG_DATA_HOME / ~/.local/share on Linux. both the editor and runtime configure the save manager when the project is loaded, and it gets reset again when the editor closes the project ! ObSL ObSL savedata enginelib intergration: basic data stuff: save_set(key, value) save_get(key) save_has(key) save_remove(key) save_clear() save_new() save file management: save_create(name) save_write() save_load(filename) save_delete(filename) save_list() save_list() returns an array with the filename, display name, creation time and last update time some cleanup also pulled the atomic file writing stuff into a shared OS file utility, so assets.json can use the same code instead of having its own implementation. bunch of formatting stuff too i still have to document this and do some more testingf but yeahhh"}, {"post_id": 71462, "ts": "2026-09-20T21:23:42Z", "hours": 6.445, "text": "asset system refactor + some editor stuff been wanting to redo how assets work for a while now. until now scenes carried the asset definitions with them, and loading scenes would keep throwing resources into the global resource manager. worked fine enough , but it also meant resources could kinda just accumulate forever.. i seperated them now!! assets.json projects now have a project-wide assets.json catalog. textures, shaders, meshes, materials, fonts, animation sets, etc. live there instead of getting serialized into every single scene. scenes / prefabs / UI / animations etc. just store resource IDs and the definitions live in one place besides making scene files considerably less bloated, this means saving a scene no longer serializes whatever random collection of resources happens to currently exist in the resource manager lazy asset loading having one project-wide catalog does not mean loading the entire project into memory. scene loading now scans for the resources that scene actually references and loads those from the catalog this includes stuff referenced by: entities maps / tile types UI post processing spritesheets / animators dependencies get resolved too so if something needs a material, its shader + texture get pulled in first. animation sets pull in their spritesheet texture, etc. etc. now the the resource manager should only contain what is actually being used asset lifetime stuff added SceneAssetScope for keeping track of what assets a scene has acquired. assets are retained while something needs them and can actually be unloaded once the last scope using them disappears so changing scenes repeatedly should no longer turn the resource manager into yummy more objects :O forever…. persistent entities reacquire the resources they need when moving between scenes too. there’s also handling for catalog entries being replaced / deleted while their old resource is still loaded. those can be marked stale and discarded safely once the old scene lets go of them instead of leaving weird zombie resources around. engine assets still stay around like normal. editor asset workflow the editor now goes through the asset catalog too. creating / importing / replacing / deleting things like: textures shaders meshes materials fonts animation sets updates assets.json instead of depending on scene serialization to preserve them…. supported editor selections / script setters can also acquire catalog assets on demand and attach them to the current scene’s asset scope old projects old projects obviously still have all their assets embedded inside their scene files, so I added an ob_asset_migrator tool. it can scan the old scenes and merge all of those definitions into a project-level assets.json . there’s: dry-run validation conflict detection optional removal of the old scene assets sections backups before it starts rewriting stuff uses backups because i dont trust myself enough .. might vaporize projects who knows… docs docs docs also updated a stupid amount of documentation for the new asset model … since of course.. there’s now a full assets.json format page covering the different asset types, dependencies, lazy loading, asset scopes, editor behavior and migration. updated the scene / prefab / animation / post-processing docs too since all of those previously described assets as being stored directly in scenes. also cleaned up the main README + docs index a bit and updated the feature list because quite a lot of it was outdated at this point…. theme presets also did some work on editor themes. split the built-in theme definitions out and added some interesting presets: Obliberry Dark ImGui Classic Dark Obliberry Light ew imagine using light themes… High Contrast Dark Haxxorman Green editable and all… tldr: resourcemanager is now longer an infintly growing landfill…"}, {"post_id": 70788, "ts": "2026-09-19T19:20:34Z", "hours": 1.5706, "text": "I will not elaborate"}, {"post_id": 70712, "ts": "2026-09-19T17:13:26Z", "hours": 3.3022, "text": "animation editor continued working on the animation system and made the editor UI…. animation editor there’s now a Sprite Animation Editor you can: choose the spritesheet texture edit rows / columns / spacing create, rename and delete clips toggle looping per clip edit individual frame indices + durations move frames up / down duplicate / remove frames expand / collapse the frame list also added range generation so adding a normal animation doesn’t make you manually enter every frame one by one….. theres also an Apply FPS to All Frames button ! preview added a live preview for the selected clip. you can play, pause and restart it woaw it shows the current clip frame and spritesheet index while it runs…. project browser integration animation assets are properly integrated into the project browser now too there’s an Animations section where you can create, import, edit and delete animation assets creating a new one lets you choose its path then opens it in the animation editor. the animation asset workflow is mostly usable from inside the editor :D erm even more enginelib changes for the new systen that i still have to document… ( Play() Restart() etc) some cleanup working on… some mostly const-correctness, explicit casts, ranges, include cleanup and some other small stuff etc etc.. god bless resharper c++ also cleaned up some EngineLib entity wrapper code around registry locking so it can create wrappers safely when the registry mutex is already held spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly"}, {"post_id": 70230, "ts": "2026-09-18T19:10:52Z", "hours": 6.3242, "text": "btw pls star on girhub animation clips / refactoring spritesheets …kinda refactoring the whole spritesheet animation thing already the first version worked, but having FPS / looping / frame ranges etc directly on the SpriteSheetComponent was gonna get pretty limiting cuz what if I wanted multiple animations for one sprite. it might sound stupid but for me it’s always worked to get a prototype working, then refactor/reimplement it. thats even what i did for this entire project early on, before it deleoped into a full on engine :D so now the spritesheet is mostly just the sheet + currently displayed frame, and animation playback is seperate animation clips working on proper animation sets + clips. an animation asset can have one spritesheet and multiple named clips, with each clip containing its own list of frames :D each frame also has its own duration now instead of the whole animation just sharing one FPS value, so stuff like holding a frame longer or doing irregular timing is possible without clips can loop independently too animator component added a separate SpriteAnimatorComponent which handles the actual playback state: animation asset initial clip autoplay current clip current frame inside that clip elapsed time playing state the normal SpriteSheetComponent is way simpler now… it just says what sheet + frame should currently be rendered (the animator updates that for it) animation assets animation sets are assets now under assets/animations/ they serialize separately and contain the spritesheet setup plus all the clips / frames / durations they are loaded through the normal asset system and registered in the ResourceManager scene serialization now keeps the animator config like the selected animation asset, initial clip, and autoplay editor stuff the sprite sheet inspector got reworked for the current thing but whole UI stuff isnt finished once an animator is attached it owns the sheet/frame instead of both systems trying to edit the same thing. I still need a proper UI for actually making / editing animation assets and clips though. i shall work on this next!!! (right now the backend is pretty much all ive done but its taken a lil longer than i thought… who wouldve thought adding cips cleanly would take this whole aah refactor) scripting EngineLib updates too SpriteAnimator in scripts can now do: Play(\"walk\") Restart(\"walk\") Pause() Resume() Stop() IsPlaying() GetClip() it is now based on named clips so i guess not anything flashy to show but… its stuff :)"}, {"post_id": 69178, "ts": "2026-09-16T15:19:06Z", "hours": 4.2144, "text": "spritesheets / animation finally … spritesheet support spritesheets added a new SpriteSheetComponent with: texture rows / columns optional row + column spacing start frame animation length FPS looping playing / paused state current frame basically the renderer can now render only a specific UV region of a texture animation also added a small sprite animation system that advances frames based on FPS and handles looping / stopping at the end etc etc animations also update while in the editor… might be annoying for some, might be less annoying for others.. but thats how i like it editor stuff you can pick the texture, set rows / columns and spacing, choose the start frame + animation length, change FPS, toggle looping / playback, scrub the current frame, restart the animation, etc. etc EngineLib scripts can inspect stuff like the current frame, frame count, FPS, rows / columns and texture, and can also change the texture/grid/animation, set frames, play, pause, restart and stop animations. Collider also has a proper EngineLib component wrapper instead of collision only being accessible through the callback hooks. right now that’s just getting / setting whether it’s a trigger, but it’s there. also added both Collider and SpriteSheet to the normal GetComponent , AddComponent , RemoveComponent , HasComponent , etc. obviously. some cleanup did a bit of registry / EngineLib locking cleanup while I was in there too, mostly around entity wrappers being created while the registry lock is already held. also fixed one very stupid collision callback typo where on_collision_stay was looking up the wrong hook… oops….. im also starting on documenting this stuff…. yep.. pain… spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly"}, {"post_id": 67894, "ts": "2026-09-14T06:13:59Z", "hours": 2.1764, "text": "collision callbacks scripts can do collision things now….!!! script collision callbacks ObSL scripts can now define collision hooks: on_collision_enter(other) on_collision_stay(other) on_collision_exit(other) on_trigger_enter(other) on_trigger_stay(other) on_trigger_exit(other) the other argument is a normal EngineLib entity wrapper, scripts can do stuff like check its name, components, etc. collision events get collected by the CollisionWorld , then dispatched to the relevant script instances afterwards. they’re also run through the existing script command buffer ofc 2D collider shapes are back too… added explicit 2D shapes alongside the 3D ones: Rectangle Circle so the full set is now: Box Sphere Cylinder Rectangle Circle rectangle / circle are flat shapes. which is nicer for sprites and other 2d things movement actually respects colliders hex movement now checks whether an entity can actually occupy its next tile before moving there. added a CanOccupy() collision query which builds the entity’s collider at the target position, it blocks the move if something solid is in the way. triggers don’t block movement. collision robustness stuff also did a bunch of smaller fixes around the collision added a shared collision tolerance instead of random 1e-6 s in different places AABB overlap now uses that tolerance too improved collider validation depending on the actual shape fixed gizmo world-to-local conversion to use the proper inverse transform more finite-value / clipping checks in the collider gizmo GJK Indeterminate results preserve the previous collision state instead of automatically counting as a collision p.s, heres a lil photo of my attempt at making syntax highlighting for obsl using textmate grammar… :D"}, {"post_id": 66845, "ts": "2026-09-12T19:22:05Z", "hours": 3.0608, "text": "collision system round 2 i guess ended up pretty much reworking most of the collision system….. the first version was still basically 2D, with separate box vs box / circle vs circle / box vs circle functions. that worked as a starting point, but it was gonna get annoying … so… it is 3D now. colliders ColliderComponent now supports: boxes spheres cylinders 3D offsets / dimensions triggers entity-space or billboard orientation billboard colliders follow the same camera-facing basis as billboard rendering, which means billboard sprites can still have colliders that actually line up with how they appear on screen. GJK got rid of all the individual boxVBox , boxVCircle , etc. collision functions and replaced them with support-mapped collision detection using GJK. each collider shape just provides a support point now, the intersection test doesn’t care what combination of shapes it’s checking. i dont fully understand the math completely yet.. but it kinda makes sense :D still no collision response / physics yet. this is just detection + events, i think ill prolly get it into EngineLib.. soon… events the CollisionWorld still tracks collisions between frames and generates: Enter Stay Exit trigger state is kept with the collision too. this is for EngineLib integration. scripts should be able to react to collisions / triggers like unity I have not gotten around to this yet though… collider gizmos also had to redo the collider gizmos now that colliders aren’t just flat 2D shapes anymore… its a lil janky but it works.. billboard cleanup while doing the billboard collider stuff I also cleaned up billboard rendering a bit billboards used to have their world transform temporarily modified by SpriteBillboardSystem before rendering. now the billboard matrix is generated when the entity is submitted to the renderer instead, so the actual ECS transform can stay as the real entity transform there’s now one shared billboard matrix helper used by both rendering and collision, which is considerably less cursed. um scripting integration next i guess.. if something dosent explode ! :D"}, {"post_id": 66200, "ts": "2026-09-11T21:27:55Z", "hours": 3.4236, "text": "collision stuff been working on a collider system. still pretty early and not hooked into EngineLib yet, but most of the basic backend + editor stuff is there planning to expose it to scripts in a similar way to how Unity handles collision callbacks / triggers, but that’s for later……. collision added a new ColliderComponent with: box and circle colliders offsets size / radius trigger support collision system currently handles: box vs box circle vs circle box vs circle collision normals + penetration depth ‘trigger’ collisions also added a CollisionWorld that keeps track of collisions between frames and generates Enter , Stay , and Exit events. mostly groundwork for when I hook this into EngineLib… collider editing colliders are editable from the editor theres a collider inspector widget for changing the shape, offset, size/radius, and whether it’s a trigger, plus a viewport gizmo for directly moving and resizing them collider edits also go through the undo system, because every new editor feature needs to become an undo/redo problem eventually……… :D other editor fixes entity copy/paste now copies the whole child hierarchy instead of only the selected entity pasted hierarchies keep their parent relationships added copy/paste to the entity and UI context menus fixed stale entity / UI selections after the thing being selected gets deleted fixed single-key shortcuts like V , T , R , etc. firing while Ctrl/Alt/Shift was held keyboard camera movement no longer fights with Ctrl/Alt shortcuts a few smaller include / cleanup things mostly collision work though. next step is probably getting the collision events into EngineLib and experimentiung w. it its still a bit jank of course but it works i guess :DDDDD"}, {"post_id": 65603, "ts": "2026-09-10T20:50:19Z", "hours": 4.8511, "text": "copy paste (kinda) also too much time fighting windows builds tried to get entity copy/paste working and it’s… janky. also ended up wasting a stupid amount of time just getting windows builds to actually build again because i lowk forgot again about how it wont let me pass paths as strings implictly as it does on every other damn os… changes copy/paste (wip, kinda broken) started on ctrl+c/ctrl+v for entities & ui in the editor it kinda works but is really janky and does not feel good to use, also tried implementing it in the context menu but its not workiong at all -.- other the windows fixes…. some resharper reccomendation inspection type shi but lowk its been a while since i logged soo yep"}, {"post_id": 64268, "ts": "2026-09-08T15:23:01Z", "hours": 3.8883, "text": "sllight hub overhaul redid the project hub screen and added recent projects tracking, since up to now opening anything meant going through a file dialog every single time… changes recent projects get tracked in a PROJECTHIST file (next to the editor executable) …dead simple format, one filepath per line, each pointing at a project’s .json . capped at 5 entries, oldest just get removed off the list. hub screen is basically remade two docked panels now instead of one. left panel is the same buttons as before (new project, open project, etc), right panel is the new recent-projects list, up to 5 entries since that’s all the history file holds. also removed some unused dead code i found… QoL type stuff i guess :D"}, {"post_id": 63577, "ts": "2026-09-07T14:25:37Z", "hours": 3.9417, "text": "too many post proc fx? followup to the post processing / shader experiments… changes shader includes shaders can #include \"rand.glsl\" etc and it resolves properly. it checks the project VFS first, then falls back to the engine’s own shader helper directory if it isn’t found there. engine shader helpers also get packaged into exported games under engine/shaders/ , so includes keep working at runtime. added a few helper include files: rand.glsl / auto_rand.glsl - seeded hash-based random, with auto_rand reseeding per frame from u_Time color.glsl - HSV conversion, lift/gamma/gain, contrast, saturation, and three-way color wheels commons.glsl - engine-provided uniform declarations so you don’t have to redeclare u_Resolution , etc. in every shader for engine-provided uniforms the helpers use #ifndef / #define guards, so auto_rand.glsl can include rand.glsl without causing double declarations if the effect shader or another include declare the same uniforms or includes. more built-in effects added a few more built-in post processing effects: ColorGrading - exposure, contrast + pivot, saturation, lift/gamma/gain, and shadow/midtone/highlight color wheels using color.glsl FilmGrain - chunky per-cell grain with u_GrainSize controlling the cell size Vingette - yes i know its mispelled. uniforms with Wheel in the name now get the wheel-style color picker instead of the regular color picker, since a normal RGB slider cleaned up effect registration used to have two separate lists, one for raw shader registration and one for the default effect chain. this meant adding an effect involved touching two different structs in two different places. merged those into one PPRegistration list with an inDefaultChain flag shader debug name added an actual m_DebugName field and made error messages / the material inspector fall back to it when there isn’t a real file path. docs wrote up some post-processing editor docs ….. i hate writing docs.. also .shader is now a valid extension for importing custom effect shaders, alongside .frag / .glsl trimmed down the miniaudio CMake config by disabling its examples, tests, and tools, along with Vorbis/Opus/FLAC support since i’m not using any of that…."}, {"post_id": 62331, "ts": "2026-09-05T17:14:14Z", "hours": 3.0172, "text": "shader preprocessing been working on a small shader preprocessor thing while also finishing up the final bits of post-processing right now the preprocessor is pretty simple, mostly just adding support for: #include #pragma once I haven’t actually needed it yet, I just kinda had the urge to make it… so now I have a shader preprocessor …? its pretty extendable and all though so usefull to have ig :)"}, {"post_id": 61599, "ts": "2026-09-04T16:12:18Z", "hours": 6.9642, "text": "more post processing!!!! this took way longer than i thought it would but uh whateveer. i think i still gotta fix some small things but its working pretty alright :D editor ui added a proper ui for post processing :) threw in an import button and stuff so you can load in fragment shaders as post proc fx you can edit the uniforms directly in the ui now stuff glsl uniform parser: wrote a very simple basic glsl uniforms parser. this is what makes the ui editing possible, but it also helps a ton with serialization so i don’t have to hardcode everything serialization: implemented saving and loading for post processing effects and also made post processing effects bound per-scene instead of being a global engine thing yay post processing funny effects shaders aaaaaaaah"}, {"post_id": 58126, "ts": "2026-08-30T14:12:01Z", "hours": 6.2431, "text": "experimenting with post processing working on a lil post-processing pipeline still very wip but im mostly just playing around with various shaders and stuff changes the pipeline PostProcessor is a simple “ping-pong” chain: scene renders to an off-screen FrameBuffer , then each enabled effect runs full-screen-triangle shaders bouncing between two ping-pong buffers, in whatever order they were added I’m working on a system via variants to get uniforms to be easily serializable and such, it seems to be working but I havent actually wired it into anything just yet. editor and runtime a lil bigger change than expected. i implemented a unified fbo for both editor/runtime rather than the weird jank i was doing before editor: scene renders into m_SceneFrameBuffer , post effects run, then it gets sent into the ImGui viewport image like before runtime: same scene framebuffer, same post effects, then PresentToScreen goes to the default framebuffer instead just some general cleanup for that ig crt shader i wrote a lil silly CRT looking shader to test it out as shown below, it’s cool but kind of useless, but very fun to play with!!!"}, {"post_id": 55765, "ts": "2026-08-27T19:09:56Z", "hours": 4.9358, "text": "custom meshes im trynna make it so you can draw your own custom 2d meshes in the editor its still a lil buggy but it’s mostly working, serializes and all that :) very fun…"}, {"post_id": 55022, "ts": "2026-08-26T13:27:21Z", "hours": 2.1303, "text": "ui editing gizmos!!!1 you can finally drag UI elements around in the editor (instead of typing position/scale values into the inspector) changes ui gizmo added a proper UI gizmo with resize handles and dragging support and that corners resize both axes, edges resize one axis dragging the body moves the element resizing from the top/left keeps the opposite edge anchored added a small drag deadzone so clicking doesn’t accidentally create an undo step UI transforms now go through TransformUIElementCommand , so they’re undo/redo -able also renamed the existing entity gizmo code and naming gets confusing otherwise… coordinate stuff the gizmo needed mouse coordinates relative to the viewport rather than the whole window, so added some better viewport coordinate handling for that… maybe a lil late ui editing mode buttons won’t randomly enter their hover/pressed states just because your mouse is sitting over them now in the editor beccause its a lil annoying when editing small optimization also fixed UIText and UIButton recalculating their text layout every frame when nothing changes feels nice :)"}, {"post_id": 54551, "ts": "2026-08-25T16:02:00Z", "hours": 2.53, "text": "hardening + performance stuff so this is kinda the continuation of the last log(s) where i was going through some old code kinda boooring but its important performance mainly been trying to get rid of unnecessary allocations and full scans stuff optimized ECS entity/component lookups and removal reworked hierarchy propagation to avoid unnecessary registry scans reduced allocations in scripting and UI command buffers cached script wrappers so they can be reused instead of constantly recreated improved UI lookups with a proper name index made particle/lightmap updates only rebuild when actually needed cached project browser directory scans capped the editor console and added clipping for large logs also did a bunch of smaller optimizations around scripting task scheduling and resource loading things thread safety went through a lot of the cross-thread stuff as well made ResourceManager access properly synchronized experimenting with the audio locking guarded FreeType access made window size and pending scene state thread-safe fixed some render thread / GL context handling basically trying to make all the multithreading stuff a little less “it seems to work” type stuff though alot of this probably wasnt actually causing any issues YET , it would be very hard to debug in the future if I didn’t try to fix it now so yeahh correctness fixed several out-of-bounds issues in VFS/package parsing made VFS path resolution properly stay inside the VFS root (oops…) fixed hierarchy reparenting allowing cycles fixed a few dangling references in hierarchy code fixed some component pool and packaged asset lifetime issues undo history now clears when loading a scene cleaned up a few map editor edge cases fixed text centering fixed the triangle mesh made engine context non copyable also updated the demo template while I was at it (since a recent movementcomponent update it wasnt behaving properly due to the addition of a new field) there are other small things i probably didn’t mention here too but it’s mostly all a collection of a bunch of small things im still testing this though and looking into a few other small things….."}, {"post_id": 53560, "ts": "2026-08-24T04:55:16Z", "hours": 7.8433, "text": "code cleanup & optimization currently going through a bunch of older code and fixing / optimizing things. prolly way too much to actually write about, and most of it is just boring small changes, bug fixes, and a lil cleanup big pr i guess soon idk"}, {"post_id": 51782, "ts": "2026-08-21T16:57:55Z", "hours": 3.4422, "text": "mostly windows fixes changes SetLightmap took a raw Lightmap* and just held onto it for the frame swapped it for a small value type the renderer copies out immediately instead… this sometimes caused crashes but seemingly only on windows?.. just my luck.. LightingSystem had the same issue, was writing back into ECS memory through a raw pointer from a GL init task. now creates the framebuffer/vao up front and just calls Invalidate() on them SubmitPersistent was also holding a raw pointer into caller-owned memory, now copies into the staging buffer like everything else does RenderBatch used to just silently not draw anything if a batch went over MAX_INSTANCES . now it chunks into multiple draw calls instead of dropping the whole thing InvalidateGLCache wasn’t resetting the dynamic instance buffers, only the VAO cache, so they could point at dead GL objects after a context loss actual windows fixes opening files tries to open via already existing file associationg, otherwise falls back to the “open with” dialog if there’s no default handler also the paths get normalized to backslashes now asset import for scripts and so just does a file copy now instead of going through the old import path"}, {"post_id": 51240, "ts": "2026-08-20T19:35:22Z", "hours": 4.2758, "text": "persistent entities… again kinda scrapped most of the first attempt at persistent entities and decided to redo it instead of setting persistence in the editor, I went with something closer to Unity’s DontDestroyOnLoad , where scripts explicitly mark entities as persistent. makes more sense and is a lot less weird around scene changes. (i.e this.SetPersistent(true); ) changes scripting added: entity.SetPersistent(true) entity.IsPersistent() persistence persistent entities are tagged before the scene unloads, serialized normally, then re-injected and reparented when the new scene loads. the persistence tag itself isn’t serialized, so it won’t accidentally end up saved into the scene dedup added some basic deduplication so persistent entities don’t get duplicated if the new scene already contains an entity with the same name. its name based for now… not very great, but good enough"}, {"post_id": 50497, "ts": "2026-08-19T17:37:31Z", "hours": 6.7433, "text": "persistent Entities been working on persistent entities via a tag.. the same idea as Unity’s DontDestroyOnLoad, except you mark entities as persistent in the editor instead of doing it through scripts (scripts can do it too though). everything keeps breaking or half-working help."}, {"post_id": 49249, "ts": "2026-08-17T22:47:10Z", "hours": 2.5156, "text": "more docs… and some bug fixes some small bugs that have been annoying me for a while finally got fixed… and I wrote more docs than I probably needed to…? or maybe too litte.. who knows changes entity selection actually clears now fixed an issue where clicking empty space in the viewport wouldn’t reliably clear the current selection. the pick-result handling was structured wrong, so the “nothing was selected” case basically never got handled properly. also explicitly clear the entity ID framebuffer attachment every frame so it doesn’t leave stale IDs around from previous frames. i knew this was broken, and figured the fix would be pretty simple for a while.. but i just kinda forgot to fix it.. oops…. fixed parent transforms during scene loading fixed a bug with parented entities getting their transforms messed up when loading a scene. the issue was that scene loading was using the same Reparent() logic as interactive editor reparenting. that function intentionally recalculates the local transform to preserve world position, which is what you don’t want when loading a transform that’s already been serialized correctly… was eepy when writing that i guess added Registry::SetParentDirect() for scene loading, which just sets up the parent/child relationship without touching the transforms. interactive reparenting still uses the old behaviour, so dragging entities around in the hierarchy still preserves their world position misc cleaned out some old commented-out code docs, docs, docs also wrote proper editor documentation section covering things like: editor concepts usage scenes prefabs components and some even have screenshots.. yes i know.. fancy the help button in the editor links to some of these pages now. i guess “figure it out yourself” wasn’t really an acceptable documentation strategy anymore…. i mean i had some docs.. but they weren’t that good for editor-usage and more technical stuff.. so yep.. also made the README headers slightly more obvious because people were still asking where the download link was …."}, {"post_id": 48754, "ts": "2026-08-17T08:58:43Z", "hours": 2.7114, "text": "scrips can change things on the map yippie changes scripting scripts can now modify maps through EngineLib added: Map_SetHexWalkable Map_SetTileType yes, i made sure changes to walkability properly update the map’s pathfinding data instead of leaving it with stale information… sanitizers added sanitizer builds…. got ASan + UBSan working through CMake, along with presets for testing… it has helped already :) timers SetTimeout : if a script created a timer and then the scene changed before it fired, the callback could still run against the old scene state. timers now use generations, so changing/reloading a scene invalidates any timers belonging to the previous scene. editor fixed another map editor bug where discarding unsaved changes didn’t actually discard them… it would clear the dirty state but leave the edited map in memory… i knew about this bug and fix for a while, but i kept on forgetting about it… but its finally done -.- also added an Edit button to script entries in the project browser so scripts can be opened directly (launches default app it detects for the file via ur os)"}, {"post_id": 47739, "ts": "2026-08-15T21:10:44Z", "hours": 1.0883, "text": "mostly ui stuff (and fighting windows wide chars) yay pretty ui editor ui theming ui blah blah idk what to call it kinda cleaned up some stuff into proper members so the ui state doesn’t get all weird and persistent when you close the theme window discarding changes: actually works now. closing the window used to revert colors but keep your staged font changes, which was dumb (didnt really cause issues since changes werent applied anyways unless you saved beforehand but still.) font role indicators: added a little visual thingamabob where the font list now shows a star next to whatever font is actively set as the body font (also font name is now rendered in its proper font) path tooltips: added a hover tooltip on the font list items that shows the full file path of the font also some placeholder stuff in the code for searching the customization menu i might be implementing soon windows compat std::filesystem::path everything: went through and switched out the raw std::string usage for font paths inside FontConfig , replacing them with std::filesystem::path . this was purely because my windows ci build was failing. i was passing raw char strings around and doing weird string conversions, which completely blows up on windows because it expects wide chars for paths and i didnt consider that when i was being lazy and doing silly conversions and stuff because i just wanted to pass ez pz to a c library. freetype & serialization cleanup: updated all the internal freetype helper functions ( GetFontName , etc.) and the json theme serializer to play nice with the new paths instead of passing raw char pointers kinda mostly just making it a lil more prettier"}, {"post_id": 47431, "ts": "2026-08-15T11:16:32Z", "hours": 9.0703, "text": "fighting with fonts font-management rabbit hole in the theme editor… still wip changes font management in the theme editor the theme editor now has a proper Fonts section import .ttf / .otf fonts directly from the editor assign fonts to roles like Body, Bold, Monospace, Icons, etc. merge fonts together so icon fonts can be stacked on top of regular fonts rename, delete, and change the size of fonts fontsets are now saved as part of the theme, so imported fonts persist across restarts the role system isn’t fully wired up yet currently Body is used as the default editor font and Monospace is used for the console. im still working on the whole font management system here and its very unfinished and kinda untested.. very WIP!!! hot-reloading the annoying part was getting font changes to work while the renderer is running on another thread. rebuilding the ImGui font atlas in the middle of a frame was… not ideal, and eventually resulted in an assertion. now font changes mark the atlas as dirty, and the editor waits for the render thread to finish before rebuilding the atlas at a safe point. not the prettiest solution, but it seems to be working.. kind of dpi & freetype also experimented with DPI handling for fonts and wrapped FreeType into a single shared instance instead of creating separate instances everywhere. still figuring out exactly how I want the DPI/font sizing stuff to behave, but it’s getting there. bug fixes while doing all of this I also ended up fixing a few unrelated things: fixed an old GUI rendering bug where text could stop rendering or become garbled because of a pointer race thanks to @staneko for helping test/report that one since I couldn’t reproduce it properly on my system fixed a weird compilation issue related to namespace escaping bumped the vendored ImGui version for some dynamic font-related fixes a few other small UI changes and cleanup still working on this, and the font management side definitely isn’t finished yet… most of this time was just spent trying to get it to half-work so.. yep.."}, {"post_id": 46512, "ts": "2026-08-13T19:50:30Z", "hours": 3.6469, "text": "…the default imgui theme first off, huge thanks for all the incredibly kind reviews on my last ship !!! most of this work was also inspired by someone pointing out that i was still using the default imgui theme. fairs… so i spent some time making the editor actually customizable and messing around with having some kinda-nice defaults :) editor ui & theming live theme editor: built a proper window to tweak colors, spacing, padding, rounding, etc. in real-time. semantic palettes: added a semantic color system so you can build out a theme from a small set of base colors, rather than manually adjusting every single internal imgui color enum (though you can still override individual colors if you need to). serialization: themes dump straight out to a theme.json sitting right next to the editor executable. undo/redo: the theme adjustments go through the undo/redo system! help menu: put in a placeholder help menu. turns out literally nobody likes reading docs, so i guess i gotta start explaining how to use the engine from inside the engine… not implemented yet though editor groundwork did a bit of backend cleanup as well. added an EditorContext for editor-specific state, separate from the runtime EngineContext (currently just used for theme stuff) started working on editor font support with a FontSet for things like Body, Bold, Monospace, and Icons, not implemented though the font stuff is mostly groundwork for now, but the theming system is actually working and makes the editor feel nice :D"}, {"post_id": 46257, "ts": "2026-08-13T11:34:55Z", "hours": 2.8147, "text": "scripts can schedule stuff for later Added SetTimeout to the scripting API changes SetTimeout SetTimeout(fn, ms) calls fn() after ms milliseconds. simple to call from obsl timers live in a plain std::vector<Timer> in a new Platform::Time namespace, polled once a frame from Scene::Update no threads, no async bs or whatever :) the callback itself is a SmallTask , which falls back to a heap allocation if the closure is too big to fit inline fine for this since timeouts aren’t really a hot path timeout callback fires from an arbitrary point in Update , so it gets its own ScriptCommandBuffer set up on the worker just for the duration of the call, then flushed right after also gc.add_root / remove_root the function around the callback so it doesn’t get collected while it’s sitting in the timer list waiting to fire Documented it in the api reference alongside the other Time functions also tiny UI tweak in the tile editor: it now warns “no tile types defined, no map will be visible!” instead of just “no tile types defined” was seeing people get confused about why a new map looked empty after trying to paint also small updates to docs in general and stuff but nothing super interesting"}, {"post_id": 40738, "ts": "2026-08-04T13:46:27Z", "hours": 0.7667, "text": "Lighting Fixes been fixing a few small things with the lighting system mainly fixed lights using the wrong entity transform I forgot to account for entity parenting when I implemented that… also added a per-scene toggle for enabling/disabling the lighting system"}, {"post_id": 40621, "ts": "2026-08-04T08:56:51Z", "hours": 3.7144, "text": "the repo is public been working on gettin things ready for that, mostly writing some docs and getting GitHub Actions set up so I can build and release cross-platform builds also did some small code cleanup / fixes while I was going through everything. changes github actions i setup a workflow to compile the project on linux, windows, and mac, and then publish a release (mac is untested but compiles). im real happy though that its actually compiling on all “major” platforms though docs finally wrote some actual documentation… there are a few files in the docs/ folder now and a proper README still a WIP obviously, but at least there’s something there… misc implemented create new map button i forgot about completely repo there is already a build published as a test of the github actions thingy, try it out if you want :D https://github.com/torkelicious/obliberry"}, {"post_id": 39155, "ts": "2026-08-01T21:44:42Z", "hours": 3.0289, "text": "Bugs bugs bugs… I’ve been working on a demo project to both test the engine properly (looking for bugs and all), and also have something to actually show off made in my engine… this is the project you’ve been seeing in the last couple logs btw :) of course… since I’ve been using the editor for actual “work”, I have found a bunch of bugs. the biggest one being the entity ID situation… or.. disaster? changes the entity ID mess in the past, out of laziness… entity ID 0 was being used as both a real, valid entity handle and the “no entity / invalid” value depending on where you looked. which worked fine… mostly because of pure luck. the annoying part was that after working on this for a while I wasn’t even sure anymore if I was using 0 , -1 , or something else for invalid entities.. yep.. so I finally cleaned it up there is now a proper INVALID_ENTITY_ID constant, and entity index 0 is reserved for invalid entities. real entities now start from 1 . went through and replaced a bunch of random == 0 / != 0 checks across ECS, serialization, prefab handling, editor panels, and scripting bindings. project templates added support for multiple project templates. new project creation now scans the Templates/ folder instead of everything being hardcoded to “Default”. currently has: DemoProject Empty the demo project is mostly there to show off the newer UI/scripting stuff (the same demo as mentioned before), while Empty is just a completely blank scene. hierarchy & transforms fixed entity and UI reparenting. previously moving something to a new parent could randomly change its position because it was just applying the new local transform now reparenting keeps the world transform, so dragging things around in the hierarchy behaves properly UI & text rendering fixed a bunch of UI text issues. text now centers vertically using actual glyph metrics instead of a random offset I was “pretty sure” was correct it was not, in fact, correct button text now scales to fit inside the button fonts can now load directly from VFS memory instead of requiring a real filesystem path the VFS font loading one was something I completely forgot about when testing outside packaged projects… oops. packaging implemented .pakignore instead of a hardcoded ignore list, the packer now supports gitignore-style patterns in a .pakignore file and properly skips ignored folders/files also fixed a few smaller packaging issues while testing exported projects. misc a bunch of smaller things: map save/load dialogs now default to the project maps folder fixed scene switching bindings in editor play mode fixed a lightmap redraw bug font importer now only accepts .ttf / .otf added a small README with build instructions since im planning on publishing the repo soon (and writing all the docs… scary..) nothing super flashy this time.. but important"}, {"post_id": 38183, "ts": "2026-07-31T13:32:00Z", "hours": 0.8028, "text": "Windows Build The Windows build seems to be working.. I don’t have proper OpenGL passthrough in my VM… However, the Windows executable compiles perfectly in the VM and is running fine under Wine. so I consider that a win for now…"}, {"post_id": 37625, "ts": "2026-07-30T14:23:01Z", "hours": 1.56, "text": "working in a windows vm trying to get it to compile on windows… it is obviously going great… -.-"}, {"post_id": 36411, "ts": "2026-07-28T14:49:53Z", "hours": 3.1286, "text": "Entity Hierarchy & Scripting Integration finally caved & added actual parent/child relationships to entities changes entity hierarchy entities can now have a parent & children via a new RelationshipComponent . Registry::Reparent() handles moving an entity under a new parent, with cycle & self-parenting protection so you cant do anything silly like parenting an entity to its own descendant. TransformComponent now has a worldTransform alongside the existing local one, a new HierarchySystem systems that care about actual position (i.e AISystem ) read worldTransform now instead of assuming local == world. destroying an entity recursively destroys its children too & unlinks it from its parent’s child list scene serialization now saves & restores the hierarchy editor the Registry panel is a proper collapsible tree now instead of a flat list drag & drop reparenting, plus a right click menu for “Create Child”, “Detach”, & “Set Parent”. scripting pulled all the entity/component script bindings out into their own EngineLibRegistry.cpp module, they were kind of scattered around before & this makes them way easier to find & extend. scripts can now walk the hierarchy too (get children, etc), same module. added SetFont / GetFont bindings so scripts can assign or query a button’s font, small thing but script generated buttons wont have visible text without it :) misc cleanup small modernization stuff while i was in these files anyway: dropped redundant ternary parens, swapped a bunch of auto x = ...; if (x) into if-with-initializer, dropped some unnecessary global qualifiers, const-correctness fixes on UISystem::Update & UIRenderer::Flush . (yes i know the gizmos are offset and buggy, i kind of forgot to update the gizmo code after changing transforms :p )"}, {"post_id": 35110, "ts": "2026-07-26T10:28:41Z", "hours": 8.4342, "text": "Scripted UI, Map Workflow, & a Bunch of Bug Fixes alot of bug hunting… changes scripting & ui scripts can now actually interact with the UI system. added bindings for things like: creating UI buttons, text, rects, and images finding UI elements destroying UI elements these return wrapped objects with basic getters/setters for position, visibility, and button state map workflow spent a fair bit of time cleaning up the map editor flow. maps no longer get a fake default path on creation switching to the Map Editor tab now auto-creates a map (empty) if there isn’t one yet mapFilePath now stays project dir relative instead of randomly becoming absolute tile materials are now shared properly instead of silently duplicating state rendering & lifetime bugs i’ve been doing alot of testing recently, so i found alot of bugs… this was probably the biggest pain point. renderer submissions now keep materials and meshes alive for the frame instead of trusting the caller replaced the old Shader::Default() singleton hack with a real fallback shader (internalshaders base) fixed the lightmap quad so it keeps its own VAO and clears correctly when there are no lights fixed a Texture move bug that was double-deleting GL handles sometimes editor polish also cleaned up a bunch of editor behavior while I was in there. Ctrl+S now behaves correctly depending on whether editing a scene or a map scene loading now rebinds editor panels properly save/load dialogs now append file extensions automatically added more inline warnings in the inspector and panels (i.e if an entity has no material it will tell you it wont render) and ive probably forgotten something else … in summary ive just been testing out some UI/UX changed and hunting down bugs untill I feel it is ready to maybe start prearing some sort of demo :)"}, {"post_id": 33128, "ts": "2026-07-22T19:10:20Z", "hours": 2.6717, "text": "more ui ive been kinda sick so i aint really had the motivation to do a lot but ive been working more on the UI system im kinda tired so i dont really feel like writing more for now -.-"}, {"post_id": 31900, "ts": "2026-07-20T17:42:45Z", "hours": 4.6017, "text": "game UI Progress been continuing work on the UI system. changes UI made some good progress UI system currently have: font importing working texture support for UI elements basic text rendering a simple editor view panel for UI it’s still very much WIP editor right now it’s pretty basic, but it’s enough to start experimenting with how creating and editing UI might actually work inside the editor there’s still a lot left to do before I’d call it usable, but im making progress.. getting text working is painfull, and still unfinished.. but im workin on it…"}, {"post_id": 30701, "ts": "2026-07-18T14:27:23Z", "hours": 3.7628, "text": "UI Experiments since working on the particle system, I feel like it’s in a pretty good place for the current scope. I don’t really know what else I want to add to it right now, so I decided to finally start on something that’s been sitting in the back of my mind for a long time… a proper UI system. changes particles mostly just spent some time testing and polishing the particle system to make sure everything behaves properly I’m pretty happy with where it’s at for now UI started prototyping a custom UI system it’s very early, but I’ve got the basic rendering pipeline up and running currently working on: a UIElement system a dedicated UI renderer text rendering font loading using FreeType right now it’s mostly just enough to prove everything works, but it’s the foundation for the runtime UI system ive wanted for a long time the goal is for games made in the editor to be able to have their own UI, with everything exposed through EngineLib so scripts can create and interact with UI elements as well honestly, for now.. I was expecting it to go alot worse.. FreeType isn’t as bad as it seems once you get it working with GL The screenshot below dosent show much, but you can see the rendering of Text and rects, it also supports textured rects (which is what the text is currently using to render from a texture atlas)"}, {"post_id": 30249, "ts": "2026-07-17T17:50:34Z", "hours": 2.8864, "text": "More Particle work… been spending some time on the particle system… changes particles expanded the particle system quite a bit. currently supports: randomized size ranges randomized rotation configurable emitter shapes (support quad, circle, and soft circle) alpha and additive blending configurable render order (still kinda broken but im working on it) per-particle color over lifetime particle presets that can be saved and loaded (as JSON) also added an editor preview mode, so particles can be previewed while editing instead of only showing up in play mode renderer had to do a bit of renderer work to support all of this particles now use their own dedicated shader added support for per-instance colors during instanced rendering added an overlay render pass for effects that should render on top of the scene cleanup also did a some more project cleanup, splitting up my Utils header into multiple files.. nothing special though misc particle emitters can now be saved as reusable presets (some which will be shipped as defaults ofc) as suggested by @sol4r_on_hackclub cleaned up a few asset importing edge cases fixed a couple of packaging issues too I’m pretty happy with how the particle system is coming along :D"}, {"post_id": 29706, "ts": "2026-07-16T19:55:20Z", "hours": 0.9678, "text": "mostly just spent some time going through some old code.. nothing really important, but i’ve also replaced the placeholder assets.. with my own placeholder assets that i drew in GIMP, considering i probably do not have the rights at all to distribute the previous assets.. :)"}, {"post_id": 29523, "ts": "2026-07-16T14:38:59Z", "hours": 2.2728, "text": "Particles! :) Ive started working on a particle system. i have got the core pieces in place and it seems to be working nicely so far…. changes particles implemented the foundations of the particle system currently has: ParticleEmitterComponent ParticleSystem ParticlePool emitters currently support: configurable particle limits and emission rates randomized lifetimes and velocities “gravity” size over lifetime color over lifetime world space simulation materials obviously so far it’s all behaving pretty well… EngineLib next up is getting particles exposed through the EngineLib API so scripts can spawn and control emitter components we will see how it goes…"}, {"post_id": 29203, "ts": "2026-07-15T22:53:22Z", "hours": 6.2536, "text": "Editor QoL, Graphics Configs & Prefabs new devlog… mostly been focusing on editor ui and qol changes this time around. kinda tired of hardcoded settings for the graphics settings, so i finally built a proper interface for it, plus some prefab management stuff in the editor changes graphics settings i built a dedicated graphics configurator window in the window, for the current project ( GraphicsConfigEditor ). it hooks directly into the UndoManager using the command pattern ( GraphicsConfigUpdateCommand ) serializes everything out to graphics.json . added QuerySupportedSampleCounts which asks the active GL context ( before it gets handed to the render thread ) what MSAA sample counts it supports. the editor now dynamically generates the dropdown and snaps to a valid sample count (i.e 1, 2, 4, 8, 16). prefab management the editor now supports prefab management that i implemented earlier .. instead of directly writing it in the scene json file you can spawn entities directly into the scene from prefab json files you can revert a prefab, which wipes any local overrides and resets the entity back to whatever is saved in the file you can break a prefab, severing the link to the json file and turning it into a normal, standalone entity in the registry ui & editor cleanup spent some time making the editor less annoying.. in general the editor layout stops resetting itself , it now checks if imgui.ini exists on startup, and if it does, it skips rebuilding the default dockspace ripped the hardcoded hub drawing code out of the EditorLayer and made it its own state for the editor state machine refactored the config windows ( ProjectConfigEditor , SceneConfigEditor , and the new GraphicsConfigEditor ) to inherit from a base ConfigEditor class so its cleaner and easier to maintain.. fixed the script widget since the ui was kinda messy"}, {"post_id": 28584, "ts": "2026-07-14T22:27:14Z", "hours": 2.6136, "text": "the OpenGL State Machine Strikes Back… I spent the entire day trapped in hell: debugging a corrupted OpenGL state… it may not show up as tracked hours.. since most of it was just staring at various forms of text.. but it was painful. problem so since i turned the lightmap to run on gpu .. well… Whenever I transitioned from the editor ( MapEditState ) into Play mode, the map would turn into like a bunch of weird diamonds, and the corruption would persist indefinitely until I remounted the current project. because it only happened on state transition, i spent hours chasing ghosts in my state management code and scene cleanup routines… (in the end though i did make some changes to the cleanup routines, but between states rather than scenes.. so i guess i was halfway there?) the culprit It was the lighting pass… took me forever to figure it out, but i had the genius and definitely NOT a very late and obvious idea i shouldve had hours ago , to see if the issue happened when i turned off the lighting system. so i put some early returns in my lighting system functions and.. it didnt corrupt.. inside LightingSystem::Update() , the renderer was modifying global OpenGL state changing depth functions, blending modes, and texture bindings, but not restoring them to their original defaults properly When the engine swapped states, the next frame inherited this dirty, half configured state, causing the whole thing to become a mess. the fix I went through the lighting system and made sure the state changes are wrapped and properly restored through the render thread.. LightingSystem.h : Full GL state save/restore around the light pass. now explicitly backing up and restoring the FBO, program, VAO, blend state, draw buffers, clear color, viewport, and active texture. MapEditState.cpp : OnExit() now properly nulls out m_MapComp and m_CurrentGrid . OnEnter() and will refetch them from the current registry so it isnt holding onto outdated references. EditorLayer.cpp : Added a call to renderer->Clean() after state transfers to clear out stale VAO and mesh caches.(bc its multithreaded things go kinda weird but.. it works now) glad thats over with :D Also heres a fun peek of what ObSL can do with EngineLib, yes, it can make your entire map look like hell..! i am totally not going insane"}, {"post_id": 27998, "ts": "2026-07-13T23:29:33Z", "hours": 5.0142, "text": "GPU Lighting & Graphics Settings been doing a bit of rendering work again… mostly trying to optimize things. the biggest change is that I completely rewrote the lighting system previously all the point light calculations were happening on the CPU, and after doing some profiling (and spending way too long staring at compiler generated assembly annotations) it became pretty obvious that this was one of the bigger performance bottlenecks (well THE biggest excluding driver overhead) lighting now runs entirely on the GPU through shaders instead changes lighting rewrote the lighting system. lighting is now shader-based and runs on the GPU removed the old CPU-side lighting calculations moved engine shaders (like the base shader and lighting shader) into built-in InternalShaders (hardcoded string literals, it might seem messy but i prefer it like that) the internal shader change mostly exists because they’re pretty fundamental to the renderer. if they were treated like normal project assets and someone accidentally deleted them… well… suddenly nothing renders (unless they had setup their own shaders, which is fully supported!) and lighting completely falls over, also i prefer it to loading them from the filesystem anyways overall I’m pretty happy with how the new lighting system turned out graphics settings also started working on configurable graphics settings instead of baking them into the project, the engine now loads graphics settings from a separate JSON file. this doesn’t get packed into the .obpak , so users can tweak their graphics settings after exporting a game currently supports: resolution fullscreen MSAA (toggle + sample count) target FPS VSync it’s weirdly fun actually being back in OpenGL code again instead of just working with engine abstractions sometimes it’s nice to get back into the weeds.. even if its.. painfull :D"}, {"post_id": 27425, "ts": "2026-07-12T23:53:21Z", "hours": 7.5097, "text": "Performance & Zero Copy Assets been spending some time under the hood… this one’s almost entirely backend. no new features, mostly went through the render thread, asset pipeline, & a handful of ECS loops to squeeze out more performance. it was incredibly rage inducing at times.. but seeing the profiler diff against baseline.. i am satisfied.. almost at peace.. but was considering becoming a farmer & never touching a computer again.. mostly because i thought i’d messed up more than i did.. but.. im happy now. changes threading & ecs i’ve reinvented the wheel enough already… but had to redo how tasks are dispatched. ThreadPool used to take a std::function , which heap allocates if you capture more than a couple pointers. scripts dispatch through this every frame, so it added up. swapped it for a custom Task type a 56-byte inline buffer, no heap allocs swapped the pending-task counter to a lock free atomic decrement instead of a mutex on every completion… rendering been cleaning up how the main thread interacts with the render thread. the main & render threads used to awkwardly poll eachothers framebuffers. now theres a m_ReadyFrames deque main pushes a frame index, render pops it. much cleaner :) ImGui draw data is now reused in-place instead of allocating & freeing a fresh clone every frame (ive put off fixing that hack for a while so its nice to finally come around to it). instanced draws no longer store a vector<mat4> per draw call, transforms get appended into one giant staging buffer per frame now. added SubmitPersistent for things that already own a long-lived buffer (like the map tile renderer) to skip the copy entirely. swapped a bunch of unordered_map s for flat vectors in the texture/VAO/uniform caches for a handful of items, linear scan beats hashing. batched rendering also caches the last bound texture & color uniform so b2b batches sharing a texture dont rebind needlessly. added a zero-size window safeguard for Wayland so it stops wrecking the renderer when the window briefly reports 0x0 during resize (also turned vsync back on, weird syscall spam otherwise) assets & packaging added VFS::ReadVirtualView to hand out string_view s directly into memory instead of owned strings for packaged builds, ContainerReader now mmap s the .obpak file directly, uncompressed stuff (textures, uncompiled maps) gets handed right to the parser without a copy. also now move only, with a destructor that unmaps memory instead of holding a copied vector of chars scripting the script hot-reloader was doing a stat() syscall on every script file every frame . oops. now polls every 300 frames & caches resolved paths.. thought i already debounced this.. guess not.. the on_update & on_destroy work buckets used to be freshly allocated vectors every frame… now static , so they just clear & reuse capacity editor & ui finally ripped out the old in game debug UI ( GameUI.cpp ), it had fallen out of sync with the ECS anyway (used it for debug visuals while implementing the first version of the ecs.. then forgot about it) the editors inspector does all of this better now, so replaced it with a minimal FPS counter audio & map audio engine now sets an explicit period size (2048 frames) via miniaudio to cut IPC roundtrips to the audio daemon.. (this one was annoying to figure out.. god bless strace & gdb) the map’s visible transforms buffer is now double buffered, rebuilds write to the back buffer while the render thread reads the front, no race conditions. also swapped typeMats from an unordered_map to a flat vector nothing user facing changed this time, but frame pacing feels noticeably smoother (somewhat suprised), & the packaged build starts noticeably faster i know it could probably be a lot better, but im still a bit of a noob at C++, so this is one hell of a learning project"}, {"post_id": 26719, "ts": "2026-07-11T17:53:32Z", "hours": 3.9353, "text": "Undo/Redo …again! been working on the editor again the undo/redo system now covers a lot more than just gizmo transforms. but there’s still a few things left (entity creation/deletion mainly). changes undo/redo expanded the command system to cover most editor actions. currently supports: entity transforms adding/removing components adding/removing scripts editing project settings editing scene properties also fixed the undo/redo shortcuts so they only trigger once per key press instead of repeatedly firing while the keys are held… which is probably how they should’ve worked from the start map editor continued working on map editing. painting and erasing now properly integrate with the command system. also, an entire brush stroke is treated as a single undo step instead of undoing one tile at a time. also cleaned up a couple of edge cases while doing this, like preserving existing tile data and avoiding unnecessary commands when nothing actually changed. misc did a bit of cleanup around the editor while wiring everything together. centralized a few bits of duplicated UI logic cleaned up window title updates continued refactoring the command system the undo system is still unfinished, but it covers most of the important stuff and feels nice.. also.. still gotta fix some ui window-size stuff soon too but .. thats for later"}, {"post_id": 26228, "ts": "2026-07-10T21:54:28Z", "hours": 3.1872, "text": "Undo/Redo! :) been working on some editor QoL stuff again… the biggest addition this time is a proper undo/redo system. it’s still very early and pretty barebones, but having the foundations in place is nice changes editor commands implemented the beginnings of a proper command system for the editor instead of modifying things directly, editor actions now go through commands, which means they can be undone and redone currently supports: entity transforms movement rotation scaling adding components removing components (with the exception of ScriptComponent for now.. that’ll get its own custom command due to the way it works) also keeps a command history, and the usual shortcuts are hooked up now: Ctrl + Z : Undo Ctrl + Y : Redo its still pretty basic, but it works and feels nice to use. input for this, I added proper key-combination support to the input manager. things like: Ctrl + S Ctrl + Z Ctrl + Y can now be handled properly instead of manually checking modifier keys everywhere logging did a bit more cleanup to the logging system as well. the logger now goes through a proper interface instead of everything depending directly on one concrete implementation, which should make it a bit easier to swap things around later if I ever want to. mostly backend work again… but undo/redo is fire"}, {"post_id": 26050, "ts": "2026-07-10T17:12:54Z", "hours": 2.2128, "text": "editor polish still nothing super flashy.., mostly a bunch of small things changes window titles the editor now updates its window title based on what youre working on. it’ll now include things like the current project and scene, or map project loading cleaned up project loading a bit. the editor now properly syncs the loaded project configuration into the engine context instead of relying on stale data also added menu in the map editor that lets you save and load map files (create new is just placeholder for now) UI added a small helper for rendering framebuffer textures in ImGui without needing to remember to flip the UVs every time. and made the tile Editor use it also forgot to mention in the last log that i cleaned up the “project browser” ui a bit logging fixed up some more logging :)"}, {"post_id": 25892, "ts": "2026-07-10T11:51:37Z", "hours": 3.0564, "text": "Logging Cleanup replaced all the random std::cout / std::cerr calls scattered throughout the project with an actual logging system logging implemented a proper logging system. replaced std::cout / std::cerr throughout the engine added support for different log levels optional logging to a log file centralized all engine logging into one place thread safe !!!! nothing particularly flashy or fancy, but its cleaner, easier to work with, and generally just nice i probably should’ve done this a long time ago :)"}, {"post_id": 25509, "ts": "2026-07-09T20:30:56Z", "hours": 4.8756, "text": "Map Editing, Brushes, and a 4(?) hour ImGui Bug The map editor is finally coming together It’s still a bit… rough but it does feel nice to be able to paint a map in the editor I did, however, spend an embarrassing amount of time trying to figure out why my click and drag “painting” wasn’t working… well.. ImGui was eating my inputs because it thought I was trying to drag the Scene View window around.. yeah.. changes map editor actually got the map editing tools working for real this time. the paint and erase tools actually place and remove tiles now instead of just being placeholder buttons added a brush radius slider, so you can paint in bigger hex rings added a preview outline that renders around your cursor so you can see before clicking toggling “is walkable” on a tile now properly syncs with the grid pathfinding editor ui spent some time making the tile palette and material editing.. work.. video explains better ngl im not good at describing ui stuff math laid some groundwork in the hex math system ( Lerp , CubeRound , and GetHexLine ) this is mostly for some future evil plans… still a WIP…"}, {"post_id": 25003, "ts": "2026-07-08T22:10:08Z", "hours": 0.7108, "text": "map editor preveiw ig kinda didnt have much time to do anything today but im working on the tile editor"}, {"post_id": 24426, "ts": "2026-07-07T23:37:55Z", "hours": 8.7589, "text": "editor rework & map editing groundwork been working on the editor again this update was mostly about cleaning up the editor architecture so I can actually keep adding features without everything turning into spaghetti. I also finally started laying the groundwork for proper map editing. changes editor reworked the editor state system. instead of instantly swapping between states, transitions are now deferred until a safe point during the update loop. this makes switching between Edit, Play, Map Edit, and the Hub a lot cleaner, and the editor now remembers which editing mode you were in before hitting Play. (i’ll admit… i was getting a bunch of weird, seemingly unexplainable crashes before eventually realizing my mistake was instantly switching states while things were still being updated/rendered…) also moved more UI responsibility into the individual states instead of having EditorLayer decide how everything should be drawn. map editor started putting together the map editor. currently i have: map hover and tile selection working placeholder Paint / Erase / Select tools the beginnings of a tile palette system a placeholder tile editor panel the actual editing logic isn’t implemented yet, but the foundations are there now :) asset picker ripped out the old “open a native file dialog for every asset field” flow. instead, the editor now lets you pick existing textures, meshes, materials and shaders directly from the ResourceManager , which is a lot nicer to work with and also avoids accidentally importing duplicate assets. (the old workflow would happily create a brand new object every time you imported something… which was fine for testing, but definitely wasn’t something i wanted to keep) rendering fixed a few editor rendering issues while i was at it. materials with invalid shaders now fall back to the default shader instead of silently disappearing fixed some edge cases with framebuffer entity picking currently unused, but functional shader hot reloading tests misc smoothed out editor camera movement and zoom added a few helper utilities for the map editor reorganized the editor UI code a bit doesn’t look massively different in screenshots, but makes future work alot easier/cleaner map painting is next ?.."}, {"post_id": 23641, "ts": "2026-07-06T18:38:19Z", "hours": 2.4394, "text": "Project Exporting been working on making projects exportable from the editor it’s now able to export a project to the selected folder, package all the assets into an .obpak , and then copy over the runtime so the exported project is runnable changes project exporting added export to the editor choose an output folder for the exported project packages the project into an .obpak copies the runtime into the export folder renames the runtime to match the project name (just 2 files for full project!, executable and .obpak) the whole process is pretty much one click now instead of manually packaging everything together. file dialogs refactored my entire filedialog implementation cuz it was kinda broken packaging did some more work on the packaging pipeline while implementing exporting and put it in the editor ui im pretty happy that its all working and i can actually export stuff, and run it feels cool :)"}, {"post_id": 23429, "ts": "2026-07-06T12:05:06Z", "hours": 4.1694, "text": "Project Packaging is Working been spending a lot of time working on project packaging, and it’s finally working now. the engine can now load projects directly from .obpak files, and I’ve got basic tooling to create them as well. the plan is to integrate the tooling i have now with the editor to “build” an obpak archive (i think its called an archive?) changes packaging implemented the full packaging/loading pipeline yippie :D currently the packer: pre-generates ASTs for ObSL scripts converts project, scene(s) and prefab(s) JSON into MessagePack bundles everything into a single .obpak container compresses the package with LZ4 assets like textures, audio and shaders just get copied into the package without any conversion runtime the engine can now load packaged projects directly instead of relying on loose project files. all of this goes through the VFS, so from the engine’s point of view it doesn’t really matter whether assets are coming from a folder or from an .obpak (i.e it can still load loose project files of course) tooling added command-line tools for packing and unpacking projects, i originally made it for testing but it’s actually pretty nice to work with so im probably keeping it. still probably things to polish, but it’s pretty satisfying seeing the engine load an entire packaged project properly pls ignore the lag in the video, i promise its not as terrible as it looks, its just that recording is pretty buggy for me"}, {"post_id": 23095, "ts": "2026-07-05T20:42:38Z", "hours": 3.8311, "text": "Project Packaging been working on a packaging format for projects. the goal is basically to package an entire project into a single container while preprocessing assets that make sense to preprocess. Also makes shipping a game made in the engine in the future alot easier / cleaner, and portable. changes packaging implemented the start of a proper project packaging system. currently it: parses ObSL scripts ahead of time and stores serialized ASTs instead of source code (basically very similar to some sort of a very very simple AOT compiler) converts project, scene and prefab JSON files into MessagePack stores media and other binary assets directly in the package optionally compresses package entries with LZ4 the idea is that the engine has less work to do at runtime since scripts don’t need parsing and JSON doesn’t need parsing either. and a single “package” file is alot cleaner in general for a finished game “build” package format also implemented the actual container format itself. different asset types are stored as different entry types (scripts, binary JSON, media, shaders, etc.), so the loader knows exactly how each asset should be handled. tools added standalone packaging tools as well for packing and unpacking projects, mostly for testing. still a work in progress, but the whole packaging pipeline is starting to come together."}, {"post_id": 22372, "ts": "2026-07-04T20:12:27Z", "hours": 5.1664, "text": "editor Gizmos! :DD this took a lot longer than I’d like to admit… but it’s finally working. changes gizmos got all gizmos working.. but had issues with rotation and scale at first figured out the issues with rotation/scaling ended up patching ImGuizmo at first to get things working, but after digging through the code I eventually figured out how to do it properly with the normal library translation, rotation, and scale gizmos all work now :)))))) honestly I learnt quite a bit just from messing around with the ImGuizmo internals.. but it was painful editor added a few more UI improvements as well. i.e billboard sprites now explicitly mention that rotation doesn’t do anything, instead of letting you wonder why nothing happens gizmos are one of those things I’ve been waiting on implementing.. but im finally happy to have them"}, {"post_id": 21565, "ts": "2026-07-03T16:19:30Z", "hours": 2.6169, "text": "actually working on the editor I’m finally getting around to actually implementing the editor ..it still looks pretty similar (well mostly the same) but most of the UI before was just placeholder. changes editor implemented a Project Settings window implemented a Scene Properties window made the component widgets actually do something now load textures assign scripts change material colors change meshes change shaders etc…. added an Add Component button added Remove buttons to components it works.. so thats good :D"}, {"post_id": 21208, "ts": "2026-07-03T00:51:55Z", "hours": 0.6447, "text": "ObSL Scripting Library Moved the scripting language into its own repository :) It’s now included in the engine as a library using git submodules and public headers instead of living directly in the engine source code Makes the project structure a lot cleaner .. for both projects ( ObSL can now be found at https://github.com/torkelicious/ObSL )"}, {"post_id": 21066, "ts": "2026-07-02T20:52:49Z", "hours": 5.9469, "text": "Script multithreading (and concurrency) scripts now run on other thread(s) :D this took a fair bit of cleanup, but it’s working. changes script workers moved script execution onto worker thread(s) worked on script worker concurrency dynamically clamp the number of active workers based on how many callbacks are actually running, so idle threads aren’t just spinning doing nothing garbage collection did some work on the GC as well. introduced external root tracking fixed a few issues around GC roots while getting multithreaded script execution working cleanup spent some time cleaning up a bunch of backend stuff while getting all of this working. build system updated CMake so all executables, scripts, and (project) templates are output to a single build/bin directory instead of being messy. multithreading yay :)"}, {"post_id": 20164, "ts": "2026-07-01T18:24:52Z", "hours": 3.945, "text": "ive been mostly messing around with getting the ObSL language to be thread-safe and refactoring some things, so I don’t have much to show but my end goal is to be able to get scripts to run concurrently and outside of the main thread"}, {"post_id": 19379, "ts": "2026-06-30T17:52:06Z", "hours": 4.6878, "text": "Editor & Scene Management been working on the editor mostly. changes ECS implemented generational ID masks for the ECS. this should prevents issues with stale entity references since IDs can now properly track generations instead of just relying on raw IDs. (i encountered this issue when testing multiple scenes in one project) scene manager fully implemented the SceneManager so it can actually be used by the editor & game layer. this allows the editor to properly load/save/validate/find and generally handle scenes through a unified API (goes for gamelayer aswell but it only really loads them) bug fixing spent a lot of time fixing various issues around: project folder management scene management loading / saving behaviour asset loading (cache was causing some problems on loading scenes but its all fixed now :D) mostly backend work but things are becoming a lot more stable and the editor foundation is starting to come together…."}, {"post_id": 18509, "ts": "2026-06-29T17:58:54Z", "hours": 7.6317, "text": "Namespace Refactor & Project Management Work Dependencies finally caused me to run into a namespace conflict after being lazy and unorganized… instead of being sane and just renaming one class.. I decided to refactor the entire project to use proper namespaces everywhere.. changes namespaces Refactored the entire codebase into proper namespaces project management / editor backend I don’t really have much visually to show this update since I’ve mostly been working on backend stuff. Working on: project management scene management VFS improvements editor saving/loading I’m using nativefiledialog-extended to work on proper file dialogs for saving and loading from the editor. Also been doing a lot of testing around project creation and loading. alot of this is in the hope i can get this working multi-platform and not just on linux (though i have yet to try and compile on another os) Things are working… for now… so progress :D"}, {"post_id": 17698, "ts": "2026-06-28T16:44:24Z", "hours": 1.5475, "text": "Editor Picking & Project Management because my EditorLayer uses a framebuffer, I can now utilize framebuffer color picking in the editor i updated the shaders to store an entity ID, so now I can click on entities directly in the editor scene view and it selects them. …and it’s pixel perfect :D changes editor layer added framebuffer based entity picking clicking entities in the scene view selects them!!!! selection is based on the exact pixel under the mouse (i mean to implement gizmos i first need to know what the hell my mouse is on) project management also started laying the groundwork for actual project management. now that I have some sort of VFS implemented, I’m working on a way to properly manage Projects instead of relying on the current setup. still figuring out the exact structure, but ive been working on setting up the Project class"}, {"post_id": 16940, "ts": "2026-06-27T14:41:38Z", "hours": 3.1197, "text": "VFS & Editor layer implemented a basic VFS (Virtual File System) . all asset loading is now routed through the VFS instead of directly loading files. this is mainly preparation for adding proper project management later instead of relying on a hardcoded project.json in the project root i was testing with changes VFS added a basic VFS implementation routed asset loading through the VFS the idea is that the VFS will make it easier to manage project assets and not have everything depend on hardcoded paths. editor layer still experimenting a bit with the editor placeholder UI. added: (new EditorCamera derived class of Camera ) camera panning in the editor viewport camera zoom toggling top-down / isometric perspective with keybinds the top-down view should be useful later when I add actual map editing stuff most of the editor UI is still just placeholder right now, I’m mostly testing layouts and figuring out how I want the editor to feel and look ImGuizmo also added ImGuizmo to the project since I’m planning to start implementing proper editor stuff soon.. …and well… you need gizmos… I’ve reinvented the wheel enough already, so using a proper gizmo library seems like the better choice :) (also integrates very nicely with ImGui)"}, {"post_id": 16309, "ts": "2026-06-26T15:23:43Z", "hours": 2.0242, "text": "Editor UI & Framebuffer Experiments i’ve started experimenting with the ImGui docking branch in the EditorLayer . (switched branch had some build errors blah blah blah but its all set up now) Implemented some placeholder editor UI to test out the docking stuff and get a feel for how the editor layout might end up being like changes editor layer placeholder UI using ImGui docking features testing editor panel layouts framebuffer implemented a framebuffer system for the editor viewport. the scene is currently rendering in the editorlayer via a frame buffer so it can fit in the little thingy (i forgot the name) while testing I noticed some resizing issues when running on my nvidia dGPU: the framebuffer resize works, but resizing the viewport can appear somewhat choppy? the framebuffer and docking setup seem to be working, so i guess this im close to actually start to build proper tooling :)"}, {"post_id": 15851, "ts": "2026-06-25T19:34:56Z", "hours": 4.3886, "text": "refactoring for editor foundation Refactored rendering and culling systems and made broader architectural changes to decouple the game from the application layer. Rendering & Culling Refactored frustum culling logic to be lil more performant and generally cleaner Cleaned up and improved parts of the rendering pipeline since i had alot of old unused code lurking in them since i switched to a multithreaded architechture Application Architecture the engine is now structured around an ApplicationLayer system. The core Application class now runs a single active ApplicationLayer Each layer exposes: Init Update Render Shutdown Game class refactor The Game implementation has been converted into a derived ApplicationLayer Game logic is now fully driven through the layer system instead of hardcoded to the application class (the different executable mains decide now) Editor Layer added a new EditorLayer Intended for a future scene editor application. (right now all it does is render a given scene on the screen) CMake changes reworked the project to generate multiple executables: obliberry_engine core engine executable (ig runtime) obliberry_editor editor application layer changes: Engine and core systems (i.e ObSL, Renderer, etc) are now compiled as libraries Executables link against shared engine libraries instead of duplicating code Editor executable links against engine modules summary Game logic is now layer-based Engine and tools are separated Editor can proceed independently from the game runtime"}, {"post_id": 15286, "ts": "2026-06-24T20:32:54Z", "hours": 3.7039, "text": "multithreading & rendering I think I got some form of multithreading working now. The renderer has been moved onto its own dedicated thread, separating rendering from the main engine thread :) Changes Rendering Thread Moved rendering execution to a separate thread (alot had to be refactored for this to work lol) Thread Safety i tried (imgui was a pain) Rendering Optimizations Added frustum culling to the renderer. big optimizeD? actual rendering (i.e gpu calls) is now seperated from the main thread :D …it looks like its working for now"}, {"post_id": 14758, "ts": "2026-06-23T23:48:42Z", "hours": 0.4239, "text": "I think i fixed most of the silly bugs from trying to make rendering thread safe, im still gonna double check some stuff and do some testing but moving rendering to its own render thread will be coming soon :))))"}, {"post_id": 14743, "ts": "2026-06-23T23:15:37Z", "hours": 1.1569, "text": "kinda reverted changes from the last log and tried again to convert everything to be thread safe before actually trying to run on a seperate thread… things are going.. interestingly"}, {"post_id": 14522, "ts": "2026-06-23T17:41:20Z", "hours": 0.8647, "text": "im trying to make the renderer run on another thread… few issues… cant see (entity) meshes?, and closing the window seems to cause a freeze…. :))"}, {"post_id": 14480, "ts": "2026-06-23T16:45:32Z", "hours": 1.2731, "text": "Been mostly just fixing some window rendering stuff Moved away from hardcoded resolution / aspect ratio and made it handle itself on the fly also removed the padding bars i had before so rendering actually takes up full screen New native engine binding in EngineLib too: Window_SetFullscreen (takes a bool) I’m planning on starting to work on making the engine multithreaded soon…"}, {"post_id": 14379, "ts": "2026-06-23T14:22:29Z", "hours": 0.8064, "text": "“project” file system prototype Started implementing support for engine project files instead of hardcoding a scene path like i was before for testing. The engine will now deserialize a project.json file containing configuration, includes: name Project name (unused for now) version Project version (also unused) start_scene Path to the scene the engine loads on startup Window configuration: width height title fullscreen while implementing this, I uncovered some unexpected behaviour related to fullscreen handling caused by how window sizing was previously managed. i spent time refactoring and fixing the window size logic to make fullscreen behaviour… work.. project loading is now starting to come together, less hardcoded stuff yippie (im planning on making an editor in the future so.. this is why)"}, {"post_id": 14345, "ts": "2026-06-23T13:22:42Z", "hours": 1.3275, "text": "Porting ECS systems to ObSL Fully ported the InteractionSystem to ObSL through EngineLib. Camera movement and player movement are now handled through dedicated ObSL scripts instead of being hardcoded ECS systems. This moves more gameplay logic into the scripting layer and makes systems easier to modify and iterate on :) Changes System Migration Ported InteractionSystem from ECS code to ObSL Basically Moved camera movement & player movement logic into ObSL scripts Interaction system is no longer hardcoded engine-side gameplay system New EngineLib Bindings Math / Hex Grid Math_WorldToHex Converts world coordinates into hex grid coordinates SetSelectedHex Updates the currently selected hex tile Camera Camera_SetZoom Sets the camera zoom level Window Window_GetHeight Gets the current window height Window_GetWidth Gets the current window width Input Input_IsKeyReleased Checks if a key was released Input_IsMouseDown Checks if a mouse button is currently held Input_IsMouseReleased Checks if a mouse button was released Input_GetMouseX Gets the mouse X position Input_GetMouseY Gets the mouse Y position Input_GetScrollX Gets horizontal scroll input Input_GetScrollY Gets vertical scroll input Please ignore the weird graphical artifacting in the attached video, my pc has been acting up recently :("}, {"post_id": 13950, "ts": "2026-06-22T22:00:49Z", "hours": 3.1867, "text": "more EngineLib work Implemented several improvements to the scripting and entity systems. changes prefab caching Added caching for prefabs to improve performance when repeatedly instantiating entities Entity Access in Scripts Added GetEntity , which returns the entity Object that the script is attached to. Added support for the this keyword in ObSL scripts. this is a wrapper around GetEntity() to provide direct access to the current entity custom components Added support for script-defined components: entity.AddCustomComponent entity.GetCustomComponent This allows scripts to attach and retrieve custom data/components without requiring engine side component definitions entity validation Updated all entity object calls (such as GetComponent ) to validate the entity before executing (in both native bindings & engine source code) Entity operations now check: registry.isValid(id) before accessing the entity. This prevents errors caused by accessing deleted entities during scenarios such as scene unloading/loading cleanup"}, {"post_id": 13774, "ts": "2026-06-22T16:02:35Z", "hours": 0.8908, "text": "EngineLib I may have forgotten to mention this in my previous log, but I also implemented an Instantiate method in EngineLib. Instantiate takes an entity definition as a JSON file (ig a prefab) and spawns the entity into the current scene. I also added scene related functionality to EngineLib: LoadScene Loads a scene from a given path GetCurrentScenePath Returns the path of the currently loaded scene"}, {"post_id": 13737, "ts": "2026-06-22T15:02:47Z", "hours": 3.4014, "text": "I’m using miniaudio to implement audio support in the game engine, with an AudioEngine class to abstract the audio functionality. I’ve also updated SceneProperties to include a new background_music property. This allows each scene to define a background music track (via filepath) that will automatically loop through the AudioEngine while that scene is active. It all seems to be currently working well, Next I’m starting to integrate audio functionality into EngineLib so that scripts can interact with the audio system. changes Added AudioEngine abstraction layer using miniaudio Added background_music support to SceneProperties (w. proper serialization/deserialization ofc) Implemented looping background music per scene"}, {"post_id": 13262, "ts": "2026-06-21T18:28:09Z", "hours": 2.735, "text": "EngineLib Script Integration I fully replaced the previously hardcoded PlayerMovementSystem with an ObSL script implementation using new EngineLib bindings. The movement logic is now handled externally through scripting instead of being directly implemented in C++. New EngineLib Bindings entity management Added bindings for basic entity operations: CreateEntity Creates a new entity Destroy Removes an entity HasComponent Checks whether an entity has a specific component RemoveComponent Removes a component from an entity global functions get_dt Retrieves delta time CloseWindow Closes the glfw window Input System Added script access to input handling: Input_IsKeyDown Checks if a key is currently held Input_IsKeyPressed Checks for a key press event Input_IsMousePressed Checks if a mouse button is pressed Input_GetMouseWorldPos Gets the mouse position converted to world space Movement / Hex Grid Functions Added bindings for interacting with movement components: GetSelectedHex Gets the currently hovered hex tile SetPathToHex Sets a movement target path for an entity with a MovementComponent Camera Added camera manipulation support: Camera_GetPosition Gets the camera position Camera_SetPosition Sets the camera position Camera_Move Moves the camera Camera_PanScreenSpace Moves the camera relative to screen space Camera_GetZoom Gets the current camera zoom Hex Rendering Added bindings for controlling grid visuals: ClearSelectionOverlay Clears the hex selection overlay ClearPathTarget Clears the path target visual marker ClearPathTarget is currently named poorly. It only clears the grid overlay visualization, not the actual movement target!!! summary Removed the old hardcoded PlayerMovementSystem Migrated player movement logic into script format Added engine bindings required for script-driven gameplay Camera movement, input handling, and hex selection now work through scripts Even more gameplay code can now be modified without recompiling the engine :)"}, {"post_id": 12232, "ts": "2026-06-19T23:34:06Z", "hours": 2.7347, "text": "I’ve got a good basis for the Engine integration library for the ObSL Scripting Language. In the attached video, I’m changing the player’s size using a ping-pong function (?forgot the name…), fully through an ObSL script ( ScriptComponent ) attached to the “Player” entity. The language now has support for the following through the EngineLib : Entity Objects Find GetName SetName GetComponent Components Transform SetPosition SetRotation SetScale GetPosition GetRotation GetScale (uses ObSL arrays) Point Light SetColor (Vec3) SetIntensity SetRadius MovementComponent GetIsMoving SetIsMoving SetTimePerStep MapStateComponent GetHasSelection GetSelectedHex GetPathToHex DirectionalTextureComponent SetIndex GetIndex PlayerInputComponent is still w.i.p. Tag Components currently don’t have any methods since they are only used as tags. Planned I’m planning to keep expanding the EngineLib api with more methods, such as: Has(component) AddComponent RemoveComponent(name or ref) Destroy(EntityID) GetEntityID(entity object ref)"}, {"post_id": 12030, "ts": "2026-06-19T16:56:29Z", "hours": 2.8408, "text": "I’ve got the scripting language integrating with the engine via a ScriptComponent on the player entity, seems to be working all good though I still have to implement the actual Engine library for everything… but I have simple scripts running on entities as components in the game engine, which went faster than I expected, so i’m happy with it :)"}, {"post_id": 11605, "ts": "2026-06-18T21:53:02Z", "hours": 15.6978, "text": "Drafting a readme for the scripting language before I plan on the Engine bindings"}, {"post_id": 9500, "ts": "2026-06-15T21:05:05Z", "hours": 6.1578, "text": "added switch statements, foreach-loop, objects, modules (imports), and a standard library to the scripting language"}, {"post_id": 8966, "ts": "2026-06-14T22:36:48Z", "hours": 2.3381, "text": "I’m working down my todo-list for the scripting language (ObSL). Right now i’ve got arrays implemented! i also made a method to define functions from the c++ source so that I can access c++ stuff (like std::chrono functions that im using for testing right now from the test.obsl script), and whatever other functions i want to have accessible, this will be very useful later on as I to integrate the scripting language with the game engine, as now i have an easy way to call functions already defined in the engine source code from the scripting language by just calling interpreter.bind_native(args blah blah); and then I can call the function from the interpreted scripts.. very useful :D"}, {"post_id": 8716, "ts": "2026-06-14T14:08:32Z", "hours": 2.1228, "text": "the scripting language now has some more mathematical operators and functions !"}, {"post_id": 8434, "ts": "2026-06-14T01:00:46Z", "hours": 2.25, "text": "The scripting language is now technically Turing complete, as i have added state environment (basically variables persist throughout the session), conditional branching via if / else statements basic repetition via while & for loops the screenshot below shows a fibonacci sequence & an example of the conditional branching w. looping . of course it’s not done yet though, i still have a lot of work ahead :)"}, {"post_id": 8361, "ts": "2026-06-13T21:59:28Z", "hours": 2.07, "text": "still working on parsing and implementing new nodes :)"}, {"post_id": 8255, "ts": "2026-06-13T18:48:40Z", "hours": 2.3453, "text": "Working on trying to implement a scripting language for my game engine… i’ve got a simple parser working, it definitely went faster than i expected. Going back and reviewing an old parser i made in C# a while ago helped a lot in this :)"}, {"post_id": 8113, "ts": "2026-06-13T15:24:08Z", "hours": 3.8419, "text": "I’d like Entities to be scriptable in a future editor application / in general without having to edit c++ source files of the editor to implement new logic systems for one entity, so i’m planning on implementing a very basic scripting language, the way i plan on it working is that you attach a script to an entinty as a component, and it will hold the actual game logic in that script, im not great at explaining with words but what im doing now is starting on implementing lexical analysis for a simple interpreter just to test things out, while I have written small interpreters before, alot of this is still new to me so I am learning along the way. the idea is that its just a very basic scripting language to interact with entities and the current scene, with basic apis for interacting with the current scenes ECS registry,we will see how it goes :)"}, {"post_id": 7654, "ts": "2026-06-12T19:56:36Z", "hours": 2.1944, "text": "I’m working on a simple map lighting system, which seems to be working alright. Also scene files now have background color information (which ends up getting wired into glClearColor), also implemented name field for entities because why not. I’m also messing around a bit with the UI since im not super experienced with ImGui but I like trying things out…"}, {"post_id": 7507, "ts": "2026-06-12T15:05:30Z", "hours": 2.1106, "text": "I’ve been focusing mostly on my scene serialization lately. First, I refactored the maps to remove the hardcoded TileTypes enum, which used to map 0 to grass and 1 to sand. Instead, I implemented a system where this is defined in the grid section of the scene’s json file. The “id” property is now a generic unsigned integer for the tile type, and the “texture” property references a specific asset loaded in the scene. I also added a “properties” section for the scene’s name and a “clear_color” array. This lets you dynamically change the window’s background color on the fly instead of always defaulting to a hardcoded black. Writing the new methods and sorting out the custom serialization logic took a bit of work, but it is working great now. also bumped the map file “version” to 2, even though the reading/writing of map files didn’t change at all, the usage of some bytes did kind of change (for the tiletype) so i felt it was fitting"}, {"post_id": 7189, "ts": "2026-06-12T00:17:40Z", "hours": 1.3681, "text": "i’ve been playing with loading in entities and meshes.. ignore the weird fps drops and generally low fps (compared to normally), screenshots and recordings loves messing with performance for some reason"}, {"post_id": 7135, "ts": "2026-06-11T22:23:21Z", "hours": 5.1658, "text": "i’ve implemented instanced draw calls alongside regular draw calls in my renderer, which currently im using instancing for drawing the map, I also implemented culling for the map depending on viewport and some other small optimizations, I also spent some time on fixing and improving my “Systems” and some general cleanup"}, {"post_id": 6799, "ts": "2026-06-11T12:20:56Z", "hours": 1.5519, "text": "Managed to fix the segfault.. Mesh::Upload was updating buffer data without binding its own VAO first, which polluted the global OpenGL state. When a new scene loaded, the driver tweaked out on the broken index bindings and crashed on the next draw call …"}, {"post_id": 6484, "ts": "2026-06-10T22:04:02Z", "hours": 1.4136, "text": "I’ve got saving scenes working fully now! ^-^, but an issue ive run into is a segmentation fault on switching scenes, I theorize that it’s due to me not cleaning up / reassigning things when I load in new meshes etc from the scene, thus leaving old pointers in the render queue which don’t exist anymore. This i will work on fixing next.. But for now I am quite happy that i have scenes loading and saving to json :)"}, {"post_id": 6400, "ts": "2026-06-10T19:22:44Z", "hours": 4.4556, "text": "I’ve got loading in scenes working pretty well, but I still have work todo before I can save them properly, im pretty tired already since i spent all day chasing a bug regarding render sorting and ended up refactoring a ton of stuff that i probably didnt have too as i was searching for the issue, but atleast the codebase is somewhat cleaner"}, {"post_id": 6187, "ts": "2026-06-10T12:05:48Z", "hours": 0.365, "text": "running some tests.. messing around with funny map generation shapes too but i dont know how i feel about them"}, {"post_id": 5958, "ts": "2026-06-09T23:43:23Z", "hours": 5.3872, "text": "rather than using another custom file format i decided to just use json to serialize scenes which is coming along rather nicely …"}, {"post_id": 5695, "ts": "2026-06-09T16:10:54Z", "hours": 2.3658, "text": "I’ve been restructuring the and moving things to run actual game logic via “Systems”. I’ve temporarily been testing this in a messy way directly in the scene class, but I’m planning on implementing maybe some sort of basic scripting language that can be used for game logic in entities as a Component w. accompanying systems ofc, so game logic can be defined outside of engine source files and serialized into a scene’s registry from a given file rather than the things im messing around with now. serialization of scenes is what im planning to implement next once im happy with how scenes are working, but i need to plan ahead alot. So for now I’m still going to focus on making sure my Scene implementation is good enough before I focus on implementing serialization and scripting etc, and I have alot to think about regarding the design and architecture of this thing that seems to have evolved into a Game Engine :)"}, {"post_id": 5539, "ts": "2026-06-09T10:55:05Z", "hours": 2.0847, "text": "working on getting Scenes implemented"}, {"post_id": 5225, "ts": "2026-06-08T22:43:53Z", "hours": 2.7831, "text": "I completely refactored my ECS into an actual proper entity component system and added a lil fancy inspector for entities/components in the UI, everything works with the new system :) Now that my ECS is properly implemented I’m going to start focusing on implementing proper Levels/Scenes rather than the mess I have right now in my “Game” class which I’ve been using for testing stuff (ignore the weird framedrops my screen recorder was tweaking out)"}, {"post_id": 4858, "ts": "2026-06-08T12:03:11Z", "hours": 0.5367, "text": "i made a npc (the red super mutant) that just wanders around"}, {"post_id": 4844, "ts": "2026-06-08T11:26:15Z", "hours": 0.9856, "text": "I’ve been having a bit of fun with player sprites (currently som fallout 1 super-mutant sprites i found online) and the renderer sorting sorting code to avoid the player appearing under the ground"}, {"post_id": 4599, "ts": "2026-06-07T23:21:51Z", "hours": 0.7331, "text": "I implemented reading from the previously saved map file, with some tests ofc :D please ignore the player flying away at the end.. as of the time of writing it was a sloppy bug which is already fixed"}, {"post_id": 4582, "ts": "2026-06-07T22:30:26Z", "hours": 1.5031, "text": "I’ve implemented saving the current grid to my own custom file format, and some tests to check that it’s working and all seems good.. but now, the real test is to see if I can load back in that file properly :)"}, {"post_id": 4281, "ts": "2026-06-07T15:19:30Z", "hours": 3.5969, "text": "I did a few things i made it highlight what hex the player is currently moving towards in white fixed a bug causing it to crash when i tried to use my dgpu (issue with my GLdebug class trying to load unavailable glDebugMessageCallback since my dgpu driver uses an older OpenGL version than my igpu and i kinda forgot to check if it the callback function was available BEFORE calling it.. .-.) refactored some of my Hex code to prepare for making some sort of system to load maps from files, so i generally cleaned up some stuff and opted for smaller datatypes for my needs (i.e using int16_t rather than ints for hex coords r & q, since that’s really all you need unless your map is massive) i also added some more fancy ui with imgui to play around with and generally just cleaned up some code… in short im basically preparing myself to implement some sort of map file loader w. accompanying filetype?"}, {"post_id": 3847, "ts": "2026-06-06T22:12:28Z", "hours": 1.7772, "text": "I managed to setup a basic ImGui window to control map generation, I also tried to optimize my rendering by fixing a sloppy bug i had in my batching implementation and caching transformation matrices per transform (dirty flag pattern) fps does seem stable :) (please ignore the video artifacting)"}, {"post_id": 3544, "ts": "2026-06-06T15:07:32Z", "hours": 11.2967, "text": "I redid almost everything with what i’ve learnt from trying the first time (ECS, ResourceManager & MeshFactory are basically the same though) I managed to implement A* pathfinding for the player movement. I got to render out the map with textures i made. tried to recreate movement like Fallout has, where you move the mouse to pan and click to move to a tile with stepping. The hex grid is reperesented via an odd-r offset layout."}, {"post_id": 2707, "ts": "2026-06-05T12:48:03Z", "hours": 1.4394, "text": "Experimenting with camera stuff and input, now i can zoom with the scrollwheel and i’m trying to get an isometric perspective working better"}, {"post_id": 2669, "ts": "2026-06-05T10:44:01Z", "hours": 1.9911, "text": "im getting a simple resource manager implemented :)"}, {"post_id": 2395, "ts": "2026-06-04T21:04:46Z", "hours": 3.0553, "text": "It may not look like much, but I’ve been working on implementing a form of an ECS , rewriting some stuff too. I kind of broke some camera stuff in the process which I’m going to fix soon, and actually get this stuff to be the correct perspective and such…."}, {"post_id": 2168, "ts": "2026-06-04T14:49:59Z", "hours": 3.0614, "text": "i’ve been experimenting with some stuff back and forth, now im working on testing basic “Player” movement with WASD"}, {"post_id": 1448, "ts": "2026-06-03T14:24:00Z", "hours": 2.3058, "text": "I’ve implemented proper debug logging for OpenGL, optimized rendering with a queue that sorts RenderCommands to avoid unnecessarily binding & unbinding, a basic InputManager class, and very basic materials."}, {"post_id": 1055, "ts": "2026-06-02T21:13:14Z", "hours": 1.5414, "text": "i’ve got a basic hex grid “map” rendering and working well"}, {"post_id": 890, "ts": "2026-06-02T16:46:10Z", "hours": 0.7936, "text": "Implemented a basic camera which im messing around with a bit to rotate (around) my mesh"}, {"post_id": 858, "ts": "2026-06-02T15:50:32Z", "hours": 1.3153, "text": "I now have textures working, and a basic “meshfactory”"}, {"post_id": 801, "ts": "2026-06-02T13:58:30Z", "hours": 2.4436, "text": "I’ve gotten transforms and basic rendering implemented of objects implemented via a “Mesh” class that gets passed to Draw() in the Renderer Class :)"}, {"post_id": 403, "ts": "2026-06-01T19:57:36Z", "hours": 0.2883, "text": "Setup basic GLFW Window boilerplate & CMake Project :)"}]...
|
Title: obliberry by @torkel | Stardance
Devlogs:
Title: obliberry by @torkel | Stardance
Devlogs:
Setup basic GLFW Window boilerplate & CMake Project :)
I’ve gotten transforms and basic rendering implemented of objects implemented via a “Mesh” class that gets passed to Draw() in the Renderer Class :)
I now have textures working, and a basic “meshfactory”
Implemented a basic camera which im messing around with a bit to rotate (around) my mesh
i’ve got a basic hex grid “map” rendering and working well
I’ve implemented proper debug logging for OpenGL, optimized rendering with a queue that sorts RenderCommands to avoid unnecessarily binding & unbinding, a basic InputManager class, and very basic materials.
i’ve been experimenting with some stuff back and forth, now im working on testing basic “Player” movement with WASD
It may not look like much, but I’ve been working on implementing a form of an ECS , rewriting some stuff too. I kind of broke some camera stuff in the process which I’m going to fix soon, and actually get this stuff to be the correct perspective and such….
im getting a simple resource manager implemented :)
Experimenting with camera stuff and input, now i can zoom with the scrollwheel and i’m trying to get an isometric perspective working better
I redid almost everything with what i’ve learnt from trying the first time (ECS, ResourceManager & MeshFactory are basically the same though) I managed to implement A* pathfinding for the player movement. I got to render out the map with textures i made. tried to recreate movement like Fallout has, where you move the mouse to pan and click to move to a tile with stepping. The hex grid is reperesented via an odd-r offset layout.
I managed to setup a basic ImGui window to control map generation, I also tried to optimize my rendering by fixing a sloppy bug i had in my batching implementation and caching transformation matrices per transform (dirty flag pattern) fps does seem stable :) (please ignore the video artifacting)
I did a few things i made it highlight what hex the player is currently moving towards in white fixed a bug causing it to crash when i tried to use my dgpu (issue with my GLdebug class trying to load unavailable glDebugMessageCallback since my dgpu driver uses an older OpenGL version than my igpu and i kinda forgot to check if it the callback function was available BEFORE calling it.. .-.) refactored some of my Hex code to prepare for making some sort of system to load maps from files, so i generally cleaned up some stuff and opted for smaller datatypes for my needs (i.e using int16_t rather than ints for hex coords r & q, since that’s really all you need unless your map is massive) i also added some more fancy ui with imgui to play around with and generally just cleaned up some code… in short im basically preparing myself to implement some sort of map file loader w. accompanying filetype?
I’ve implemented saving the current grid to my own custom file format, and some tests to check that it’s working and all seems good.. but now, the real test is to see if I can load back in that file properly :)
I implemented reading from the previously saved map file, with some tests ofc :D please ignore the player flying away at the end.. as of the time of writing it was a sloppy bug which is already fixed
I’ve been having a bit of fun with player sprites (currently som fallout 1 super-mutant sprites i found online) and the renderer sorting sorting code to avoid the player appearing under the ground
i made a npc (the red super mutant) that just wanders around
I completely refactored my ECS into an actual proper entity component system and added a lil fancy inspector for entities/components in the UI, everything works with the new system :) Now that my ECS is properly implemented I’m going to start focusing on implementing proper Levels/Scenes rather than the mess I have right now in my “Game” class which I’ve been using for testing stuff (ignore the weird framedrops my screen recorder was tweaking out)
working on getting Scenes implemented
I’ve been restructuring the and moving things to run actual game logic via “Systems”. I’ve temporarily been testing this in a messy way directly in the scene class, but I’m planning on implementing maybe some sort of basic scripting language that can be used for game logic in entities as a Component w. accompanying systems ofc, so game logic can be defined outside of engine source files and serialized into a scene’s registry from a given file rather than the things im messing around with now. serialization of scenes is what im planning to implement next once im happy with how scenes are working, but i need to plan ahead alot. So for now I’m still going to focus on making sure my Scene implementation is good enough before I focus on implementing serialization and scripting etc, and I have alot to think about regarding the design and architecture of this thing that seems to have evolved into a Game Engine :)
rather than using another custom file format i decided to just use json to serialize scenes which is coming along rather nicely …
running some tests.. messing around with funny map generation shapes too but i dont know how i feel about them
I’ve got loading in scenes working pretty well, but I still have work todo before I can save them properly, im pretty tired already since i spent all day chasing a bug regarding render sorting and ended up refactoring a ton of stuff that i probably didnt have too as i was searching for the issue, but atleast the codebase is somewhat cleaner
I’ve got saving scenes working fully now! ^-^, but an issue ive run into is a segmentation fault on switching scenes, I theorize that it’s due to me not cleaning up / reassigning things when I load in new meshes etc from the scene, thus leaving old pointers in the render queue which don’t exist anymore. This i will work on fixing next.. But for now I am quite happy that i have scenes loading and saving to json :)
Managed to fix the segfault.. Mesh::Upload was updating buffer data without binding its own VAO first, which polluted the global OpenGL state. When a new scene loaded, the driver tweaked out on the broken index bindings and crashed on the next draw call …
i’ve implemented instanced draw calls alongside regular draw calls in my renderer, which currently im using instancing for drawing the map, I also implemented culling for the map depending on viewport and some other small optimizations, I also spent some time on fixing and improving my “Systems” and some general cleanup
i’ve been playing with loading in entities and meshes.. ignore the weird fps drops and generally low fps (compared to normally), screenshots and recordings loves messing with performance for some reason
I’ve been focusing mostly on my scene serialization lately. First, I refactored the maps to remove the hardcoded TileTypes enum, which used to map 0 to grass and 1 to sand. Instead, I implemented a system where this is defined in the grid section of the scene’s json file. The “id” property is now a generic unsigned integer for the tile type, and the “texture” property references a specific asset loaded in the scene. I also added a “properties” section for the scene’s name and a “clear_color” array. This lets you dynamically change the window’s background color on the fly instead of always defaulting to a hardcoded black. Writing the new methods and sorting out the custom serialization logic took a bit of work, but it is working great now. also bumped the map file “version” to 2, even though the reading/writing of map files didn’t change at all, the usage of some bytes did kind of change (for the tiletype) so i felt it was fitting
I’m working on a simple map lighting system, which seems to be working alright. Also scene files now have background color information (which ends up getting wired into glClearColor), also implemented name field for entities because why not. I’m also messing around a bit with the UI since im not super experienced with ImGui but I like trying things out…
I’d like Entities to be scriptable in a future editor application / in general without having to edit c++ source files of the editor to implement new logic systems for one entity, so i’m planning on implementing a very basic scripting language, the way i plan on it working is that you attach a script to an entinty as a component, and it will hold the actual game logic in that script, im not great at explaining with words but what im doing now is starting on implementing lexical analysis for a simple interpreter just to test things out, while I have written small interpreters before, alot of this is still new to me so I am learning along the way. the idea is that its just a very basic scripting language to interact with entities and the current scene, with basic apis for interacting with the current scenes ECS registry,we will see how it goes :)
Working on trying to implement a scripting language for my game engine… i’ve got a simple parser working, it definitely went faster than i expected. Going back and reviewing an old parser i made in C# a while ago helped a lot in this :)
still working on parsing and implementing new nodes :)
The scripting language is now technically Turing complete, as i have added state environment (basically variables persist throughout the session), conditional branching via if / else statements basic repetition via while & for loops the screenshot below shows a fibonacci sequence & an example of the conditional branching w. looping . of course it’s not done yet though, i still have a lot of work ahead :)
the scripting language now has some more mathematical operators and functions !
I’m working down my todo-list for the scripting language (ObSL). Right now i’ve got arrays implemented! i also made a method to define functions from the c++ source so that I can access c++ stuff (like std::chrono functions that im using for testing right now from the test.obsl script), and whatever other functions i want to have accessible, this will be very useful later on as I to integrate the scripting language with the game engine, as now i have an easy way to call functions already defined in the engine source code from the scripting language by just calling interpreter.bind_native(args blah blah); and then I can call the function from the interpreted scripts.. very useful :D
added switch statements, foreach-loop, objects, modules (imports), and a standard library to the scripting language
Drafting a readme for the scripting language before I plan on the Engine bindings
I’ve got the scripting language integrating with the engine via a ScriptComponent on the player entity, seems to be working all good though I still have to implement the actual Engine library for everything… but I have simple scripts running on entities as components in the game engine, which went faster than I expected, so i’m happy with it :)
I’ve got a good basis for the Engine integration library for the ObSL Scripting Language. In the attached video, I’m changing the player’s size using a ping-pong function (?forgot the name…), fully through an ObSL script ( ScriptComponent ) attached to the “Player” entity. The language now has support for the following through the EngineLib : Entity Objects Find GetName SetName GetComponent Components Transform SetPosition SetRotation SetScale GetPosition GetRotation GetScale (uses ObSL arrays) Point Light SetColor (Vec3) SetIntensity SetRadius MovementComponent GetIsMoving SetIsMoving SetTimePerStep MapStateComponent GetHasSelection GetSelectedHex GetPathToHex DirectionalTextureComponent SetIndex GetIndex PlayerInputComponent is still w.i.p. Tag Components currently don’t have any methods since they are only used as tags. Planned I’m planning to keep expanding the EngineLib api with more methods, such as: Has(component) AddComponent RemoveComponent(name or ref) Destroy(EntityID) GetEntityID(entity object ref)
EngineLib Script Integration I fully replaced the previously hardcoded PlayerMovementSystem with an ObSL script implementation using new EngineLib bindings. The movement logic is now handled externally through scripting instead of being directly implemented in C++. New EngineLib Bindings entity management Added bindings for basic entity operations: CreateEntity Creates a new entity Destroy Removes an entity HasComponent Checks whether an entity has a specific component RemoveComponent Removes a component from an entity global functions get_dt Retrieves delta time CloseWindow Closes the glfw window Input System Added script access to input handling: Input_IsKeyDown Checks if a key is currently held Input_IsKeyPressed Checks for a key press event Input_IsMousePressed Checks if a mouse button is pressed Input_GetMouseWorldPos Gets the mouse position converted to world space Movement / Hex Grid Functions Added bindings for interacting with movement components: GetSelectedHex Gets the currently hovered hex tile SetPathToHex Sets a movement target path for an entity with a MovementComponent Camera Added camera manipulation support: Camera_GetPosition Gets the camera position Camera_SetPosition Sets the camera position Camera_Move Moves the camera Camera_PanScreenSpace Moves the camera relative to screen space Camera_GetZoom Gets the current camera zoom Hex Rendering Added bindings for controlling grid visuals: ClearSelectionOverlay Clears the hex selection overlay ClearPathTarget Clears the path target visual marker ClearPathTarget is currently named poorly. It only clears the grid overlay visualization, not the actual movement target!!! summary Removed the old hardcoded PlayerMovementSystem Migrated player movement logic into script format Added engine bindings required for script-driven gameplay Camera movement, input handling, and hex selection now work through scripts Even more gameplay code can now be modified without recompiling the engine :)
I’m using miniaudio to implement audio support in the game engine, with an AudioEngine class to abstract the audio functionality. I’ve also updated SceneProperties to include a new background_music property. This allows each scene to define a background music track (via filepath) that will automatically loop through the AudioEngine while that scene is active. It all seems to be currently working well, Next I’m starting to integrate audio functionality into EngineLib so that scripts can interact with the audio system. changes Added AudioEngine abstraction layer using miniaudio Added background_music support to SceneProperties (w. proper serialization/deserialization ofc) Implemented looping background music per scene
EngineLib I may have forgotten to mention this in my previous log, but I also implemented an Instantiate method in EngineLib. Instantiate takes an entity definition as a JSON file (ig a prefab) and spawns the entity into the current scene. I also added scene related functionality to EngineLib: LoadScene Loads a scene from a given path GetCurrentScenePath Returns the path of the currently loaded scene
more EngineLib work Implemented several improvements to the scripting and entity systems. changes prefab caching Added caching for prefabs to improve performance when repeatedly instantiating entities Entity Access in Scripts Added GetEntity , which returns the entity Object that the script is attached to. Added support for the this keyword in ObSL scripts. this is a wrapper around GetEntity() to provide direct access to the current entity custom components Added support for script-defined components: entity.AddCustomComponent entity.GetCustomComponent This allows scripts to attach and retrieve custom data/components without requiring engine side component definitions entity validation Updated all entity object calls (such as GetComponent ) to validate the entity before executing (in both native bindings & engine source code) Entity operations now check: registry.isValid(id) before accessing the entity. This prevents errors caused by accessing deleted entities during scenarios such as scene unloading/loading cleanup
Porting ECS systems to ObSL Fully ported the InteractionSystem to ObSL through EngineLib. Camera movement and player movement are now handled through dedicated ObSL scripts instead of being hardcoded ECS systems. This moves more gameplay logic into the scripting layer and makes systems easier to modify and iterate on :) Changes System Migration Ported InteractionSystem from ECS code to ObSL Basically Moved camera movement & player movement logic into ObSL scripts Interaction system is no longer hardcoded engine-side gameplay system New EngineLib Bindings Math / Hex Grid Math_WorldToHex Converts world coordinates into hex grid coordinates SetSelectedHex Updates the currently selected hex tile Camera Camera_SetZoom Sets the camera zoom level Window Window_GetHeight Gets the current window height Window_GetWidth Gets the current window width Input Input_IsKeyReleased Checks if a key was released Input_IsMouseDown Checks if a mouse button is currently held Input_IsMouseReleased Checks if a mouse button was released Input_GetMouseX Gets the mouse X position Input_GetMouseY Gets the mouse Y position Input_GetScrollX Gets horizontal scroll input Input_GetScrollY Gets vertical scroll input Please ignore the weird graphical artifacting in the attached video, my pc has been acting up recently :(
“project” file system prototype Started implementing support for engine project files instead of hardcoding a scene path like i was before for testing. The engine will now deserialize a project.json file containing configuration, includes: name Project name (unused for now) version Project version (also unused) start_scene Path to the scene the engine loads on startup Window configuration: width height title fullscreen while implementing this, I uncovered some unexpected behaviour related to fullscreen handling caused by how window sizing was previously managed. i spent time refactoring and fixing the window size logic to make fullscreen behaviour… work.. project loading is now starting to come together, less hardcoded stuff yippie (im planning on making an editor in the future so.. this is why)
Been mostly just fixing some window rendering stuff Moved away from hardcoded resolution / aspect ratio and made it handle itself on the fly also removed the padding bars i had before so rendering actually takes up full screen New native engine binding in EngineLib too: Window_SetFullscreen (takes a bool) I’m planning on starting to work on making the engine multithreaded soon…
im trying to make the renderer run on another thread… few issues… cant see (entity) meshes?, and closing the window seems to cause a freeze…. :))
kinda reverted changes from the last log and tried again to convert everything to be thread safe before actually trying to run on a seperate thread… things are going.. interestingly
I think i fixed most of the silly bugs from trying to make rendering thread safe, im still gonna double check some stuff and do some testing but moving rendering to its own render thread will be coming soon :))))
multithreading & rendering I think I got some form of multithreading working now. The renderer has been moved onto its own dedicated thread, separating rendering from the main engine thread :) Changes Rendering Thread Moved rendering execution to a separate thread (alot had to be refactored for this to work lol) Thread Safety i tried (imgui was a pain) Rendering Optimizations Added frustum culling to the renderer. big optimizeD? actual rendering (i.e gpu calls) is now seperated from the main thread :D …it looks like its working for now
refactoring for editor foundation Refactored rendering and culling systems and made broader architectural changes to decouple the game from the application layer. Rendering & Culling Refactored frustum culling logic to be lil more performant and generally cleaner Cleaned up and improved parts of the rendering pipeline since i had alot of old unused code lurking in them since i switched to a multithreaded architechture Application Architecture the engine is now structured around an ApplicationLayer system. The core Application class now runs a single active ApplicationLayer Each layer exposes: Init Update Render Shutdown Game class refactor The Game implementation has been converted into a derived ApplicationLayer Game logic is now fully driven through the layer system instead of hardcoded to the application class (the different executable mains decide now) Editor Layer added a new EditorLayer Intended for a future scene editor application. (right now all it does is render a given scene on the screen) CMake changes reworked the project to generate multiple executables: obliberry_engine core engine executable (ig runtime) obliberry_editor editor application layer changes: Engine and core systems (i.e ObSL, Renderer, etc) are now compiled as libraries Executables link against shared engine libraries instead of duplicating code Editor executable links against engine modules summary Game logic is now layer-based Engine and tools are separated Editor can proceed independently from the game runtime
Editor UI & Framebuffer Experiments i’ve started experimenting with the ImGui docking branch in the EditorLayer . (switched branch had some build errors blah blah blah but its all set up now) Implemented some placeholder editor UI to test out the docking stuff and get a feel for how the editor layout might end up being like changes editor layer placeholder UI using ImGui docking features testing editor panel layouts framebuffer implemented a framebuffer system for the editor viewport. the scene is currently rendering in the editorlayer via a frame buffer so it can fit in the little thingy (i forgot the name) while testing I noticed some resizing issues when running on my nvidia dGPU: the framebuffer resize works, but resizing the viewport can appear somewhat choppy? the framebuffer and docking setup seem to be working, so i guess this im close to actually start to build proper tooling :)
VFS & Editor layer implemented a basic VFS (Virtual File System) . all asset loading is now routed through the VFS instead of directly loading files. this is mainly preparation for adding proper project management later instead of relying on a hardcoded project.json in the project root i was testing with changes VFS added a basic VFS implementation routed asset loading through the VFS the idea is that the VFS will make it easier to manage project assets and not have everything depend on hardcoded paths. editor layer still experimenting a bit with the editor placeholder UI. added: (new EditorCamera derived class of Camera ) camera panning in the editor viewport camera zoom toggling top-down / isometric perspective with keybinds the top-down view should be useful later when I add actual map editing stuff most of the editor UI is still just placeholder right now, I’m mostly testing layouts and figuring out how I want the editor to feel and look ImGuizmo also added ImGuizmo to the project since I’m planning to start implementing proper editor stuff soon.. …and well… you need gizmos… I’ve reinvented the wheel enough already, so using a proper gizmo library seems like the better choice :) (also integrates very nicely with ImGui)
Editor Picking & Project Management because my EditorLayer uses a framebuffer, I can now utilize framebuffer color picking in the editor i updated the shaders to store an entity ID, so now I can click on entities directly in the editor scene view and it selects them. …and it’s pixel perfect :D changes editor layer added framebuffer based entity picking clicking entities in the scene view selects them!!!! selection is based on the exact pixel under the mouse (i mean to implement gizmos i first need to know what the hell my mouse is on) project management also started laying the groundwork for actual project management. now that I have some sort of VFS implemented, I’m working on a way to properly manage Projects instead of relying on the current setup. still figuring out the exact structure, but ive been working on setting up the Project class
Namespace Refactor & Project Management Work Dependencies finally caused me to run into a namespace conflict after being lazy and unorganized… instead of being sane and just renaming one class.. I decided to refactor the entire project to use proper namespaces everywhere.. changes namespaces Refactored the entire codebase into proper namespaces project management / editor backend I don’t really have much visually to show this update since I’ve mostly been working on backend stuff. Working on: project management scene management VFS improvements editor saving/loading I’m using nativefiledialog-extended to work on proper file dialogs for saving and loading from the editor. Also been doing a lot of testing around project creation and loading. alot of this is in the hope i can get this working multi-platform and not just on linux (though i have yet to try and compile on another os) Things are working… for now… so progress :D
Editor & Scene Management been working on the editor mostly. changes ECS implemented generational ID masks for the ECS. this should prevents issues with stale entity references since IDs can now properly track generations instead of just relying on raw IDs. (i encountered this issue when testing multiple scenes in one project) scene manager fully implemented the SceneManager so it can actually be used by the editor & game layer. this allows the editor to properly load/save/validate/find and generally handle scenes through a unified API (goes for gamelayer aswell but it only really loads them) bug fixing spent a lot of time fixing various issues around: project folder management scene management loading / saving behaviour asset loading (cache was causing some problems on loading scenes but its all fixed now :D) mostly backend work but things are becoming a lot more stable and the editor foundation is starting to come together….
ive been mostly messing around with getting the ObSL language to be thread-safe and refactoring some things, so I don’t have much to show but my end goal is to be able to get scripts to run concurrently and outside of the main thread
Script multithreading (and concurrency) scripts now run on other thread(s) :D this took a fair bit of cleanup, but it’s working. changes script workers moved script execution onto worker thread(s) worked on script worker concurrency dynamically clamp the number of active workers based on how many callbacks are actually running, so idle threads aren’t just spinning doing nothing garbage collection did some work on the GC as well. introduced external root tracking fixed a few issues around GC roots while getting multithreaded script execution working cleanup spent some time cleaning up a bunch of backend stuff while getting all of this working. build system updated CMake so all executables, scripts, and (project) templates are output to a single build/bin directory instead of being messy. multithreading yay :)
ObSL Scripting Library Moved the scripting language into its own repository :) It’s now included in the engine as a library using git submodules and public headers instead of living directly in the engine source code Makes the project structure a lot cleaner .. for both projects ( ObSL can now be found at https://github.com/torkelicious/ObSL )
actually working on the editor I’m finally getting around to actually implementing the editor ..it still looks pretty similar (well mostly the same) but most of the UI before was just placeholder. changes editor implemented a Project Settings window implemented a Scene Properties window made the component widgets actually do something now load textures assign scripts change material colors change meshes change shaders etc…. added an Add Component button added Remove buttons to components it works.. so thats good :D
editor Gizmos! :DD this took a lot longer than I’d like to admit… but it’s finally working. changes gizmos got all gizmos working.. but had issues with rotation and scale at first figured out the issues with rotation/scaling ended up patching ImGuizmo at first to get things working, but after digging through the code I eventually figured out how to do it properly with the normal library translation, rotation, and scale gizmos all work now :)))))) honestly I learnt quite a bit just from messing around with the ImGuizmo internals.. but it was painful editor added a few more UI improvements as well. i.e billboard sprites now explicitly mention that rotation doesn’t do anything, instead of letting you wonder why nothing happens gizmos are one of those things I’ve been waiting on implementing.. but im finally happy to have them
Project Packaging been working on a packaging format for projects. the goal is basically to package an entire project into a single container while preprocessing assets that make sense to preprocess. Also makes shipping a game made in the engine in the future alot easier / cleaner, and portable. changes packaging implemented the start of a proper project packaging system. currently it: parses ObSL scripts ahead of time and stores serialized ASTs instead of source code (basically very similar to some sort of a very very simple AOT compiler) converts project, scene and prefab JSON files into MessagePack stores media and other binary assets directly in the package optionally compresses package entries with LZ4 the idea is that the engine has less work to do at runtime since scripts don’t need parsing and JSON doesn’t need parsing either. and a single “package” file is alot cleaner in general for a finished game “build” package format also implemented the actual container format itself. different asset types are stored as different entry types (scripts, binary JSON, media, shaders, etc.), so the loader knows exactly how each asset should be handled. tools added standalone packaging tools as well for packing and unpacking projects, mostly for testing. still a work in progress, but the whole packaging pipeline is starting to come together.
Project Packaging is Working been spending a lot of time working on project packaging, and it’s finally working now. the engine can now load projects directly from .obpak files, and I’ve got basic tooling to create them as well. the plan is to integrate the tooling i have now with the editor to “build” an obpak archive (i think its called an archive?) changes packaging implemented the full packaging/loading pipeline yippie :D currently the packer: pre-generates ASTs for ObSL scripts converts project, scene(s) and prefab(s) JSON into MessagePack bundles everything into a single .obpak container compresses the package with LZ4 assets like textures, audio and shaders just get copied into the package without any conversion runtime the engine can now load packaged projects directly instead of relying on loose project files. all of this goes through the VFS, so from the engine’s point of view it doesn’t really matter whether assets are coming from a folder or from an .obpak (i.e it can still load loose project files of course) tooling added command-line tools for packing and unpacking projects, i originally made it for testing but it’s actually pretty nice to work with so im probably keeping it. still probably things to polish, but it’s pretty satisfying seeing the engine load an entire packaged project properly pls ignore the lag in the video, i promise its not as terrible as it looks, its just that recording is pretty buggy for me
Project Exporting been working on making projects exportable from the editor it’s now able to export a project to the selected folder, package all the assets into an .obpak , and then copy over the runtime so the exported project is runnable changes project exporting added export to the editor choose an output folder for the exported project packages the project into an .obpak copies the runtime into the export folder renames the runtime to match the project name (just 2 files for full project!, executable and .obpak) the whole process is pretty much one click now instead of manually packaging everything together. file dialogs refactored my entire filedialog implementation cuz it was kinda broken packaging did some more work on the packaging pipeline while implementing exporting and put it in the editor ui im pretty happy that its all working and i can actually export stuff, and run it feels cool :)
editor rework & map editing groundwork been working on the editor again this update was mostly about cleaning up the editor architecture so I can actually keep adding features without everything turning into spaghetti. I also finally started laying the groundwork for proper map editing. changes editor reworked the editor state system. instead of instantly swapping between states, transitions are now deferred until a safe point during the update loop. this makes switching between Edit, Play, Map Edit, and the Hub a lot cleaner, and the editor now remembers which editing mode you were in before hitting Play. (i’ll admit… i was getting a bunch of weird, seemingly unexplainable crashes before eventually realizing my mistake was instantly switching states while things were still being updated/rendered…) also moved more UI responsibility into the individual states instead of having EditorLayer decide how everything should be drawn. map editor started putting together the map editor. currently i have: map hover and tile selection working placeholder Paint / Erase / Select tools the beginnings of a tile palette system a placeholder tile editor panel the actual editing logic isn’t implemented yet, but the foundations are there now :) asset picker ripped out the old “open a native file dialog for every asset field” flow. instead, the editor now lets you pick existing textures, meshes, materials and shaders directly from the ResourceManager , which is a lot nicer to work with and also avoids accidentally importing duplicate assets. (the old workflow would happily create a brand new object every time you imported something… which was fine for testing, but definitely wasn’t something i wanted to keep) rendering fixed a few editor rendering issues while i was at it. materials with invalid shaders now fall back to the default shader instead of silently disappearing fixed some edge cases with framebuffer entity picking currently unused, but functional shader hot reloading tests misc smoothed out editor camera movement and zoom added a few helper utilities for the map editor reorganized the editor UI code a bit doesn’t look massively different in screenshots, but makes future work alot easier/cleaner map painting is next ?..
map editor preveiw ig kinda didnt have much time to do anything today but im working on the tile editor
Map Editing, Brushes, and a 4(?) hour ImGui Bug The map editor is finally coming together It’s still a bit… rough but it does feel nice to be able to paint a map in the editor I did, however, spend an embarrassing amount of time trying to figure out why my click and drag “painting” wasn’t working… well.. ImGui was eating my inputs because it thought I was trying to drag the Scene View window around.. yeah.. changes map editor actually got the map editing tools working for real this time. the paint and erase tools actually place and remove tiles now instead of just being placeholder buttons added a brush radius slider, so you can paint in bigger hex rings added a preview outline that renders around your cursor so you can see before clicking toggling “is walkable” on a tile now properly syncs with the grid pathfinding editor ui spent some time making the tile palette and material editing.. work.. video explains better ngl im not good at describing ui stuff math laid some groundwork in the hex math system ( Lerp , CubeRound , and GetHexLine ) this is mostly for some future evil plans… still a WIP…
Logging Cleanup replaced all the random std::cout / std::cerr calls scattered throughout the project with an actual logging system logging implemented a proper logging system. replaced std::cout / std::cerr throughout the engine added support for different log levels optional logging to a log file centralized all engine logging into one place thread safe !!!! nothing particularly flashy or fancy, but its cleaner, easier to work with, and generally just nice i probably should’ve done this a long time ago :)
editor polish still nothing super flashy.., mostly a bunch of small things changes window titles the editor now updates its window title based on what youre working on. it’ll now include things like the current project and scene, or map project loading cleaned up project loading a bit. the editor now properly syncs the loaded project configuration into the engine context instead of relying on stale data also added menu in the map editor that lets you save and load map files (create new is just placeholder for now) UI added a small helper for rendering framebuffer textures in ImGui without needing to remember to flip the UVs every time. and made the tile Editor use it also forgot to mention in the last log that i cleaned up the “project browser” ui a bit logging fixed up some more logging :)
Undo/Redo! :) been working on some editor QoL stuff again… the biggest addition this time is a proper undo/redo system. it’s still very early and pretty barebones, but having the foundations in place is nice changes editor commands implemented the beginnings of a proper command system for the editor instead of modifying things directly, editor actions now go through commands, which means they can be undone and redone currently supports: entity transforms movement rotation scaling adding components removing components (with the exception of ScriptComponent for now.. that’ll get its own custom command due to the way it works) also keeps a command history, and the usual shortcuts are hooked up now: Ctrl + Z : Undo Ctrl + Y : Redo its still pretty basic, but it works and feels nice to use. input for this, I added proper key-combination support to the input manager. things like: Ctrl + S Ctrl + Z Ctrl + Y can now be handled properly instead of manually checking modifier keys everywhere logging did a bit more cleanup to the logging system as well. the logger now goes through a proper interface instead of everything depending directly on one concrete implementation, which should make it a bit easier to swap things around later if I ever want to. mostly backend work again… but undo/redo is fire
Undo/Redo …again! been working on the editor again the undo/redo system now covers a lot more than just gizmo transforms. but there’s still a few things left (entity creation/deletion mainly). changes undo/redo expanded the command system to cover most editor actions. currently supports: entity transforms adding/removing components adding/removing scripts editing project settings editing scene properties also fixed the undo/redo shortcuts so they only trigger once per key press instead of repeatedly firing while the keys are held… which is probably how they should’ve worked from the start map editor continued working on map editing. painting and erasing now properly integrate with the command system. also, an entire brush stroke is treated as a single undo step instead of undoing one tile at a time. also cleaned up a couple of edge cases while doing this, like preserving existing tile data and avoiding unnecessary commands when nothing actually changed. misc did a bit of cleanup around the editor while wiring everything together. centralized a few bits of duplicated UI logic cleaned up window title updates continued refactoring the command system the undo system is still unfinished, but it covers most of the important stuff and feels nice.. also.. still gotta fix some ui window-size stuff soon too but .. thats for later
Performance & Zero Copy Assets been spending some time under the hood… this one’s almost entirely backend. no new features, mostly went through the render thread, asset pipeline, & a handful of ECS loops to squeeze out more performance. it was incredibly rage inducing at times.. but seeing the profiler diff against baseline.. i am satisfied.. almost at peace.. but was considering becoming a farmer & never touching a computer again.. mostly because i thought i’d messed up more than i did.. but.. im happy now. changes threading & ecs i’ve reinvented the wheel enough already… but had to redo how tasks are dispatched. ThreadPool used to take a std::function , which heap allocates if you capture more than a couple pointers. scripts dispatch through this every frame, so it added up. swapped it for a custom Task type a 56-byte inline buffer, no heap allocs swapped the pending-task counter to a lock free atomic decrement instead of a mutex on every completion… rendering been cleaning up how the main thread interacts with the render thread. the main & render threads used to awkwardly poll eachothers framebuffers. now theres a m_ReadyFrames deque main pushes a frame index, render pops it. much cleaner :) ImGui draw data is now reused in-place instead of allocating & freeing a fresh clone every frame (ive put off fixing that hack for a while so its nice to finally come around to it). instanced draws no longer store a vector<mat4> per draw call, transforms get appended into one giant staging buffer per frame now. added SubmitPersistent for things that already own a long-lived buffer (like the map tile renderer) to skip the copy entirely. swapped a bunch of unordered_map s for flat vectors in the texture/VAO/uniform caches for a handful of items, linear scan beats hashing. batched rendering also caches the last bound texture & color uniform so b2b batches sharing a texture dont rebind needlessly. added a zero-size window safeguard for Wayland so it stops wrecking the renderer when the window briefly reports 0x0 during resize (also turned vsync back on, weird syscall spam otherwise) assets & packaging added VFS::ReadVirtualView to hand out string_view s directly into memory instead of owned strings for packaged builds, ContainerReader now mmap s the .obpak file directly, uncompressed stuff (textures, uncompiled maps) gets handed right to the parser without a copy. also now move only, with a destructor that unmaps memory instead of holding a copied vector of chars scripting the script hot-reloader was doing a stat() syscall on every script file every frame . oops. now polls every 300 frames & caches resolved paths.. thought i already debounced this.. guess not.. the on_update & on_destroy work buckets used to be freshly allocated vectors every frame… now static , so they just clear & reuse capacity editor & ui finally ripped out the old in game debug UI ( GameUI.cpp ), it had fallen out of sync with the ECS anyway (used it for debug visuals while implementing the first version of the ecs.. then forgot about it) the editors inspector does all of this better now, so replaced it with a minimal FPS counter audio & map audio engine now sets an explicit period size (2048 frames) via miniaudio to cut IPC roundtrips to the audio daemon.. (this one was annoying to figure out.. god bless strace & gdb) the map’s visible transforms buffer is now double buffered, rebuilds write to the back buffer while the render thread reads the front, no race conditions. also swapped typeMats from an unordered_map to a flat vector nothing user facing changed this time, but frame pacing feels noticeably smoother (somewhat suprised), & the packaged build starts noticeably faster i know it could probably be a lot better, but im still a bit of a noob at C++, so this is one hell of a learning project
GPU Lighting & Graphics Settings been doing a bit of rendering work again… mostly trying to optimize things. the biggest change is that I completely rewrote the lighting system previously all the point light calculations were happening on the CPU, and after doing some profiling (and spending way too long staring at compiler generated assembly annotations) it became pretty obvious that this was one of the bigger performance bottlenecks (well THE biggest excluding driver overhead) lighting now runs entirely on the GPU through shaders instead changes lighting rewrote the lighting system. lighting is now shader-based and runs on the GPU removed the old CPU-side lighting calculations moved engine shaders (like the base shader and lighting shader) into built-in InternalShaders (hardcoded string literals, it might seem messy but i prefer it like that) the internal shader change mostly exists because they’re pretty fundamental to the renderer. if they were treated like normal project assets and someone accidentally deleted them… well… suddenly nothing renders (unless they had setup their own shaders, which is fully supported!) and lighting completely falls over, also i prefer it to loading them from the filesystem anyways overall I’m pretty happy with how the new lighting system turned out graphics settings also started working on configurable graphics settings instead of baking them into the project, the engine now loads graphics settings from a separate JSON file. this doesn’t get packed into the .obpak , so users can tweak their graphics settings after exporting a game currently supports: resolution fullscreen MSAA (toggle + sample count) target FPS VSync it’s weirdly fun actually being back in OpenGL code again instead of just working with engine abstractions sometimes it’s nice to get back into the weeds.. even if its.. painfull :D
the OpenGL State Machine Strikes Back… I spent the entire day trapped in hell: debugging a corrupted OpenGL state… it may not show up as tracked hours.. since most of it was just staring at various forms of text.. but it was painful. problem so since i turned the lightmap to run on gpu .. well… Whenever I transitioned from the editor ( MapEditState ) into Play mode, the map would turn into like a bunch of weird diamonds, and the corruption would persist indefinitely until I remounted the current project. because it only happened on state transition, i spent hours chasing ghosts in my state management code and scene cleanup routines… (in the end though i did make some changes to the cleanup routines, but between states rather than scenes.. so i guess i was halfway there?) the culprit It was the lighting pass… took me forever to figure it out, but i had the genius and definitely NOT a very late and obvious idea i shouldve had hours ago , to see if the issue happened when i turned off the lighting system. so i put some early returns in my lighting system functions and.. it didnt corrupt.. inside LightingSystem::Update() , the renderer was modifying global OpenGL state changing depth functions, blending modes, and texture bindings, but not restoring them to their original defaults properly When the engine swapped states, the next frame inherited this dirty, half configured state, causing the whole thing to become a mess. the fix I went through the lighting system and made sure the state changes are wrapped and properly restored through the render thread.. LightingSystem.h : Full GL state save/restore around the light pass. now explicitly backing up and restoring the FBO, program, VAO, blend state, draw buffers, clear color, viewport, and active texture. MapEditState.cpp : OnExit() now properly nulls out m_MapComp and m_CurrentGrid . OnEnter() and will refetch them from the current registry so it isnt holding onto outdated references. EditorLayer.cpp : Added a call to renderer->Clean() after state transfers to clear out stale VAO and mesh caches.(bc its multithreaded things go kinda weird but.. it works now) glad thats over with :D Also heres a fun peek of what ObSL can do with EngineLib, yes, it can make your entire map look like hell..! i am totally not going insane
Editor QoL, Graphics Configs & Prefabs new devlog… mostly been focusing on editor ui and qol changes this time around. kinda tired of hardcoded settings for the graphics settings, so i finally built a proper interface for it, plus some prefab management stuff in the editor changes graphics settings i built a dedicated graphics configurator window in the window, for the current project ( GraphicsConfigEditor ). it hooks directly into the UndoManager using the command pattern ( GraphicsConfigUpdateCommand ) serializes everything out to graphics.json . added QuerySupportedSampleCounts which asks the active GL context ( before it gets handed to the render thread ) what MSAA sample counts it supports. the editor now dynamically generates the dropdown and snaps to a valid sample count (i.e 1, 2, 4, 8, 16). prefab management the editor now supports prefab management that i implemented earlier .. instead of directly writing it in the scene json file you can spawn entities directly into the scene from prefab json files you can revert a prefab, which wipes any local overrides and resets the entity back to whatever is saved in the file you can break a prefab, severing the link to the json file and turning it into a normal, standalone entity in the registry ui & editor cleanup spent some time making the editor less annoying.. in general the editor layout stops resetting itself , it now checks if imgui.ini exists on startup, and if it does, it skips rebuilding the default dockspace ripped the hardcoded hub drawing code out of the EditorLayer and made it its own state for the editor state machine refactored the config windows ( ProjectConfigEditor , SceneConfigEditor , and the new GraphicsConfigEditor ) to inherit from a base ConfigEditor class so its cleaner and easier to maintain.. fixed the script widget since the ui was kinda messy
Particles! :) Ive started working on a particle system. i have got the core pieces in place and it seems to be working nicely so far…. changes particles implemented the foundations of the particle system currently has: ParticleEmitterComponent ParticleSystem ParticlePool emitters currently support: configurable particle limits and emission rates randomized lifetimes and velocities “gravity” size over lifetime color over lifetime world space simulation materials obviously so far it’s all behaving pretty well… EngineLib next up is getting particles exposed through the EngineLib API so scripts can spawn and control emitter components we will see how it goes…
mostly just spent some time going through some old code.. nothing really important, but i’ve also replaced the placeholder assets.. with my own placeholder assets that i drew in GIMP, considering i probably do not have the rights at all to distribute the previous assets.. :)
More Particle work… been spending some time on the particle system… changes particles expanded the particle system quite a bit. currently supports: randomized size ranges randomized rotation configurable emitter shapes (support quad, circle, and soft circle) alpha and additive blending configurable render order (still kinda broken but im working on it) per-particle color over lifetime particle presets that can be saved and loaded (as JSON) also added an editor preview mode, so particles can be previewed while editing instead of only showing up in play mode renderer had to do a bit of renderer work to support all of this particles now use their own dedicated shader added support for per-instance colors during instanced rendering added an overlay render pass for effects that should render on top of the scene cleanup also did a some more project cleanup, splitting up my Utils header into multiple files.. nothing special though misc particle emitters can now be saved as reusable presets (some which will be shipped as defaults ofc) as suggested by @sol4r_on_hackclub cleaned up a few asset importing edge cases fixed a couple of packaging issues too I’m pretty happy with how the particle system is coming along :D
UI Experiments since working on the particle system, I feel like it’s in a pretty good place for the current scope. I don’t really know what else I want to add to it right now, so I decided to finally start on something that’s been sitting in the back of my mind for a long time… a proper UI system. changes particles mostly just spent some time testing and polishing the particle system to make sure everything behaves properly I’m pretty happy with where it’s at for now UI started prototyping a custom UI system it’s very early, but I’ve got the basic rendering pipeline up and running currently working on: a UIElement system a dedicated UI renderer text rendering font loading using FreeType right now it’s mostly just enough to prove everything works, but it’s the foundation for the runtime UI system ive wanted for a long time the goal is for games made in the editor to be able to have their own UI, with everything exposed through EngineLib so scripts can create and interact with UI elements as well honestly, for now.. I was expecting it to go alot worse.. FreeType isn’t as bad as it seems once you get it working with GL The screenshot below dosent show much, but you can see the rendering of Text and rects, it also supports textured rects (which is what the text is currently using to render from a texture atlas)
game UI Progress been continuing work on the UI system. changes UI made some good progress UI system currently have: font importing working texture support for UI elements basic text rendering a simple editor view panel for UI it’s still very much WIP editor right now it’s pretty basic, but it’s enough to start experimenting with how creating and editing UI might actually work inside the editor there’s still a lot left to do before I’d call it usable, but im making progress.. getting text working is painfull, and still unfinished.. but im workin on it…
more ui ive been kinda sick so i aint really had the motivation to do a lot but ive been working more on the UI system im kinda tired so i dont really feel like writing more for now -.-
Scripted UI, Map Workflow, & a Bunch of Bug Fixes alot of bug hunting… changes scripting & ui scripts can now actually interact with the UI system. added bindings for things like: creating UI buttons, text, rects, and images finding UI elements destroying UI elements these return wrapped objects with basic getters/setters for position, visibility, and button state map workflow spent a fair bit of time cleaning up the map editor flow. maps no longer get a fake default path on creation switching to the Map Editor tab now auto-creates a map (empty) if there isn’t one yet mapFilePath now stays project dir relative instead of randomly becoming absolute tile materials are now shared properly instead of silently duplicating state rendering & lifetime bugs i’ve been doing alot of testing recently, so i found alot of bugs… this was probably the biggest pain point. renderer submissions now keep materials and meshes alive for the frame instead of trusting the caller replaced the old Shader::Default() singleton hack with a real fallback shader (internalshaders base) fixed the lightmap quad so it keeps its own VAO and clears correctly when there are no lights fixed a Texture move bug that was double-deleting GL handles sometimes editor polish also cleaned up a bunch of editor behavior while I was in there. Ctrl+S now behaves correctly depending on whether editing a scene or a map scene loading now rebinds editor panels properly save/load dialogs now append file extensions automatically added more inline warnings in the inspector and panels (i.e if an entity has no material it will tell you it wont render) and ive probably forgotten something else … in summary ive just been testing out some UI/UX changed and hunting down bugs untill I feel it is ready to maybe start prearing some sort of demo :)
Entity Hierarchy & Scripting Integration finally caved & added actual parent/child relationships to entities changes entity hierarchy entities can now have a parent & children via a new RelationshipComponent . Registry::Reparent() handles moving an entity under a new parent, with cycle & self-parenting protection so you cant do anything silly like parenting an entity to its own descendant. TransformComponent now has a worldTransform alongside the existing local one, a new HierarchySystem systems that care about actual position (i.e AISystem ) read worldTransform now instead of assuming local == world. destroying an entity recursively destroys its children too & unlinks it from its parent’s child list scene serialization now saves & restores the hierarchy editor the Registry panel is a proper collapsible tree now instead of a flat list drag & drop reparenting, plus a right click menu for “Create Child”, “Detach”, & “Set Parent”. scripting pulled all the entity/component script bindings out into their own EngineLibRegistry.cpp module, they were kind of scattered around before & this makes them way easier to find & extend. scripts can now walk the hierarchy too (get children, etc), same module. added SetFont / GetFont bindings so scripts can assign or query a button’s font, small thing but script generated buttons wont have visible text without it :) misc cleanup small modernization stuff while i was in these files anyway: dropped redundant ternary parens, swapped a bunch of auto x = ...; if (x) into if-with-initializer, dropped some unnecessary global qualifiers, const-correctness fixes on UISystem::Update & UIRenderer::Flush . (yes i know the gizmos are offset and buggy, i kind of forgot to update the gizmo code after changing transforms :p )
working in a windows vm trying to get it to compile on windows… it is obviously going great… -.-
Windows Build The Windows build seems to be working.. I don’t have proper OpenGL passthrough in my VM… However, the Windows executable compiles perfectly in the VM and is running fine under Wine. so I consider that a win for now…
Bugs bugs bugs… I’ve been working on a demo project to both test the engine properly (looking for bugs and all), and also have something to actually show off made in my engine… this is the project you’ve been seeing in the last couple logs btw :) of course… since I’ve been using the editor for actual “work”, I have found a bunch of bugs. the biggest one being the entity ID situation… or.. disaster? changes the entity ID mess in the past, out of laziness… entity ID 0 was being used as both a real, valid entity handle and the “no entity / invalid” value depending on where you looked. which worked fine… mostly because of pure luck. the annoying part was that after working on this for a while I wasn’t even sure anymore if I was using 0 , -1 , or something else for invalid entities.. yep.. so I finally cleaned it up there is now a proper INVALID_ENTITY_ID constant, and entity index 0 is reserved for invalid entities. real entities now start from 1 . went through and replaced a bunch of random == 0 / != 0 checks across ECS, serialization, prefab handling, editor panels, and scripting bindings. project templates added support for multiple project templates. new project creation now scans the Templates/ folder instead of everything being hardcoded to “Default”. currently has: DemoProject Empty the demo project is mostly there to show off the newer UI/scripting stuff (the same demo as mentioned before), while Empty is just a completely blank scene. hierarchy & transforms fixed entity and UI reparenting. previously moving something to a new parent could randomly change its position because it was just applying the new local transform now reparenting keeps the world transform, so dragging things around in the hierarchy behaves properly UI & text rendering fixed a bunch of UI text issues. text now centers vertically using actual glyph metrics instead of a random offset I was “pretty sure” was correct it was not, in fact, correct button text now scales to fit inside the button fonts can now load directly from VFS memory instead of requiring a real filesystem path the VFS font loading one was something I completely forgot about when testing outside packaged projects… oops. packaging implemented .pakignore instead of a hardcoded ignore list, the packer now supports gitignore-style patterns in a .pakignore file and properly skips ignored folders/files also fixed a few smaller packaging issues while testing exported projects. misc a bunch of smaller things: map save/load dialogs now default to the project maps folder fixed scene switching bindings in editor play mode fixed a lightmap redraw bug font importer now only accepts .ttf / .otf added a small README with build instructions since im planning on publishing the repo soon (and writing all the docs… scary..) nothing super flashy this time.. but important
the repo is public been working on gettin things ready for that, mostly writing some docs and getting GitHub Actions set up so I can build and release cross-platform builds also did some small code cleanup / fixes while I was going through everything. changes github actions i setup a workflow to compile the project on linux, windows, and mac, and then publish a release (mac is untested but compiles). im real happy though that its actually compiling on all “major” platforms though docs finally wrote some actual documentation… there are a few files in the docs/ folder now and a proper README still a WIP obviously, but at least there’s something there… misc implemented create new map button i forgot about completely repo there is already a build published as a test of the github actions thingy, try it out if you want :D https://github.com/torkelicious/obliberry
Lighting Fixes been fixing a few small things with the lighting system mainly fixed lights using the wrong entity transform I forgot to account for entity parenting when I implemented that… also added a per-scene toggle for enabling/disabling the lighting system
scripts can schedule stuff for later Added SetTimeout to the scripting API changes SetTimeout SetTimeout(fn, ms) calls fn() after ms milliseconds. simple to call from obsl timers live in a plain std::vector<Timer> in a new Platform::Time namespace, polled once a frame from Scene::Update no threads, no async bs or whatever :) the callback itself is a SmallTask , which falls back to a heap allocation if the closure is too big to fit inline fine for this since timeouts aren’t really a hot path timeout callback fires from an arbitrary point in Update , so it gets its own ScriptCommandBuffer set up on the worker just for the duration of the call, then flushed right after also gc.add_root / remove_root the function around the callback so it doesn’t get collected while it’s sitting in the timer list waiting to fire Documented it in the api reference alongside the other Time functions also tiny UI tweak in the tile editor: it now warns “no tile types defined, no map will be visible!” instead of just “no tile types defined” was seeing people get confused about why a new map looked empty after trying to paint also small updates to docs in general and stuff but nothing super interesting
…the default imgui theme first off, huge thanks for all the incredibly kind reviews on my last ship !!! most of this work was also inspired by someone pointing out that i was still using the default imgui theme. fairs… so i spent some time making the editor actually customizable and messing around with having some kinda-nice defaults :) editor ui & theming live theme editor: built a proper window to tweak colors, spacing, padding, rounding, etc. in real-time. semantic palettes: added a semantic color system so you can build out a theme from a small set of base colors, rather than manually adjusting every single internal imgui color enum (though you can still override individual colors if you need to). serialization: themes dump straight out to a theme.json sitting right next to the editor executable. undo/redo: the theme adjustments go through the undo/redo system! help menu: put in a placeholder help menu. turns out literally nobody likes reading docs, so i guess i gotta start explaining how to use the engine from inside the engine… not implemented yet though editor groundwork did a bit of backend cleanup as well. added an EditorContext for editor-specific state, separate from the runtime EngineContext (currently just used for theme stuff) started working on editor font support with a FontSet for things like Body, Bold, Monospace, and Icons, not implemented though the font stuff is mostly groundwork for now, but the theming system is actually working and makes the editor feel nice :D
fighting with fonts font-management rabbit hole in the theme editor… still wip changes font management in the theme editor the theme editor now has a proper Fonts section import .ttf / .otf fonts directly from the editor assign fonts to roles like Body, Bold, Monospace, Icons, etc. merge fonts together so icon fonts can be stacked on top of regular fonts rename, delete, and change the size of fonts fontsets are now saved as part of the theme, so imported fonts persist across restarts the role system isn’t fully wired up yet currently Body is used as the default editor font and Monospace is used for the console. im still working on the whole font management system here and its very unfinished and kinda untested.. very WIP!!! hot-reloading the annoying part was getting font changes to work while the renderer is running on another thread. rebuilding the ImGui font atlas in the middle of a frame was… not ideal, and eventually resulted in an assertion. now font changes mark the atlas as dirty, and the editor waits for the render thread to finish before rebuilding the atlas at a safe point. not the prettiest solution, but it seems to be working.. kind of dpi & freetype also experimented with DPI handling for fonts and wrapped FreeType into a single shared instance instead of creating separate instances everywhere. still figuring out exactly how I want the DPI/font sizing stuff to behave, but it’s getting there. bug fixes while doing all of this I also ended up fixing a few unrelated things: fixed an old GUI rendering bug where text could stop rendering or become garbled because of a pointer race thanks to @staneko for helping test/report that one since I couldn’t reproduce it properly on my system fixed a weird compilation issue related to namespace escaping bumped the vendored ImGui version for some dynamic font-related fixes a few other small UI changes and cleanup still working on this, and the font management side definitely isn’t finished yet… most of this time was just spent trying to get it to half-work so.. yep..
mostly ui stuff (and fighting windows wide chars) yay pretty ui editor ui theming ui blah blah idk what to call it kinda cleaned up some stuff into proper members so the ui state doesn’t get all weird and persistent when you close the theme window discarding changes: actually works now. closing the window used to revert colors but keep your staged font changes, which was dumb (didnt really cause issues since changes werent applied anyways unless you saved beforehand but still.) font role indicators: added a little visual thingamabob where the font list now shows a star next to whatever font is actively set as the body font (also font name is now rendered in its proper font) path tooltips: added a hover tooltip on the font list items that shows the full file path of the font also some placeholder stuff in the code for searching the customization menu i might be implementing soon windows compat std::filesystem::path everything: went through and switched out the raw std::string usage for font paths inside FontConfig , replacing them with std::filesystem::path . this was purely because my windows ci build was failing. i was passing raw char strings around and doing weird string conversions, which completely blows up on windows because it expects wide chars for paths and i didnt consider that when i was being lazy and doing silly conversions and stuff because i just wanted to pass ez pz to a c library. freetype & serialization cleanup: updated all the internal freetype helper functions ( GetFontName , etc.) and the json theme serializer to play nice with the new paths instead of passing raw char pointers kinda mostly just making it a lil more prettier
scrips can change things on the map yippie changes scripting scripts can now modify maps through EngineLib added: Map_SetHexWalkable Map_SetTileType yes, i made sure changes to walkability properly update the map’s pathfinding data instead of leaving it with stale information… sanitizers added sanitizer builds…. got ASan + UBSan working through CMake, along with presets for testing… it has helped already :) timers SetTimeout : if a script created a timer and then the scene changed before it fired, the callback could still run against the old scene state. timers now use generations, so changing/reloading a scene invalidates any timers belonging to the previous scene. editor fixed another map editor bug where discarding unsaved changes didn’t actually discard them… it would clear the dirty state but leave the edited map in memory… i knew about this bug and fix for a while, but i kept on forgetting about it… but its finally done -.- also added an Edit button to script entries in the project browser so scripts can be opened directly (launches default app it detects for the file via ur os)
more docs… and some bug fixes some small bugs that have been annoying me for a while finally got fixed… and I wrote more docs than I probably needed to…? or maybe too litte.. who knows changes entity selection actually clears now fixed an issue where clicking empty space in the viewport wouldn’t reliably clear the current selection. the pick-result handling was structured wrong, so the “nothing was selected” case basically never got handled properly. also explicitly clear the entity ID framebuffer attachment every frame so it doesn’t leave stale IDs around from previous frames. i knew this was broken, and figured the fix would be pretty simple for a while.. but i just kinda forgot to fix it.. oops…. fixed parent transforms during scene loading fixed a bug with parented entities getting their transforms messed up when loading a scene. the issue was that scene loading was using the same Reparent() logic as interactive editor reparenting. that function intentionally recalculates the local transform to preserve world position, which is what you don’t want when loading a transform that’s already been serialized correctly… was eepy when writing that i guess added Registry::SetParentDirect() for scene loading, which just sets up the parent/child relationship without touching the transforms. interactive reparenting still uses the old behaviour, so dragging entities around in the hierarchy still preserves their world position misc cleaned out some old commented-out code docs, docs, docs also wrote proper editor documentation section covering things like: editor concepts usage scenes prefabs components and some even have screenshots.. yes i know.. fancy the help button in the editor links to some of these pages now. i guess “figure it out yourself” wasn’t really an acceptable documentation strategy anymore…. i mean i had some docs.. but they weren’t that good for editor-usage and more technical stuff.. so yep.. also made the README headers slightly more obvious because people were still asking where the download link was ….
persistent Entities been working on persistent entities via a tag.. the same idea as Unity’s DontDestroyOnLoad, except you mark entities as persistent in the editor instead of doing it through scripts (scripts can do it too though). everything keeps breaking or half-working help.
persistent entities… again kinda scrapped most of the first attempt at persistent entities and decided to redo it instead of setting persistence in the editor, I went with something closer to Unity’s DontDestroyOnLoad , where scripts explicitly mark entities as persistent. makes more sense and is a lot less weird around scene changes. (i.e this.SetPersistent(true); ) changes scripting added: entity.SetPersistent(true) entity.IsPersistent() persistence persistent entities are tagged before the scene unloads, serialized normally, then re-injected and reparented when the new scene loads. the persistence tag itself isn’t serialized, so it won’t accidentally end up saved into the scene dedup added some basic deduplication so persistent entities don’t get duplicated if the new scene already contains an entity with the same name. its name based for now… not very great, but good enough
mostly windows fixes changes SetLightmap took a raw Lightmap* and just held onto it for the frame swapped it for a small value type the renderer copies out immediately instead… this sometimes caused crashes but seemingly only on windows?.. just my luck.. LightingSystem had the same issue, was writing back into ECS memory through a raw pointer from a GL init task. now creates the framebuffer/vao up front and just calls Invalidate() on them SubmitPersistent was also holding a raw pointer into caller-owned memory, now copies into the staging buffer like everything else does RenderBatch used to just silently not draw anything if a batch went over MAX_INSTANCES . now it chunks into multiple draw calls instead of dropping the whole thing InvalidateGLCache wasn’t resetting the dynamic instance buffers, only the VAO cache, so they could point at dead GL objects after a context loss actual windows fixes opening files tries to open via already existing file associationg, otherwise falls back to the “open with” dialog if there’s no default handler also the paths get normalized to backslashes now asset import for scripts and so just does a file copy now instead of going through the old import path
code cleanup & optimization currently going through a bunch of older code and fixing / optimizing things. prolly way too much to actually write about, and most of it is just boring small changes, bug fixes, and a lil cleanup big pr i guess soon idk
hardening + performance stuff so this is kinda the continuation of the last log(s) where i was going through some old code kinda boooring but its important performance mainly been trying to get rid of unnecessary allocations and full scans stuff optimized ECS entity/component lookups and removal reworked hierarchy propagation to avoid unnecessary registry scans reduced allocations in scripting and UI command buffers cached script wrappers so they can be reused instead of constantly recreated improved UI lookups with a proper name index made particle/lightmap updates only rebuild when actually needed cached project browser directory scans capped the editor console and added clipping for large logs also did a bunch of smaller optimizations around scripting task scheduling and resource loading things thread safety went through a lot of the cross-thread stuff as well made ResourceManager access properly synchronized experimenting with the audio locking guarded FreeType access made window size and pending scene state thread-safe fixed some render thread / GL context handling basically trying to make all the multithreading stuff a little less “it seems to work” type stuff though alot of this probably wasnt actually causing any issues YET , it would be very hard to debug in the future if I didn’t try to fix it now so yeahh correctness fixed several out-of-bounds issues in VFS/package parsing made VFS path resolution properly stay inside the VFS root (oops…) fixed hierarchy reparenting allowing cycles fixed a few dangling references in hierarchy code fixed some component pool and packaged asset lifetime issues undo history now clears when loading a scene cleaned up a few map editor edge cases fixed text centering fixed the triangle mesh made engine context non copyable also updated the demo template while I was at it (since a recent movementcomponent update it wasnt behaving properly due to the addition of a new field) there are other small things i probably didn’t mention here too but it’s mostly all a collection of a bunch of small things im still testing this though and looking into a few other small things…..
ui editing gizmos!!!1 you can finally drag UI elements around in the editor (instead of typing position/scale values into the inspector) changes ui gizmo added a proper UI gizmo with resize handles and dragging support and that corners resize both axes, edges resize one axis dragging the body moves the element resizing from the top/left keeps the opposite edge anchored added a small drag deadzone so clicking doesn’t accidentally create an undo step UI transforms now go through TransformUIElementCommand , so they’re undo/redo -able also renamed the existing entity gizmo code and naming gets confusing otherwise… coordinate stuff the gizmo needed mouse coordinates relative to the viewport rather than the whole window, so added some better viewport coordinate handling for that… maybe a lil late ui editing mode buttons won’t randomly enter their hover/pressed states just because your mouse is sitting over them now in the editor beccause its a lil annoying when editing small optimization also fixed UIText and UIButton recalculating their text layout every frame when nothing changes feels nice :)
custom meshes im trynna make it so you can draw your own custom 2d meshes in the editor its still a lil buggy but it’s mostly working, serializes and all that :) very fun…
experimenting with post processing working on a lil post-processing pipeline still very wip but im mostly just playing around with various shaders and stuff changes the pipeline PostProcessor is a simple “ping-pong” chain: scene renders to an off-screen FrameBuffer , then each enabled effect runs full-screen-triangle shaders bouncing between two ping-pong buffers, in whatever order they were added I’m working on a system via variants to get uniforms to be easily serializable and such, it seems to be working but I havent actually wired it into anything just yet. editor and runtime a lil bigger change than expected. i implemented a unified fbo for both editor/runtime rather than the weird jank i was doing before editor: scene renders into m_SceneFrameBuffer , post effects run, then it gets sent into the ImGui viewport image like before runtime: same scene framebuffer, same post effects, then PresentToScreen goes to the default framebuffer instead just some general cleanup for that ig crt shader i wrote a lil silly CRT looking shader to test it out as shown below, it’s cool but kind of useless, but very fun to play with!!!
more post processing!!!! this took way longer than i thought it would but uh whateveer. i think i still gotta fix some small things but its working pretty alright :D editor ui added a proper ui for post processing :) threw in an import button and stuff so you can load in fragment shaders as post proc fx you can edit the uniforms directly in the ui now stuff glsl uniform parser: wrote a very simple basic glsl uniforms parser. this is what makes the ui editing possible, but it also helps a ton with serialization so i don’t have to hardcode everything serialization: implemented saving and loading for post processing effects and also made post processing effects bound per-scene instead of being a global engine thing yay post processing funny effects shaders aaaaaaaah
shader preprocessing been working on a small shader preprocessor thing while also finishing up the final bits of post-processing right now the preprocessor is pretty simple, mostly just adding support for: #include #pragma once I haven’t actually needed it yet, I just kinda had the urge to make it… so now I have a shader preprocessor …? its pretty extendable and all though so usefull to have ig :)
too many post proc fx? followup to the post processing / shader experiments… changes shader includes shaders can #include "rand.glsl" etc and it resolves properly. it checks the project VFS first, then falls back to the engine’s own shader helper directory if it isn’t found there. engine shader helpers also get packaged into exported games under engine/shaders/ , so includes keep working at runtime. added a few helper include files: rand.glsl / auto_rand.glsl - seeded hash-based random, with auto_rand reseeding per frame from u_Time color.glsl - HSV conversion, lift/gamma/gain, contrast, saturation, and three-way color wheels commons.glsl - engine-provided uniform declarations so you don’t have to redeclare u_Resolution , etc. in every shader for engine-provided uniforms the helpers use #ifndef / #define guards, so auto_rand.glsl can include rand.glsl without causing double declarations if the effect shader or another include declare the same uniforms or includes. more built-in effects added a few more built-in post processing effects: ColorGrading - exposure, contrast + pivot, saturation, lift/gamma/gain, and shadow/midtone/highlight color wheels using color.glsl FilmGrain - chunky per-cell grain with u_GrainSize controlling the cell size Vingette - yes i know its mispelled. uniforms with Wheel in the name now get the wheel-style color picker instead of the regular color picker, since a normal RGB slider cleaned up effect registration used to have two separate lists, one for raw shader registration and one for the default effect chain. this meant adding an effect involved touching two different structs in two different places. merged those into one PPRegistration list with an inDefaultChain flag shader debug name added an actual m_DebugName field and made error messages / the material inspector fall back to it when there isn’t a real file path. docs wrote up some post-processing editor docs ….. i hate writing docs.. also .shader is now a valid extension for importing custom effect shaders, alongside .frag / .glsl trimmed down the miniaudio CMake config by disabling its examples, tests, and tools, along with Vorbis/Opus/FLAC support since i’m not using any of that….
sllight hub overhaul redid the project hub screen and added recent projects tracking, since up to now opening anything meant going through a file dialog every single time… changes recent projects get tracked in a PROJECTHIST file (next to the editor executable) …dead simple format, one filepath per line, each pointing at a project’s .json . capped at 5 entries, oldest just get removed off the list. hub screen is basically remade two docked panels now instead of one. left panel is the same buttons as before (new project, open project, etc), right panel is the new recent-projects list, up to 5 entries since that’s all the history file holds. also removed some unused dead code i found… QoL type stuff i guess :D
copy paste (kinda) also too much time fighting windows builds tried to get entity copy/paste working and it’s… janky. also ended up wasting a stupid amount of time just getting windows builds to actually build again because i lowk forgot again about how it wont let me pass paths as strings implictly as it does on every other damn os… changes copy/paste (wip, kinda broken) started on ctrl+c/ctrl+v for entities & ui in the editor it kinda works but is really janky and does not feel good to use, also tried implementing it in the context menu but its not workiong at all -.- other the windows fixes…. some resharper reccomendation inspection type shi but lowk its been a while since i logged soo yep
collision stuff been working on a collider system. still pretty early and not hooked into EngineLib yet, but most of the basic backend + editor stuff is there planning to expose it to scripts in a similar way to how Unity handles collision callbacks / triggers, but that’s for later……. collision added a new ColliderComponent with: box and circle colliders offsets size / radius trigger support collision system currently handles: box vs box circle vs circle box vs circle collision normals + penetration depth ‘trigger’ collisions also added a CollisionWorld that keeps track of collisions between frames and generates Enter , Stay , and Exit events. mostly groundwork for when I hook this into EngineLib… collider editing colliders are editable from the editor theres a collider inspector widget for changing the shape, offset, size/radius, and whether it’s a trigger, plus a viewport gizmo for directly moving and resizing them collider edits also go through the undo system, because every new editor feature needs to become an undo/redo problem eventually……… :D other editor fixes entity copy/paste now copies the whole child hierarchy instead of only the selected entity pasted hierarchies keep their parent relationships added copy/paste to the entity and UI context menus fixed stale entity / UI selections after the thing being selected gets deleted fixed single-key shortcuts like V , T , R , etc. firing while Ctrl/Alt/Shift was held keyboard camera movement no longer fights with Ctrl/Alt shortcuts a few smaller include / cleanup things mostly collision work though. next step is probably getting the collision events into EngineLib and experimentiung w. it its still a bit jank of course but it works i guess :DDDDD
collision system round 2 i guess ended up pretty much reworking most of the collision system….. the first version was still basically 2D, with separate box vs box / circle vs circle / box vs circle functions. that worked as a starting point, but it was gonna get annoying … so… it is 3D now. colliders ColliderComponent now supports: boxes spheres cylinders 3D offsets / dimensions triggers entity-space or billboard orientation billboard colliders follow the same camera-facing basis as billboard rendering, which means billboard sprites can still have colliders that actually line up with how they appear on screen. GJK got rid of all the individual boxVBox , boxVCircle , etc. collision functions and replaced them with support-mapped collision detection using GJK. each collider shape just provides a support point now, the intersection test doesn’t care what combination of shapes it’s checking. i dont fully understand the math completely yet.. but it kinda makes sense :D still no collision response / physics yet. this is just detection + events, i think ill prolly get it into EngineLib.. soon… events the CollisionWorld still tracks collisions between frames and generates: Enter Stay Exit trigger state is kept with the collision too. this is for EngineLib integration. scripts should be able to react to collisions / triggers like unity I have not gotten around to this yet though… collider gizmos also had to redo the collider gizmos now that colliders aren’t just flat 2D shapes anymore… its a lil janky but it works.. billboard cleanup while doing the billboard collider stuff I also cleaned up billboard rendering a bit billboards used to have their world transform temporarily modified by SpriteBillboardSystem before rendering. now the billboard matrix is generated when the entity is submitted to the renderer instead, so the actual ECS transform can stay as the real entity transform there’s now one shared billboard matrix helper used by both rendering and collision, which is considerably less cursed. um scripting integration next i guess.. if something dosent explode ! :D
collision callbacks scripts can do collision things now….!!! script collision callbacks ObSL scripts can now define collision hooks: on_collision_enter(other) on_collision_stay(other) on_collision_exit(other) on_trigger_enter(other) on_trigger_stay(other) on_trigger_exit(other) the other argument is a normal EngineLib entity wrapper, scripts can do stuff like check its name, components, etc. collision events get collected by the CollisionWorld , then dispatched to the relevant script instances afterwards. they’re also run through the existing script command buffer ofc 2D collider shapes are back too… added explicit 2D shapes alongside the 3D ones: Rectangle Circle so the full set is now: Box Sphere Cylinder Rectangle Circle rectangle / circle are flat shapes. which is nicer for sprites and other 2d things movement actually respects colliders hex movement now checks whether an entity can actually occupy its next tile before moving there. added a CanOccupy() collision query which builds the entity’s collider at the target position, it blocks the move if something solid is in the way. triggers don’t block movement. collision robustness stuff also did a bunch of smaller fixes around the collision added a shared collision tolerance instead of random 1e-6 s in different places AABB overlap now uses that tolerance too improved collider validation depending on the actual shape fixed gizmo world-to-local conversion to use the proper inverse transform more finite-value / clipping checks in the collider gizmo GJK Indeterminate results preserve the previous collision state instead of automatically counting as a collision p.s, heres a lil photo of my attempt at making syntax highlighting for obsl using textmate grammar… :D
spritesheets / animation finally … spritesheet support spritesheets added a new SpriteSheetComponent with: texture rows / columns optional row + column spacing start frame animation length FPS looping playing / paused state current frame basically the renderer can now render only a specific UV region of a texture animation also added a small sprite animation system that advances frames based on FPS and handles looping / stopping at the end etc etc animations also update while in the editor… might be annoying for some, might be less annoying for others.. but thats how i like it editor stuff you can pick the texture, set rows / columns and spacing, choose the start frame + animation length, change FPS, toggle looping / playback, scrub the current frame, restart the animation, etc. etc EngineLib scripts can inspect stuff like the current frame, frame count, FPS, rows / columns and texture, and can also change the texture/grid/animation, set frames, play, pause, restart and stop animations. Collider also has a proper EngineLib component wrapper instead of collision only being accessible through the callback hooks. right now that’s just getting / setting whether it’s a trigger, but it’s there. also added both Collider and SpriteSheet to the normal GetComponent , AddComponent , RemoveComponent , HasComponent , etc. obviously. some cleanup did a bit of registry / EngineLib locking cleanup while I was in there too, mostly around entity wrappers being created while the registry lock is already held. also fixed one very stupid collision callback typo where on_collision_stay was looking up the wrong hook… oops….. im also starting on documenting this stuff…. yep.. pain… spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly
btw pls star on girhub animation clips / refactoring spritesheets …kinda refactoring the whole spritesheet animation thing already the first version worked, but having FPS / looping / frame ranges etc directly on the SpriteSheetComponent was gonna get pretty limiting cuz what if I wanted multiple animations for one sprite. it might sound stupid but for me it’s always worked to get a prototype working, then refactor/reimplement it. thats even what i did for this entire project early on, before it deleoped into a full on engine :D so now the spritesheet is mostly just the sheet + currently displayed frame, and animation playback is seperate animation clips working on proper animation sets + clips. an animation asset can have one spritesheet and multiple named clips, with each clip containing its own list of frames :D each frame also has its own duration now instead of the whole animation just sharing one FPS value, so stuff like holding a frame longer or doing irregular timing is possible without clips can loop independently too animator component added a separate SpriteAnimatorComponent which handles the actual playback state: animation asset initial clip autoplay current clip current frame inside that clip elapsed time playing state the normal SpriteSheetComponent is way simpler now… it just says what sheet + frame should currently be rendered (the animator updates that for it) animation assets animation sets are assets now under assets/animations/ they serialize separately and contain the spritesheet setup plus all the clips / frames / durations they are loaded through the normal asset system and registered in the ResourceManager scene serialization now keeps the animator config like the selected animation asset, initial clip, and autoplay editor stuff the sprite sheet inspector got reworked for the current thing but whole UI stuff isnt finished once an animator is attached it owns the sheet/frame instead of both systems trying to edit the same thing. I still need a proper UI for actually making / editing animation assets and clips though. i shall work on this next!!! (right now the backend is pretty much all ive done but its taken a lil longer than i thought… who wouldve thought adding cips cleanly would take this whole aah refactor) scripting EngineLib updates too SpriteAnimator in scripts can now do: Play("walk") Restart("walk") Pause() Resume() Stop() IsPlaying() GetClip() it is now based on named clips so i guess not anything flashy to show but… its stuff :)
animation editor continued working on the animation system and made the editor UI…. animation editor there’s now a Sprite Animation Editor you can: choose the spritesheet texture edit rows / columns / spacing create, rename and delete clips toggle looping per clip edit individual frame indices + durations move frames up / down duplicate / remove frames expand / collapse the frame list also added range generation so adding a normal animation doesn’t make you manually enter every frame one by one….. theres also an Apply FPS to All Frames button ! preview added a live preview for the selected clip. you can play, pause and restart it woaw it shows the current clip frame and spritesheet index while it runs…. project browser integration animation assets are properly integrated into the project browser now too there’s an Animations section where you can create, import, edit and delete animation assets creating a new one lets you choose its path then opens it in the animation editor. the animation asset workflow is mostly usable from inside the editor :D erm even more enginelib changes for the new systen that i still have to document… ( Play() Restart() etc) some cleanup working on… some mostly const-correctness, explicit casts, ranges, include cleanup and some other small stuff etc etc.. god bless resharper c++ also cleaned up some EngineLib entity wrapper code around registry locking so it can create wrappers safely when the registry mutex is already held spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly
I will not elaborate
asset system refactor + some editor stuff been wanting to redo how assets work for a while now. until now scenes carried the asset definitions with them, and loading scenes would keep throwing resources into the global resource manager. worked fine enough , but it also meant resources could kinda just accumulate forever.. i seperated them now!! assets.json projects now have a project-wide assets.json catalog. textures, shaders, meshes, materials, fonts, animation sets, etc. live there instead of getting serialized into every single scene. scenes / prefabs / UI / animations etc. just store resource IDs and the definitions live in one place besides making scene files considerably less bloated, this means saving a scene no longer serializes whatever random collection of resources happens to currently exist in the resource manager lazy asset loading having one project-wide catalog does not mean loading the entire project into memory. scene loading now scans for the resources that scene actually references and loads those from the catalog this includes stuff referenced by: entities maps / tile types UI post processing spritesheets / animators dependencies get resolved too so if something needs a material, its shader + texture get pulled in first. animation sets pull in their spritesheet texture, etc. etc. now the the resource manager should only contain what is actually being used asset lifetime stuff added SceneAssetScope for keeping track of what assets a scene has acquired. assets are retained while something needs them and can actually be unloaded once the last scope using them disappears so changing scenes repeatedly should no longer turn the resource manager into yummy more objects :O forever…. persistent entities reacquire the resources they need when moving between scenes too. there’s also handling for catalog entries being replaced / deleted while their old resource is still loaded. those can be marked stale and discarded safely once the old scene lets go of them instead of leaving weird zombie resources around. engine assets still stay around like normal. editor asset workflow the editor now goes through the asset catalog too. creating / importing / replacing / deleting things like: textures shaders meshes materials fonts animation sets updates assets.json instead of depending on scene serialization to preserve them…. supported editor selections / script setters can also acquire catalog assets on demand and attach them to the current scene’s asset scope old projects old projects obviously still have all their assets embedded inside their scene files, so I added an ob_asset_migrator tool. it can scan the old scenes and merge all of those definitions into a project-level assets.json . there’s: dry-run validation conflict detection optional removal of the old scene assets sections backups before it starts rewriting stuff uses backups because i dont trust myself enough .. might vaporize projects who knows… docs docs docs also updated a stupid amount of documentation for the new asset model … since of course.. there’s now a full assets.json format page covering the different asset types, dependencies, lazy loading, asset scopes, editor behavior and migration. updated the scene / prefab / animation / post-processing docs too since all of those previously described assets as being stored directly in scenes. also cleaned up the main README + docs index a bit and updated the feature list because quite a lot of it was outdated at this point…. theme presets also did some work on editor themes. split the built-in theme definitions out and added some interesting presets: Obliberry Dark ImGui Classic Dark Obliberry Light ew imagine using light themes… High Contrast Dark Haxxorman Green editable and all… tldr: resourcemanager is now longer an infintly growing landfill…
save system i wanted this to be pretty generic instead of the engine having some hardcoded idea of what a “player save” or whatever is, so the actual save data is ba sically just key/value storage that scripts can use for whatever they want!!! save data there’s now a SaveGameManager which keeps one active save in memory. save values can currently be: booleans numbers strings the file format is versioned and also stores a display name + created / updated timestamps. the actual save data itself doesn’t really care what the values mean. it is any key value pair that persists. there’s also locking around the active save since scripts can be running across multiple workers….. project UUIDs projects also have their own UUID now. it’s generated when the project is created or when a project that does not already have one is opened right now it’s mainly used to give each project its own save-data directory without name collisions but im sure its good to have outside that!!! save files the basic save file operations too create a new save write the current active save load a save delete a save list existing saves start a fresh unsaved “game” save filenames are generated from timestamps. the human-readable name stays inside the file, display names don’t need to also be valid / unique filenames. save_list() also gives creation + update timestamps, and saves are sorted by most recently updated. writes are atomic too, so it writes through a temporary file before replacing the real save instead of directly nuking the existing one and hoping for the best per-project save directories save data is stored outside the project itself in the normal OS application data home each project gets its own directory based on its UUID <data home>/obliberry/<project uuid>/saves/ projects with the same name don’t fight over the same saves.. (i have several projects just called “UntitledProject” lol) this is LocalAppData on Windows, Application Support on macOS, and XDG_DATA_HOME / ~/.local/share on Linux. both the editor and runtime configure the save manager when the project is loaded, and it gets reset again when the editor closes the project ! ObSL ObSL savedata enginelib intergration: basic data stuff: save_set(key, value) save_get(key) save_has(key) save_remove(key) save_clear() save_new() save file management: save_create(name) save_write() save_load(filename) save_delete(filename) save_list() save_list() returns an array with the filename, display name, creation time and last update time some cleanup also pulled the atomic file writing stuff into a shared OS file utility, so assets.json can use the same code instead of having its own implementation. bunch of formatting stuff too i still have to document this and do some more testingf but yeahhh
uuids, collision layers, save settings, and other stuff bit of a mixed bag this time. mostly cleaning up some systems that were already there and filling in stuff I’d need… entity UUIDs entities have proper UUIDs now, separate from their normal runtime entity IDs. the regular generational ID still does all the normal ECS stuff, while the UUID is a stable identity that gets serialized with the entity. this mostly fixes how persistent entities work between scenes. previously I was deduplicating persistent entities by name , which was obviously not ideal since names aren’t actually identities. persistent entities + their children now keep their UUIDs when moving between scenes, and if the destination already has an entity with the same UUID it gets replaced by the carried-over one. two things can have the exact same name now without persistence randomly deciding they’re the same thing. normal prefab instances / newly created entities still get new UUIDs. collision layers colliders now have proper layers + masks. there are 32 collision layers, and every collider has: a layer a 32-bit mask of layers it accepts both colliders have to accept each other’s layer for the pair to interact. the same filtering is used for normal overlap events and movement blocking, so there isn’t a separate set of collision rules depending on which system happens to be asking. added editor controls for this too, including the layer selector, all 32 mask toggles, and select all / deselect all buttons because clicking 32 checkboxes individually sounds incredibly fun. scripts can also read / change the layer and mask now. collision-aware script movement also added Transform.TryMoveTo(x, y, z) to ObSL. unlike SetPosition , this checks whether the entity can actually occupy the destination before moving it. the normal hex movement system uses the same helper now too, so script-controlled collision-aware movement and normal movement go through the same path. direct SetPosition is still basically teleporting, which is intentional. also fixed on_collision_stay actually looking up the collision stay callback instead of the trigger stay callback. whoops. more save settings did some more work around the save system from the last update. saving can now be enabled / disabled per project, and projects can choose where save files go: Data Home , the normal OS application-data location Portable , relative to the executable both still use the project UUID underneath so different projects don’t start sharing save files because somebody named both of them game . these are editable from Project Settings now. also added a confirmation dialog when regenerating the project UUID since doing that changes which save directory the project looks at. the old saves aren’t deleted, the project just gets a new identity and stops finding them automatically. graphics config stuff changed packaged builds so graphics.json can live beside the executable and override the version inside the package. (i.e if someone decides to unignore the graphics config and package it) couple random fixes particle emitters now keep their actual live particle count, so GetAliveCount() in ObSL finally returns the real value instead of the completely useless placeholder it had before. fixed a prefab revert issue where the code was reading the prefab path from the component after destroying the entity. very intelligent. also made theme font loading a bit less fragile. missing / broken font files get logged and skipped instead of potentially taking the whole theme load down with them, plus some parsing cleanup. and updated another mountain of docs to match all the collision, persistence, save, prefab, post-processing and export changes.
unit tests (& some fixes) uhhhh started adding actual unit tests… i was kinda putting it off but i gotta have it… set up GoogleTest + CTest and started covering some stuff ECS registry / generational IDs entity UUIDs entity serialization hierarchy / parenting collision events + movement blocking save games maps bugs bugs bugs… and unsurprisingly, writing tests immediately started exposing some smaller issues. fixed stale entity handles being able to mess with components belonging to a recycled entity slot, and cleaned up some hierarchy transform / rotation handling that wasn’t preserving transforms correctly in certain parenting cases. also tightened up a couple math helpers while testing them. im still gonna write even more tests.. its very needed at this point and will prolly help me find some more bugs i missed before…
more tests (more bugs) kept going with the unit tests the test suite now covers most of the important stuff, including: ECS / entity IDs / UUIDs serialization + hierarchies collision geometry, events and movement maps animation saves ObSL + some EngineLib bindings assets / asset lifetime VFS + packaged projects configuration editor undo commands also added a couple integration tests for audio and rendering (OpenGL tests are optional) finding things unsurprisingly this found some actual problems too. stale entity handles can no longer remove / access components from an entity that reused the same slot, and editor undo commands are a bit safer around entities or components disappearing. also fixed some hierarchy rotation decomposition weirdness, cleaned up VFS / package mounting state so old package data can’t leak into the next mount, and added a few other small null / cleanup checks around scenes and rendering resources.
export dependencies + prefab asset loading redid how exporting figures out what needs to go into the package previously editor export was basically much closer to just packing the project directory. now it builds a dependency manifest first figuring out what to export export starts from the project + scenes and follows the things they reference: catalog assets used by entities, maps, UI and post processing map files attached ObSL scripts script using imports scenes loaded from scripts prefabs instantiated from scripts music / sound files material textures + shaders animation sheets shader #include s referenced scenes and prefabs get scanned too, dependencies keep chaining from there. it then generates a new filtered assets.json specifically for the package instead of sticking the entire project catalog in there. the actual project’s catalog is untouched. script analysis added a ScriptAssetAnalyzer which walks the ObSL AST without actually running anything. literal stuff can be narrowed down properly, including things like: PlayMusic("assets/audio/music.ogg", 1.0) or even constant string concatenation… asset setters like SetTexture / SetFont get tracked too. if a texture or font ID is dynamic, export keeps that entire asset category. if a runtime file path for stuff like LoadScene , Instantiate , PlayMusic or PlaySound2D can’t be figured out, it falls back to keeping the eligible project files + full asset catalog. unknown / indirect calls are done the same too so simple projects get smaller exports, while weird dynamic scripting should still work… .pakignore still applies, and required files being missing or ignored is now an export error prefab assets also fixed prefabs properly interacting with the lazy asset system. instantiating a prefab now scans its components, acquires whatever catalog assets it needs, resolves their dependencies, and retains them in the scene before creating the entity. so a prefab can use an asset that wasn’t already referenced by the scene and it should just work. scene asset scopes got changed a bit for this too. instead of accumulating a new scope every time something acquires assets, they’re merged into one scene scope and duplicate asset references are ignored. also made prefab revert a little safer so the old entity isn’t destroyed unless the replacement prefab actually instantiated successfully. packaging / ci things editor packaging is stricter in general now. script dependency validation can fail the export, missing dependencies stop it, and PackageCurrentProject reports failure so the rest of the export doesn’t continue pretending everything is fine. shader includes are followed during dependency collection too, while the engine shader helpers still get bundled for runtime includes. also cleaned up CI a decent bit… also some more tests too for the packaging and script analysis lowk sorry for just posting an image of the logs idk how else to show it since it’s mostly backend / file stuff 😭
undo stuff + render lifetime fixes undo / redo the undo system relied way too much on runtime entity IDs and direct pointers into components. that works until an entity gets deleted, an ECS slot gets recycled, or a dense component pool moves stuff around… entity commands now store the entity UUID and resolve the current runtime entity when they execute / undo instead. this now applies to transforms, renaming, adding / removing components, script changes, component field edits and map painting. so older commands can still find the right entity even if it was deleted and later restored with a completely different runtime ID. deleting things is actually undoable now finally added proper undo for deleting entities. !!!!!! deleting an entity snapshots the whole subtree first, including components, UUIDs, names, hierarchy + sibling order, scripts, custom data and asset references. undo rebuilds the tree, reloads required assets, restores the UUIDs and puts everything back where it was. this also means edits from before the deletion still work afterwards, since those commands just resolve the restored entity by UUID. paste uses the same snapshot system now too, so undo / redo keeps the same pasted entity identities instead of creating unrelated ones every time. there are checks for conflicting UUIDs, missing parents, invalid hierarchies, missing assets etc. failed restores shouldn’t leave half-created entities behind. failed commands also no longer get added to undo history or wipe an existing redo chain. custom ObSL data custom script data needed special handling too. arrays / objects can share references or even be cyclic, so just copying ObSL::Value s wasn’t enough. there’s now a snapshot format that captures the object graph and rebuilds it through the interpreter + GC when an entity is restored. CustomDataComponent also roots stored ObSL values properly so GC-managed objects stay alive. runtime functions aren’t snapshotable though, so deletion just fails instead of restoring garbage. render thread lifetime stuff also did a pretty big pass over renderer resource lifetime, mostly because scene switching could unload resources while an already submitted frame was still using them. (this started because someone mightve pointed out a lil crash for me…) render commands now pin the meshes, materials, shaders and textures they need until that frame is done. same idea for UI textures and the editor viewport framebuffer. OpenGL objects also don’t call glDelete* from whichever thread destroys the C++ object anymore. textures, shaders, buffers, VAOs and framebuffers queue deletion for the render thread, while it actually owns the GL context. less bugs yay frame state + shutdown renderer state that can change while the render thread is behind is captured per frame now too, including clear color, post-processing and UI resolution / projection state. shutdown is also more deliberate now: worker threads stop first, background font loads finish, scripts stop, scenes/resources are cleared, renderer/UI resources shut down, then the remaining GL delete queue is processed while a context still exists. font loading uses tracked jthread s now too instead of detached threads. small things exporting now reports success / failure back to the editor and shows a little result popup instead of silently relying on the console. also added tests around delete / restore, UUID reuse, hierarchy restoration, script components, map edits, pasting, command failures and repeated undo / redo without leaking entities or asset references. so. .. . less explosions hopefully sorry if wording is weird.. character limit..
uhhh changes dont nuke scene on failed load scene deserialization moved out of Scene::OnEnter into SceneManager::LoadScene , and now runs before the old scene gets torn down. if the new one fails, you stay in the old scene ( LoadSceneByPath returns a bool now) loading is stricter. missing map files, bad/out-of-range/cyclic parent values and broken UI sections fail the load instead of logging an error and limping on persistent entity migration happens before the swap too, so a failed asset acquire can’t leave you half in the new scene the editor’s LoadScene used to clear the current project before trying to load. now undo history and selection only get cleared once the load actually worked saving: map write failures now propagate instead of reporting success, and files get closed before the error check destroying entities DestroyEntity was recursive, now it’s iterative with a visited set. deep hierarchies, cycles and duplicate child entries no longer kaboom the stack or double delete, and children go first (wow that sounds dark) Reparent and SetParentDirect go through CanSetParent , which rejects cycles and stale parents, even if the existing hierarchy is already cyclic script DestroyEntity / entity.Destroy() now use RequestDestroy to tag the entity and its whole subtree instead of deleting immediately, so on_destroy runs before deletion. scene exit drains the destroy queue too, including entities tagged by exit hooks the script wrapper cache evicts an entity when it’s destroyed a dumb one…: the hot-reload cleanup list had on_exit in it twice and no on_destroy , so on_destroy GC roots never got released … the script system was holding raw ScriptComponent* across initialization, which dangles if a script spawns enough entities to grow the pool. it looks components up by entity ID now script runtime reinitialization after a scene change uses the VFS path and reruns setup, so using imports keep working from the mounted project ui undo UI elements have UUIDs now, and undo commands resolve them by UUID instead of holding raw pointers. removing an element captures the whole subtree plus its sibling position, so undo restores the hierarchy and order. renaming also updates the name index live. smaller fixes collision broadphase is a “spatial hash grid” now instead of checking every pair lightmap rebakes when ambient changes, and handles maps with no tiles atomic file writes use unique temp names so concurrent writers don’t trip over each other project changes wait for background asset loads to finish timeout timers are mutex-protected, and callbacks can schedule more timers without deadlocking SmallTask over-aligned captures fall back to the heap VFS::Resolve("..") had UB from a std::mismatch that wasn’t bounded on the second range… PlayMusic stops, swaps and starts under the lock now instead of racing!!! tests wrote a pile of tests alongside all this: atomic writes, wrapper cache, hierarchy safety, map serialization, save concurrency, scene loading failures, script lifecycle, script modules, SmallTask and timeouts. expanded to the editor command, save game and VFS tests. so EVEN LESS explosions !!! Woo!
map edit kinda overhauled changes map edit stuff the brush size is now 1 to 8 instead of 1 to 5. size 1 is one hex, size 2 is 7, size 3 is 19, etc. Ctrl +scroll also changes the size added Rect and Circle shapes alongside the brush. they work with Paint, Erase and Select. Rect uses opposite corners, Circle goes from a center out to the hex you release on. both apply on release paint previews are green, erase previews are red, and selection previews are yellow. selected tiles get a blue overlay added tool hotkeys: B for Paint, E for Erase and Q for Select Esc cancels a drag. Rect and Circle do nothing if cancelled, while a brush stroke gets reverted instead of leaving half the changes behind loading a map now prompts before discarding a dirty map, and successfully creating or loading a map clears the old undo history selecting and editing multiple tiles Select now supports click and drag, Shift +drag to add to the selection and Ctrl +drag to remove from it the toolbar shows the selection count and has Clear and Delete buttons. Delete removes all selected tiles in one undo step the Tile Editor can edit the type and walkability of the whole selection at once. when selected tiles differ, the controls show mixed values etc. material editing only appears when every selected tile shares a type. Override Current Type changes the material for every tile using that type, while Save as New Type assigns a matching type to the selection without changing every other tile using the old type brush strokes, Rect/Circle fills, deletes and bulk type or walkability changes are each grouped into one undo step. changing a type’s material itself is still not undoable…. the console…. logging now has a sink system, so the same formatted log messages can go to different outputs the editor now has separate Logs and ObSL panels. engine/application logs go to Logs now, and script stdout goes to ObSL the panels have Clear and Copy buttons and keep the latest 2000 lines. the UI sink buffers incoming logs under a mutex before the editor consumes them closing the editor closing the window now goes through a callback, so unsaved scene or project changes trigger the save/discard prompt instead of immediately closing removed the old global Esc -to-quit shortcut. ObSL’s CloseWindow() no longer closes the editor while in Editor mode. it logs that it was called instead. in the runtime, it still closes the window windows and smaller fixes enabled /MP for MSVC builds, and the editor/runtime targets use the Windows GUI subsystem so they don’t launch with a console window attached atomic file writes now write the byte buffer explicitly and retry Windows file replacement when it fails with access-denied or sharing-violation errors, for up to about 2 seconds a bit of cleanup around collision pair sorting, const-correctness and naming docs updated the editor guide and screenshot to cover the new tools, shapes, selection controls, shortcuts and undo behavior. blah blah …map editing is finally a lot less barebones…
uuid-bound script wrappers…, logger sinks…., and a pile of small editor stuff…. mostly scripting + logging plumbing this time, plus a couple of editor things I’d been wanting… changes script wrappers are uuid-bound now entity wrappers used to capture the raw runtime id, which is a problem if ids get recycled or the registry gets rebuilt. now every wrapper holds the entity’s uuid and resolves the live id on each call, so it keeps pointing at the right entity (or does nothing if it’s gone). new FindEntityByUUID(uuid) global and GetUUID() / .uuid on entity objects SetParent matches an entity object by uuid, a plain number is still a runtime id same treatment for UI wrappers: they resolve by uuid instead of name, so renaming or duplicate names don’t break them added FindUIByUUID , GetUUID() and Destroy() on UI elements, and SetImage / GetImage on images (acquires the texture through the scene asset scope like fonts do) still by name: FindUI , DestroyUI and the button state queries ( WasClicked / IsHovered / IsHeld ). UI scripting is still weird… work in progress i guess… logger sinks the old way was swapping the logger’s std::ostream for a stringstream that the UI panel also read from, which was a data race waiting to happen (logger thread writes, main thread reads). replaced it with actual sinks: ILogSink with ConsoleSink (stdout/stderr like before) and UILogSink (mutex -ed pending buffer the panel drains each frame) the editor and runtime both register a ConsoleSink , and the editor adds the UI sink on top, so the Logs panel is always there now instead of only when there’s no tty console panels color lines by severity now interpreter output goes through a small UiStream ostream into the ObSL panel, with stdout and stderr split (needed the bumped obsl, Interpreter takes both streams now…) ObSL panel clears when you enter play mode editor F focuses the camera on the selected entity, press it again to go back to the origin. its smooth…., ..panning cancels the focus keyboard pan only gets called when there’s actually input now.. editing a material in the inspector no longer mutates shared runtime-only materials. if it isn’t a catalog asset it gets cloned into assets.json first, and edits to catalog materials get “upserted” back to the catalog. “Clone Material” writes to the catalog too new scripts from the project browser come with an on_update stub instead of just a comment scripting runtime script top-level code now runs with the command buffer in “immediate” mode ( BeginImmediate / EndImmediate ), so registry writes at the top of a script apply right away instead of waiting for a flush that hasn’t been set up yet during init Hex_GetNeighbors wasn’t GC protecting its array while filling it, fixed…. grid tile textures a tile type with no texture used to fall back to hex_tex both when collecting dependencies and when loading scenes, which would pull in a texture that might not exist. now no texture means no texture… as it should… misc bumped obsl (new using alias feature, and err output stream settings) docs for all the uuid stuff, the F key, and the new UI/image methods… of course… oh also … new demo scene testin thingamabob im messing with…
script properties & UUID types scripts can now declare properties that show up in the inspector and get saved per entity. also ripped std::string UUIDs out of most of the engine in favor of an actual Core::UUID type, plus some scripting additions and a few tests. changes script properties Prop("SpeedOrSomething", 2.5) , PropEntity("TargetEntity") and PropUI("MyRect") for regular values, entities and UI elements properties show up under each script slot in the inspector, with appropriate controls and per-slot values values are only readable during top-level script execution, so store them in variables for use in hooks. Prop in a hook just returns the fallback saved as scriptProperties in scene JSON, omitted when empty property edits support undo, including live number/string editing. unused saved properties can be pruned with undo too.. ScriptSlot is move-only now Core::UUID replaced string UUIDs across the registry, UI, editor commands, project config, save directories and scripting with a 16-byte Core::UUID registry UUID lookups now use an index instead of looping through entities malformed UUIDs in files fall back to generated or nil UUIDs UI UUIDs are saved and restored, including nested elements. duplicate UI UUIDs are handled without crashing the loader savegame directories etc take a UUID directly scripting & UI script objects now have identity values and wrappers are readonly , along with various scripting result objects. came with an ObSL bump UI wrappers get SetParent(parent) and a uuid field. null reparents an element to the root UISystem::Reparent preserves ownership and prevents parenting an element under its own descendant new created scripts use fn on_update(dt) (I wrote on_update() last time …oops…) smaller stuff UndoManager::Execute returns whether the command applied script list shows filenames with Remove beside them tests and docs more tests and docs updated ofc… so u can reference entities in scripts without using Find() now!!!
Ships:
obliberry feels usable enough that i think its a good time for a first ship :) obliberry is a fallout-inspired isometric game engine for hex-grid games, written in C++20 with OpenGL, featuring a visual editor, an ECS core, its own scripting language, and single-file packaging/exports. this has all been rather challenging, but an incredibly fun learning project, especially regarding using modern C++, OpenGL, and making my own programming language it is still obviously not fully complete of course, but I think it’s in a rather good state :D...
|
1792821255.310022
|
1792907655.310022
|
|
30259
|
sqush by @Dackel | Stardance
|
Dackel
|
1
|
441.32
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T16:54:50Z", "hours": 428.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git.", "repo": "https://github.com/DerRealeHier/sqush", "demo": "https://sqush.dev/"}]...
|
[{"post_id": 66216, "ts": "202 [{"post_id": 66216, "ts": "2026-09-11T21:59:59Z", "hours": 6.0431, "text": "added moderation Now I have an AI model that constantly scans new messages and searches for inappropriate content. If the AI finds such content the person that wrote it will be banned and every single message the user wrote will be checked for issues. Oh I forgot to mention that Copilot fixed some critical secruity vulnerabilitys for me. The user that got banned will also be put on the Wall of Shame where there is a record of every single banned Account ever on the Platform. Developers of games can also always search for not so cool content. And of course Admins can manually ban accounts. (Yeah your private messages are also getting scanned)"}, {"post_id": 66009, "ts": "2026-09-11T15:02:37Z", "hours": 6.5411, "text": "added Inventory, Card drops You can now get cards dropped by buying or reviewing games. There are 4 rarities you can get and you can also just test pull these (so you can try it out yourself). Also because of this new feature I found a Issue with the notification system I am gonna fix. You can also trade these card with others through the chat or the trade tab. And you can also forge cards together if you have to many duplicates. Because of this new feature I also found a issue with the notification system, Hopefully have it fixed tommorow."}, {"post_id": 64370, "ts": "2026-09-08T17:55:35Z", "hours": 0.7389, "text": "Didn’t know that I could format it at the shipment so there is the text again formatted. Also I fixed a little download error ( The Site didn’t have the test files in the folder) Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. Issues: The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. The good side: On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). What I didn’t do: My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git."}, {"post_id": 64237, "ts": "2026-09-08T14:23:48Z", "hours": 5.1408, "text": "looked for errors and started website Today I overlooked the site one last time and fixed secruity issues and others. I fixed Email service added an option to change the background Image of the score and made my testdata a bit more secure (had my real emails in there before). I used AI for much of the progress cause it was my first time starting a server (see commits). I ran into many issues while setting everything up."}, {"post_id": 63722, "ts": "2026-09-07T17:34:18Z", "hours": 7.1667, "text": "added dev cut and reworked Background Image I also added test Data. Thats entirely made by AI except some covers that were made by me. Cause I ain’t interactng thousands of times with my own platform. Also which background banner would you like more?"}, {"post_id": 63175, "ts": "2026-09-06T20:44:54Z", "hours": 7.1403, "text": "added roadmap So there is the list of what I have done: Public Roadmaps and Feature Voting the roadmaap can have the status (Planned/In Progress/Done) and the Types (Feature/Bug/Improvment) the dev can Drag and Drop the items into the status it is in and also mdelete it. Users can comment and upvote those Items Redesign of Game Detail site Its not 9 Buttons in one row anymore It’s seperatd into two sections. updated the sale section And I also added Unit Tests."}, {"post_id": 62518, "ts": "2026-09-05T22:36:59Z", "hours": 6.4219, "text": "fixed optimization and UI errors (and not ill anymore) So i fixed many Issues regarding the performance of the website Performance (Optimization) videos don’t get loaded instantly anymore (180ms cooldown) Search is done in memmory atribut caches and requestAnimationFrame. all countdown intervalls have been put into one. background image is done locally instead of GitHub Offscreen Cards now use content-visibility:auto. Database and Queries: SQLite changed to 64MB Cahe. made 10 indizes for Foreign Keys/Filter. Even the translator doesn’t wanna tell me what this means in English. You have to find out yourself. UI and Interaction errors js doesnt crash when pressing a button without being logged in (don’t ask how that happend) guest cart can now delete a game from their carts. when checking out and not being logged in you get forwarded to login. Didn’t actually happen before. Wishlist and card buttons now syncronize when a game is there two times or even more on the front page. It pissed me off before. collection badge gets added after animation. Thats all I wanna write for today"}, {"post_id": 61045, "ts": "2026-09-03T19:12:23Z", "hours": 10.5322, "text": "added tip jar, fixed some UI bugs So now you can tip the game devs and they can see it on their dashboard and on the game detail page. You can also add a message to your donation. And I fixed the message button that hid under the profiles in the community tab."}, {"post_id": 60467, "ts": "2026-09-02T20:05:43Z", "hours": 12.0164, "text": "added messaging , updated UI Now users can message devlopers and other ussers. They can also include game Links and Update Links so you can discuss games."}, {"post_id": 59753, "ts": "2026-09-01T18:00:53Z", "hours": 9.7142, "text": "added Readme and fixed some visual bugs Yesterday the UI looked a bit off. Especially at the unlocking of the badges. It’s now looking good."}, {"post_id": 59207, "ts": "2026-08-31T21:27:06Z", "hours": 11.2833, "text": "added profile badges It’s hard getting the badges right. Cause currently I’m only using Plain HTML and CSS for these badges. And I added the js to the HTML files. Thats much cleaner then in a seperate js file."}, {"post_id": 58172, "ts": "2026-08-30T15:09:34Z", "hours": 9.8781, "text": "cleaned up all of the backend code So yeah I’ve done it! I cleaned up all of the code and now its much easier to get through all. It’s so much better now."}, {"post_id": 57497, "ts": "2026-08-29T17:39:29Z", "hours": 5.1814, "text": "fixed the gifting system (and beginning to clean up that code) So i fixed the gifting system and I also began my work on cleaning up all of this. And as you see it doesnt look beautyfull right now if someone gifts you something but I’ll make it better."}, {"post_id": 56823, "ts": "2026-08-28T19:12:19Z", "hours": 10.8536, "text": "added gifting system and failed miserably (again) Yea I promised to make the code cleaner today. But I found out that doing that is boring. Thats why I added more features. Now I’m paying for it by having new errors pop up every few minutes. If I’d like to just feel some progress at cleaning this mess up I had to do it in small steps. (cause I ain’t fixing 3000 lines in one day) So tommorow I’ll at least try getting the first 1000 lines cleaned up again"}, {"post_id": 56200, "ts": "2026-08-27T21:06:27Z", "hours": 9.985, "text": "Fixed it ☺️ So now it’s totally possible to make new collections. No errors anymore. Also I fixed some more bugs. And tommorow I will begin cleaning up some of the code."}, {"post_id": 55149, "ts": "2026-08-26T16:57:07Z", "hours": 11.1111, "text": "added library collections (tried) Yeah so I did get to add a good UI but currently it does not work to add a collection. I will have it fixed tommorow. Most likely a minor mistae breaking everything."}, {"post_id": 54559, "ts": "2026-08-25T16:06:35Z", "hours": 10.0472, "text": "added honeypot and fixed this horrendeus cart UI So yeah I fixed the UI I had yesterday to make it look more like everything else on the store."}, {"post_id": 53985, "ts": "2026-08-24T18:17:31Z", "hours": 11.4483, "text": "added cart system So for today I added a new cart system. I know I’ve done more than epic. You can now get games into your cart and buy them later. You will also get a warning if a game is cheaper in a bundle.HTML will be fixed tommorow"}, {"post_id": 53215, "ts": "2026-08-23T17:35:14Z", "hours": 9.9589, "text": "fixed that fricking page(couldn’t buy something before) Yeah I just made a completly new route for buying bundles and also a completly new HTML page. For some reason I always find a way to make something extremly complicated"}, {"post_id": 52631, "ts": "2026-08-22T21:06:14Z", "hours": 10.3861, "text": "updated my super dubba design So yeah it should look good now. see for yourself"}, {"post_id": 51791, "ts": "2026-08-21T17:07:05Z", "hours": 11.7708, "text": "fixed backend added first HTML Page with bundles It willl look better tommorow (I PROMISE) But for now it looks like that. I also fixed the backend code so now you should actually be able to buy bundles. It will look more like the dev dashboard tommorow I just used the store.html as template."}, {"post_id": 51181, "ts": "2026-08-20T18:00:39Z", "hours": 10.2681, "text": "added backend for bundles Here a little code snippet. HTML will be finished tommorow. I hope"}, {"post_id": 50504, "ts": "2026-08-19T17:49:13Z", "hours": 10.3353, "text": "fixed the backend So you can now buy games and should get the monopoly money back when refunding it. But if I wanted to make it for a real system I would have to save the payment_tenent_id which I cxurrently don’t. But that should be a easy fix.So it should work like in that cool drawing I made."}, {"post_id": 49756, "ts": "2026-08-18T17:55:42Z", "hours": 10.4592, "text": "added Refund Handling (firs code) So I added Refund Handling for my Store. Unfourtanely I could’t finish it but I did get to finish the frontend. So what did I do. I updated the library page so its now easier to see that you can actually refund the game and how long you have until its not possible anymore. For the backend I currently have some problems with the real refund. You cant really get the money back because of how the buying of a game currently works. Especially automated refunding would be extremly hard in the current system."}, {"post_id": 49062, "ts": "2026-08-17T17:33:22Z", "hours": 12.0856, "text": "added Rate Limits Unfourtanetly I can’t push the code right now cause of github having problems with their API. So but it did take very long cause im Albert himself. So first I tried hardcoding Rate Limits with timers and stuff like that and I very much had very dumb ways to deal with it. Then I found out that Flask actually has a own Libary just for Limits. So after failing doing it my own way I just sticked with that."}, {"post_id": 48247, "ts": "2026-08-16T15:29:51Z", "hours": 12.3036, "text": "added Account Linking/fixed Hackclub auth (again) So now its getting rememberd if you also have a password and not only auth with google or hackclub. Also in the database there is a completly new columm for the hackclub ID. Backend:hackclub_callback() now also checks for Login/register or Link Modus. google_login() now accepts link mode.There are two new routes for unlinking google and hackclub. And last but not least. There is also a secruity check. The last used login methoid cant be deleted."}, {"post_id": 47643, "ts": "2026-08-15T17:49:50Z", "hours": 10.6342, "text": "fixed the hackclub auth So I finally fixed the authentication. So here is a list of all of my mistakes: Used the wrong email field; use identity.primary_emailRequested (I did not need this) use openid emailValidated state even though the callback only returned code (how do I even get to sucessfully code anything) Added duplicate OAuth routes/functions (the dumbest mistake of mine) Left the callback incomplete: no user creation, login, or redirectLogged sensitive access and refresh tokens (name me albstein) Kept Flask debug mode enabled outside local development (hopefully no one saw that) Tommorow I’ll do something. Maybe I’ll even be finished. Cause I dont know what to add anymore. If you have some recommendations just drop them off. thats the list of all current features: User registrationUsername and password login Email verification Resend email verification Email based 2FA 2FA code resend Enable or disable 2FA Change username Change email address Change password Logout Google login Hack Club login First login username setup User profiles Profile pictures Profile comments Delete profile comments Enable or disable profile comments Community page User search Follow users Unfollow users Friend requests Accept friend requests Notifications Unread notification counter Mark notifications as read User roles Developer roles Developer dashboard Create games Edit games Upload game files Upload demo files Upload screenshots Upload images Upload videos Add YouTube videos ZIP game uploads EXE game uploads Optional ClamAV malware scanning Game updates Version labels Patch notes Update history Update comments Update upvotes Update downvotes Update view counts Follow games Game update notifications Store page Genre grouping Game tags Tag filter data Game details Game descriptions Game screenshots Game videos Game view counter Positive/negative ratings Written reviews Edit reviews Helpful review votes Funny review votes Review scoring Wishlist Add to wishlist Remove from wishlist Personal game library Purchases Duplicate purchase prevention Buy page Stripe Checkout Payment success page Sales Discounts Sale end dates Automatic sale expiration Price calculation Developer revenue page Revenue per game Sales count per game Game analytics Daily view statistics Daily wishlist statistics Daily purchase statistics Daily revenue statistics Personalized game recommendations(Yeah thats real) Popular game recommendations SQLite database SQLAlchemy ORMDatabase migrations SMTP email support Firebase configuration Stripe configuration Hack Club OAuth configuration Environment variable secret configuration Please drop some recommendatins🥲"}, {"post_id": 47073, "ts": "2026-08-14T18:18:25Z", "hours": 10.4444, "text": "added hackclub auth (or atleast tried) Thats just because of me being a dum dum. You may see whats the mistake. Will have it fixed tommorow."}, {"post_id": 46511, "ts": "2026-08-13T19:48:06Z", "hours": 10.3497, "text": "Fixed the code (again) So like I said yesterday I rewrote the js. So what was the problem? Well yesterday while testing out the Site I found out that the buy button didn’t send a GET request to the backend. So when I looked at the js I first looked confused cause everything seemed to be fine. After some debugging I found out that my new feature somehow collided with the buy button (Don’t ask how) So I fixed it. Here is my totally real payment information, Everything works fine now:"}, {"post_id": 45999, "ts": "2026-08-12T20:57:45Z", "hours": 7.4628, "text": "fixed all the issues of yesterday made new ones(kinda) So I fixed the old issues you can now see the updates page and actual updates. But I began cleaning up some of the js code and I’m still not finished. So now I need to get over 100 more lines of js. Also I need to look over my python code cause well. 1800 lines of code in one file is horrendeus(At least for me) So wish me luck for tommorow!"}, {"post_id": 45326, "ts": "2026-08-11T18:24:42Z", "hours": 10.7886, "text": "Added update feed SO today I did end up making an update feed but I still have to fix some frustrating errors. You can view your own games updates these of your friends or the updates of the hole platform. You should also be able to upvote these but I currently have some errors with that."}, {"post_id": 44766, "ts": "2026-08-10T19:21:12Z", "hours": 10.5611, "text": "I’m back So I’m back from my holidays and my stress with Oracle. So I added a new simple feature and also updated some of my secruity checks. So I did test the file scanner on my PC and it turns out to be good enough. It can find malicious files and get them out before even anyone sees them. Also you can now update your game. Currently you can write what you changed but there is no way of seeing what you wrote for now. I will add that tommorow. It will just be a thread of all updates and the newest come out on top."}, {"post_id": 30891, "ts": "2026-07-18T21:16:48Z", "hours": 10.9772, "text": "Can’t show real progress because of Oracle. So I have fnished the backend and already had a plan, but Oracle had to ruin the fun. I wanted to host a VirtualMachine on Oracle Servers because I already have experience with them. But after wanting to sign up I was straight up rejected from getting the Server I paid for . They also debited my money twice (Not cool) . So now I have to wait for the support to answer me and give me some of my money back. There is a small snippet of the code:"}, {"post_id": 30418, "ts": "2026-07-17T22:52:15Z", "hours": 10.2122, "text": "It’s getting somewhere That was a lot less work than in the last days. So what have I added today? overworked Dropdown Menu Beforehands the Dropdown Menu always was a bit behind the page. Now I have fixed it and also it has become much more interactive. overworked Store Search Now the Store search has more options to search for a game. made Settings Page You can now change Important settings on the help tab. For example your Email Adress, your username, or your password. made Page to choose username when logging in with Google You can now choose a username when logging in with google. You couldn’t do that yesterday!"}, {"post_id": 29842, "ts": "2026-07-17T00:01:04Z", "hours": 11.6853, "text": "Google is not that cool 🤬 So guys like I said I finished it today so thats what I added: Basic Recommendation System So there are the three factors for the Recommendations: Tag taste: users who own a game sharing tags with your library also own the canditate Popularity: how many people in total own the candidate (Thats the least important) Similar library wishlists: users who share games with your library wishlisted the candidate All of that is done in phython, which is very dumb to do if you wanna have thousands of games. (But for that small store its enough) 2fa authentification So for that I have used firebase. For me it was extremly hard configuring this.But I made it. Also I have used a gmail address to send a potential user the verification and email confirmation. And if you dont wanna verify anything you can deactivate it with the checkmark( But please if the demo is online do it(Note: Analytics are activated on firebase )) added google login You can also login in with google. For that I had to use the most irrating API Keys. Really why is Google making it so hard? IMPORTANT: For now your Username will automatically be the name you have on you Google account."}, {"post_id": 29221, "ts": "2026-07-16T00:04:58Z", "hours": 10.5619, "text": "havent finished anything today So today I began working on something big. But I havent really made any real progress in that. I had to work around so many logic problems. Also over the course of working on this I found out that my code isn’t really optimised for much data. If this code would ever be used with 10.000 games or even more it would most likely crash. But still I will finish the feature tommorow. And also I will start a Demo site in the next days. It would be great if anyone just tested it out. Here a code snippet"}, {"post_id": 28557, "ts": "2026-07-14T21:38:29Z", "hours": 10.1431, "text": "added revenue tab and new background image So today I added a new metric to the stats page. It was really hard getting it right. Especially in the graph because I didnt wanna use the same axis for the revenue again. I also made the backround image more pixelated so it gets more of a retro look. Tomorrow I’ll begin making something big(I already did some of the work today but yeah)"}, {"post_id": 27955, "ts": "2026-07-13T21:55:59Z", "hours": 10.12, "text": "added stats page I added a stats page for every game a developer has published. You can see the history of how your game has developed. Thats why I’ve worked on the wishlist ,views and purchase features, so I can actually put them on a stats page. Adding the graph was especially hard and also saving the old datapoints was difficult. For example I had used simple Optimization like if its the same data as yesterday there will just be no new datapoint added. So there is a look at the new page::"}, {"post_id": 27383, "ts": "2026-07-12T22:09:28Z", "hours": 10.1817, "text": "added comments to user profiles I added comments to user profiles. The great thing is you can deactivate the comment tab and delete comments you dont like. It really took super long making this feature. Especially handling the errors. In the end I did make it but I still have to fix some errors tomoorow. Now I’ll go to sleep (:"}, {"post_id": 26883, "ts": "2026-07-11T22:34:49Z", "hours": 10.6103, "text": "added demos, user badge, blurred email and default picture(penguins of madagascar) overworked login, register, profile, community , game_detail , dashboard and edit game So today I added Demos you can install. I just copied the code of the game upload. I also added a user badge so you can see who is a dev and who is a user. Now youn will also not see your whole email but reade just the first three letters. (That took way too long to do) And I also overworked all of these pages so they have a look that better fits the entire store."}, {"post_id": 26225, "ts": "2026-07-10T21:46:58Z", "hours": 10.6775, "text": "added reactions to reviews and wishlist so today I already began working on bigger features. It was a bit hard to do all off this but I made it. I just found out today that you can actually migrate databases wth Flask. I always thought I had to delete the hole database and set it up again to make everything work. Also I spent around 4 hours searching for a mistake just to find out that I linked the wrong javascript file. My backend code gets worse every day. I must find a solution for that. Here my new wishlist page and the reactions:"}, {"post_id": 25527, "ts": "2026-07-09T20:53:38Z", "hours": 10.2692, "text": "fixed several bugs and commented,optimized the code So today I decided to look through all of my code and look for ways to improve. In the end I made several fixes and I’am satisfied with how it ended up. The reason I did this is because I wanna add many more features tommorow. But yesterday I already noticed that its hard to look through the code and that there were so many issues. Also some on the performance side. I believe that all errors are fixed for now. Here a code snipet:"}, {"post_id": 25006, "ts": "2026-07-08T22:20:11Z", "hours": 10.1572, "text": "added notifications, countdown for sales, friend request (not just following like yesterday) ,overworked UI aspects and reviews For the notifications I mjust had to add a new route and add it to the front end. The countdown was really hard to figure out for my but it worked out with unix time I searched for an error the entire time just to find out that my countdown was written in white on a white background. The friend request are why I added notifications. Because I wanted to let the user see who sent a request and respond to that. For the new system I had to delete the entire database to make it work. After that I added reviews. You can now give a game a thumbs up or down. The average score will be shown and your text (the review). When finishing that I overworked some of the most Important UI’s and made it much better to look at. Like you see here:"}, {"post_id": 24404, "ts": "2026-07-07T22:50:08Z", "hours": 10.1739, "text": "added views, befriending, community, paying, user profiles and searching for users So first the biggest: I added paying with Stripe . I only used the sandbox but you could basicially just add your own API Keys in an .env file and youd be able to start. The documentation was really tuff to read through but I made it with the help of a tutorial. After that I added user profiles. I just reused my game backend with the screenshots and so for the avatar. When I was finished with the unique users I started with the view system. For now it’s pretty basic and you just have to view a site for 5 seconds to count as a view. After that I added the community tab where you can search users and befriend them. Some of my error highlights: “stripe is not defined”; I forgot to add the API key. Not an error but. I hardcoded the API Keys. Already fixed but still. “Template…… unexpected” I had to delete the database because I added a new velue for it."}, {"post_id": 23753, "ts": "2026-07-06T21:37:45Z", "hours": 1.93, "text": "Libary and buying today I just added a basic libary where you can view the games added to your account and even download them and I overworked the login and register page. Tommorow I’ll begin the payment process when buying a game. For that I will use the sandbox tools of Stripe."}, {"post_id": 23122, "ts": "2026-07-05T21:45:27Z", "hours": 10.1194, "text": "Most Productive day Today was really crazy. I worked for the hole day and made some big progress. Dashboard I first added a dashboard for developers. So you can finally add a game. I used flask (python) for the backend. You can also add screenshots and youtube links or mp.4. On the homepage you can preview the games trailer by hovering over it. Secruity Also editing of the game is only possible if you are the owner of the game. So I had to add a System for User Authorization and hashing for the passwords of course. Luckily Flask did most of it.So its getting checked if you are even a developer. When you are not you dont even get the options shown to publish a game or edit one. Media I also expanded on the media upload . You can now add as many screenshots or videos as you want (Little side note: don’t keep the video upload blank). And the biggest part you can add games now. UI Changes The UI also got a big Overhaul. I have decided to use a comic style for the site. Please Note that the background image at the nav is still AI generated(Even tho I did edit it a bit too get more of a retro style) Also I fixed several error. Mostly just typos that ended up getting the hole site down. Features: I also added new features such as tags, genres, game pages, the developer dashboard, search and an edit page for the games you made."}, {"post_id": 22423, "ts": "2026-07-04T21:40:26Z", "hours": 2.1081, "text": "Interactive Home Screen with Banner Today I began overworking my initial concept from yesterday and I made some progress. The home site now has a background banner with the most important things in the nav. The background Image currently is AI generated but I will make my own in the next few days. I also made the site much more interactive. Everything you see here has an effect when hovering it. But don’t worry I didn’t exaggerate with the effects. For the pulsing Image I used the inbuild keyframes CSS has. I also blurred the text when hovering the image but that may has to be reverted tommorow. I also don’t think that I’l be able to make much more in the next 3 days. But I will try making small changes. I will most likely begin with the backend in the next week at the current pace."}, {"post_id": 21706, "ts": "2026-07-03T20:03:19Z", "hours": 2.1947, "text": "Ideas for the front end Today I only ended up making some bold prototypes for the front end in HTML and CSS. I did have a small error already because of using bootstrap. I always load up the scripts for the HTML and CSS from the Bootstrap site, and that was not a good idea. I ended up searching for an error that didn’t really exist . In the end I found out what was wrong by seeking help from gemini. Nothing else was done with the help of AI as you can see by the bad UX. I didn’t really have time for anything big so thats what I ended up with. I will make it much nicer tomorrow if I have the time to do it."}]...
|
Title: sqush by @Dackel | Stardance
Devlogs:
Idea Title: sqush by @Dackel | Stardance
Devlogs:
Ideas for the front end Today I only ended up making some bold prototypes for the front end in HTML and CSS. I did have a small error already because of using bootstrap. I always load up the scripts for the HTML and CSS from the Bootstrap site, and that was not a good idea. I ended up searching for an error that didn’t really exist . In the end I found out what was wrong by seeking help from gemini. Nothing else was done with the help of AI as you can see by the bad UX. I didn’t really have time for anything big so thats what I ended up with. I will make it much nicer tomorrow if I have the time to do it.
Interactive Home Screen with Banner Today I began overworking my initial concept from yesterday and I made some progress. The home site now has a background banner with the most important things in the nav. The background Image currently is AI generated but I will make my own in the next few days. I also made the site much more interactive. Everything you see here has an effect when hovering it. But don’t worry I didn’t exaggerate with the effects. For the pulsing Image I used the inbuild keyframes CSS has. I also blurred the text when hovering the image but that may has to be reverted tommorow. I also don’t think that I’l be able to make much more in the next 3 days. But I will try making small changes. I will most likely begin with the backend in the next week at the current pace.
Most Productive day Today was really crazy. I worked for the hole day and made some big progress. Dashboard I first added a dashboard for developers. So you can finally add a game. I used flask (python) for the backend. You can also add screenshots and youtube links or mp.4. On the homepage you can preview the games trailer by hovering over it. Secruity Also editing of the game is only possible if you are the owner of the game. So I had to add a System for User Authorization and hashing for the passwords of course. Luckily Flask did most of it.So its getting checked if you are even a developer. When you are not you dont even get the options shown to publish a game or edit one. Media I also expanded on the media upload . You can now add as many screenshots or videos as you want (Little side note: don’t keep the video upload blank). And the biggest part you can add games now. UI Changes The UI also got a big Overhaul. I have decided to use a comic style for the site. Please Note that the background image at the nav is still AI generated(Even tho I did edit it a bit too get more of a retro style) Also I fixed several error. Mostly just typos that ended up getting the hole site down. Features: I also added new features such as tags, genres, game pages, the developer dashboard, search and an edit page for the games you made.
Libary and buying today I just added a basic libary where you can view the games added to your account and even download them and I overworked the login and register page. Tommorow I’ll begin the payment process when buying a game. For that I will use the sandbox tools of Stripe.
added views, befriending, community, paying, user profiles and searching for users So first the biggest: I added paying with Stripe . I only used the sandbox but you could basicially just add your own API Keys in an .env file and youd be able to start. The documentation was really tuff to read through but I made it with the help of a tutorial. After that I added user profiles. I just reused my game backend with the screenshots and so for the avatar. When I was finished with the unique users I started with the view system. For now it’s pretty basic and you just have to view a site for 5 seconds to count as a view. After that I added the community tab where you can search users and befriend them. Some of my error highlights: “stripe is not defined”; I forgot to add the API key. Not an error but. I hardcoded the API Keys. Already fixed but still. “Template…… unexpected” I had to delete the database because I added a new velue for it.
added notifications, countdown for sales, friend request (not just following like yesterday) ,overworked UI aspects and reviews For the notifications I mjust had to add a new route and add it to the front end. The countdown was really hard to figure out for my but it worked out with unix time I searched for an error the entire time just to find out that my countdown was written in white on a white background. The friend request are why I added notifications. Because I wanted to let the user see who sent a request and respond to that. For the new system I had to delete the entire database to make it work. After that I added reviews. You can now give a game a thumbs up or down. The average score will be shown and your text (the review). When finishing that I overworked some of the most Important UI’s and made it much better to look at. Like you see here:
fixed several bugs and commented,optimized the code So today I decided to look through all of my code and look for ways to improve. In the end I made several fixes and I’am satisfied with how it ended up. The reason I did this is because I wanna add many more features tommorow. But yesterday I already noticed that its hard to look through the code and that there were so many issues. Also some on the performance side. I believe that all errors are fixed for now. Here a code snipet:
added reactions to reviews and wishlist so today I already began working on bigger features. It was a bit hard to do all off this but I made it. I just found out today that you can actually migrate databases wth Flask. I always thought I had to delete the hole database and set it up again to make everything work. Also I spent around 4 hours searching for a mistake just to find out that I linked the wrong javascript file. My backend code gets worse every day. I must find a solution for that. Here my new wishlist page and the reactions:
added demos, user badge, blurred email and default picture(penguins of madagascar) overworked login, register, profile, community , game_detail , dashboard and edit game So today I added Demos you can install. I just copied the code of the game upload. I also added a user badge so you can see who is a dev and who is a user. Now youn will also not see your whole email but reade just the first three letters. (That took way too long to do) And I also overworked all of these pages so they have a look that better fits the entire store.
added comments to user profiles I added comments to user profiles. The great thing is you can deactivate the comment tab and delete comments you dont like. It really took super long making this feature. Especially handling the errors. In the end I did make it but I still have to fix some errors tomoorow. Now I’ll go to sleep (:
added stats page I added a stats page for every game a developer has published. You can see the history of how your game has developed. Thats why I’ve worked on the wishlist ,views and purchase features, so I can actually put them on a stats page. Adding the graph was especially hard and also saving the old datapoints was difficult. For example I had used simple Optimization like if its the same data as yesterday there will just be no new datapoint added. So there is a look at the new page::
added revenue tab and new background image So today I added a new metric to the stats page. It was really hard getting it right. Especially in the graph because I didnt wanna use the same axis for the revenue again. I also made the backround image more pixelated so it gets more of a retro look. Tomorrow I’ll begin making something big(I already did some of the work today but yeah)
havent finished anything today So today I began working on something big. But I havent really made any real progress in that. I had to work around so many logic problems. Also over the course of working on this I found out that my code isn’t really optimised for much data. If this code would ever be used with 10.000 games or even more it would most likely crash. But still I will finish the feature tommorow. And also I will start a Demo site in the next days. It would be great if anyone just tested it out. Here a code snippet
Google is not that cool 🤬 So guys like I said I finished it today so thats what I added: Basic Recommendation System So there are the three factors for the Recommendations: Tag taste: users who own a game sharing tags with your library also own the canditate Popularity: how many people in total own the candidate (Thats the least important) Similar library wishlists: users who share games with your library wishlisted the candidate All of that is done in phython, which is very dumb to do if you wanna have thousands of games. (But for that small store its enough) 2fa authentification So for that I have used firebase. For me it was extremly hard configuring this.But I made it. Also I have used a gmail address to send a potential user the verification and email confirmation. And if you dont wanna verify anything you can deactivate it with the checkmark( But please if the demo is online do it(Note: Analytics are activated on firebase )) added google login You can also login in with google. For that I had to use the most irrating API Keys. Really why is Google making it so hard? IMPORTANT: For now your Username will automatically be the name you have on you Google account.
It’s getting somewhere That was a lot less work than in the last days. So what have I added today? overworked Dropdown Menu Beforehands the Dropdown Menu always was a bit behind the page. Now I have fixed it and also it has become much more interactive. overworked Store Search Now the Store search has more options to search for a game. made Settings Page You can now change Important settings on the help tab. For example your Email Adress, your username, or your password. made Page to choose username when logging in with Google You can now choose a username when logging in with google. You couldn’t do that yesterday!
Can’t show real progress because of Oracle. So I have fnished the backend and already had a plan, but Oracle had to ruin the fun. I wanted to host a VirtualMachine on Oracle Servers because I already have experience with them. But after wanting to sign up I was straight up rejected from getting the Server I paid for . They also debited my money twice (Not cool) . So now I have to wait for the support to answer me and give me some of my money back. There is a small snippet of the code:
I’m back So I’m back from my holidays and my stress with Oracle. So I added a new simple feature and also updated some of my secruity checks. So I did test the file scanner on my PC and it turns out to be good enough. It can find malicious files and get them out before even anyone sees them. Also you can now update your game. Currently you can write what you changed but there is no way of seeing what you wrote for now. I will add that tommorow. It will just be a thread of all updates and the newest come out on top.
Added update feed SO today I did end up making an update feed but I still have to fix some frustrating errors. You can view your own games updates these of your friends or the updates of the hole platform. You should also be able to upvote these but I currently have some errors with that.
fixed all the issues of yesterday made new ones(kinda) So I fixed the old issues you can now see the updates page and actual updates. But I began cleaning up some of the js code and I’m still not finished. So now I need to get over 100 more lines of js. Also I need to look over my python code cause well. 1800 lines of code in one file is horrendeus(At least for me) So wish me luck for tommorow!
Fixed the code (again) So like I said yesterday I rewrote the js. So what was the problem? Well yesterday while testing out the Site I found out that the buy button didn’t send a GET request to the backend. So when I looked at the js I first looked confused cause everything seemed to be fine. After some debugging I found out that my new feature somehow collided with the buy button (Don’t ask how) So I fixed it. Here is my totally real payment information, Everything works fine now:
added hackclub auth (or atleast tried) Thats just because of me being a dum dum. You may see whats the mistake. Will have it fixed tommorow.
fixed the hackclub auth So I finally fixed the authentication. So here is a list of all of my mistakes: Used the wrong email field; use identity.primary_emailRequested (I did not need this) use openid emailValidated state even though the callback only returned code (how do I even get to sucessfully code anything) Added duplicate OAuth routes/functions (the dumbest mistake of mine) Left the callback incomplete: no user creation, login, or redirectLogged sensitive access and refresh tokens (name me albstein) Kept Flask debug mode enabled outside local development (hopefully no one saw that) Tommorow I’ll do something. Maybe I’ll even be finished. Cause I dont know what to add anymore. If you have some recommendations just drop them off. thats the list of all current features: User registrationUsername and password login Email verification Resend email verification Email based 2FA 2FA code resend Enable or disable 2FA Change username Change email address Change password Logout Google login Hack Club login First login username setup User profiles Profile pictures Profile comments Delete profile comments Enable or disable profile comments Community page User search Follow users Unfollow users Friend requests Accept friend requests Notifications Unread notification counter Mark notifications as read User roles Developer roles Developer dashboard Create games Edit games Upload game files Upload demo files Upload screenshots Upload images Upload videos Add YouTube videos ZIP game uploads EXE game uploads Optional ClamAV malware scanning Game updates Version labels Patch notes Update history Update comments Update upvotes Update downvotes Update view counts Follow games Game update notifications Store page Genre grouping Game tags Tag filter data Game details Game descriptions Game screenshots Game videos Game view counter Positive/negative ratings Written reviews Edit reviews Helpful review votes Funny review votes Review scoring Wishlist Add to wishlist Remove from wishlist Personal game library Purchases Duplicate purchase prevention Buy page Stripe Checkout Payment success page Sales Discounts Sale end dates Automatic sale expiration Price calculation Developer revenue page Revenue per game Sales count per game Game analytics Daily view statistics Daily wishlist statistics Daily purchase statistics Daily revenue statistics Personalized game recommendations(Yeah thats real) Popular game recommendations SQLite database SQLAlchemy ORMDatabase migrations SMTP email support Firebase configuration Stripe configuration Hack Club OAuth configuration Environment variable secret configuration Please drop some recommendatins🥲
added Account Linking/fixed Hackclub auth (again) So now its getting rememberd if you also have a password and not only auth with google or hackclub. Also in the database there is a completly new columm for the hackclub ID. Backend:hackclub_callback() now also checks for Login/register or Link Modus. google_login() now accepts link mode.There are two new routes for unlinking google and hackclub. And last but not least. There is also a secruity check. The last used login methoid cant be deleted.
added Rate Limits Unfourtanetly I can’t push the code right now cause of github having problems with their API. So but it did take very long cause im Albert himself. So first I tried hardcoding Rate Limits with timers and stuff like that and I very much had very dumb ways to deal with it. Then I found out that Flask actually has a own Libary just for Limits. So after failing doing it my own way I just sticked with that.
added Refund Handling (firs code) So I added Refund Handling for my Store. Unfourtanely I could’t finish it but I did get to finish the frontend. So what did I do. I updated the library page so its now easier to see that you can actually refund the game and how long you have until its not possible anymore. For the backend I currently have some problems with the real refund. You cant really get the money back because of how the buying of a game currently works. Especially automated refunding would be extremly hard in the current system.
fixed the backend So you can now buy games and should get the monopoly money back when refunding it. But if I wanted to make it for a real system I would have to save the payment_tenent_id which I cxurrently don’t. But that should be a easy fix.So it should work like in that cool drawing I made.
added backend for bundles Here a little code snippet. HTML will be finished tommorow. I hope
fixed backend added first HTML Page with bundles It willl look better tommorow (I PROMISE) But for now it looks like that. I also fixed the backend code so now you should actually be able to buy bundles. It will look more like the dev dashboard tommorow I just used the store.html as template.
updated my super dubba design So yeah it should look good now. see for yourself
fixed that fricking page(couldn’t buy something before) Yeah I just made a completly new route for buying bundles and also a completly new HTML page. For some reason I always find a way to make something extremly complicated
added cart system So for today I added a new cart system. I know I’ve done more than epic. You can now get games into your cart and buy them later. You will also get a warning if a game is cheaper in a bundle.HTML will be fixed tommorow
added honeypot and fixed this horrendeus cart UI So yeah I fixed the UI I had yesterday to make it look more like everything else on the store.
added library collections (tried) Yeah so I did get to add a good UI but currently it does not work to add a collection. I will have it fixed tommorow. Most likely a minor mistae breaking everything.
Fixed it ☺️ So now it’s totally possible to make new collections. No errors anymore. Also I fixed some more bugs. And tommorow I will begin cleaning up some of the code.
added gifting system and failed miserably (again) Yea I promised to make the code cleaner today. But I found out that doing that is boring. Thats why I added more features. Now I’m paying for it by having new errors pop up every few minutes. If I’d like to just feel some progress at cleaning this mess up I had to do it in small steps. (cause I ain’t fixing 3000 lines in one day) So tommorow I’ll at least try getting the first 1000 lines cleaned up again
fixed the gifting system (and beginning to clean up that code) So i fixed the gifting system and I also began my work on cleaning up all of this. And as you see it doesnt look beautyfull right now if someone gifts you something but I’ll make it better.
cleaned up all of the backend code So yeah I’ve done it! I cleaned up all of the code and now its much easier to get through all. It’s so much better now.
added profile badges It’s hard getting the badges right. Cause currently I’m only using Plain HTML and CSS for these badges. And I added the js to the HTML files. Thats much cleaner then in a seperate js file.
added Readme and fixed some visual bugs Yesterday the UI looked a bit off. Especially at the unlocking of the badges. It’s now looking good.
added messaging , updated UI Now users can message devlopers and other ussers. They can also include game Links and Update Links so you can discuss games.
added tip jar, fixed some UI bugs So now you can tip the game devs and they can see it on their dashboard and on the game detail page. You can also add a message to your donation. And I fixed the message button that hid under the profiles in the community tab.
fixed optimization and UI errors (and not ill anymore) So i fixed many Issues regarding the performance of the website Performance (Optimization) videos don’t get loaded instantly anymore (180ms cooldown) Search is done in memmory atribut caches and requestAnimationFrame. all countdown intervalls have been put into one. background image is done locally instead of GitHub Offscreen Cards now use content-visibility:auto. Database and Queries: SQLite changed to 64MB Cahe. made 10 indizes for Foreign Keys/Filter. Even the translator doesn’t wanna tell me what this means in English. You have to find out yourself. UI and Interaction errors js doesnt crash when pressing a button without being logged in (don’t ask how that happend) guest cart can now delete a game from their carts. when checking out and not being logged in you get forwarded to login. Didn’t actually happen before. Wishlist and card buttons now syncronize when a game is there two times or even more on the front page. It pissed me off before. collection badge gets added after animation. Thats all I wanna write for today
added roadmap So there is the list of what I have done: Public Roadmaps and Feature Voting the roadmaap can have the status (Planned/In Progress/Done) and the Types (Feature/Bug/Improvment) the dev can Drag and Drop the items into the status it is in and also mdelete it. Users can comment and upvote those Items Redesign of Game Detail site Its not 9 Buttons in one row anymore It’s seperatd into two sections. updated the sale section And I also added Unit Tests.
added dev cut and reworked Background Image I also added test Data. Thats entirely made by AI except some covers that were made by me. Cause I ain’t interactng thousands of times with my own platform. Also which background banner would you like more?
looked for errors and started website Today I overlooked the site one last time and fixed secruity issues and others. I fixed Email service added an option to change the background Image of the score and made my testdata a bit more secure (had my real emails in there before). I used AI for much of the progress cause it was my first time starting a server (see commits). I ran into many issues while setting everything up.
Didn’t know that I could format it at the shipment so there is the text again formatted. Also I fixed a little download error ( The Site didn’t have the test files in the folder) Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. Issues: The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. The good side: On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). What I didn’t do: My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git.
added Inventory, Card drops You can now get cards dropped by buying or reviewing games. There are 4 rarities you can get and you can also just test pull these (so you can try it out yourself). Also because of this new feature I found a Issue with the notification system I am gonna fix. You can also trade these card with others through the chat or the trade tab. And you can also forge cards together if you have to many duplicates. Because of this new feature I also found a issue with the notification system, Hopefully have it fixed tommorow.
added moderation Now I have an AI model that constantly scans new messages and searches for inappropriate content. If the AI finds such content the person that wrote it will be banned and every single message the user wrote will be checked for issues. Oh I forgot to mention that Copilot fixed some critical secruity vulnerabilitys for me. The user that got banned will also be put on the Wall of Shame where there is a record of every single banned Account ever on the Platform. Developers of games can also always search for not so cool content. And of course Admins can manually ban accounts. (Yeah your private messages are also getting scanned)
Ships:
Sqush is an indie game store with a comic 90s look. You can add games as a dev or use the platform as a normal user. You can interact with others message them and earn badges. And of course you can download games. The backend was one of the hardest things I have ever done. I had to fix so many errors along the way (see devlogs). One time I forgot to initialise a value the other time my complete logic was bullax. Sometimes I even pushed code without proper testing. It did not turn out well. And then there was how I organized the code first. It was messy and hard to read. Implementing something new could take ages because of the code not being easy enough to read through. Also some platforms just hated me for no reason and made it harder for me to add something new. On the other hand it was extremly refreshing to try something new and fail misrebaly at it. I can now propely set up automatic emailing systems use payment services like Stripe, make automatic file scanners, hash password, make upload systems that will hopefully not fail after 1000 game uploads, even learnt a bit of drawing (name me Picasso) ,migrate databases (couldn’t actually do it before. Even tho its easy) and set up servers for the site ( even if I did use AI for that last part). My plan was actually to put up a real game on this platform and actually test it. But school is starting now and I don’t know if there is still enough time for it (Cause I signed up for something big). Stress Test it to your’e liking but PLEASE dont upload thousands of 2 GB files cause that costs money. This name is peak btw. I don’t accept other opinions. And for testing: Dev-Login: developer / test | Stripe Testcard: 4242 4242 4242 4242 (Exp: 12/34, CVC: 123, Zip: 12345) The full Feature List is on the Readme on git....
|
1792878701.8847983
|
1793742701.8847983
|
|
54189
|
Dragon Launcher by @elnix | Stardance
|
elnix
|
0
|
463.3
|
0
|
[]
|
[{"post_id": 81864, "ts": "202 [{"post_id": 81864, "ts": "2026-10-22T19:58:20Z", "hours": 5.58, "text": "Adaptative layout !! So, I’m building the adaptative layout my app needed, and some people wanted, before it was locked in a portrait orientation, but I remove that lock and build a different ui for several screens for them to adapt to the horizontal layouts. This is useful for the rotation, and the larger devices, such as the tablets"}, {"post_id": 80602, "ts": "2026-10-18T08:41:41Z", "hours": 8.3169, "text": "Various optimisations all around the app I’ve been closing issues and managed to reduce the number of them to less than 20!! And furthermore, alot o them are actually feature request that i may implement one day"}, {"post_id": 78692, "ts": "2026-10-11T09:52:15Z", "hours": 4.7783, "text": "Finally, Update 4.5.0!!!!Her’s the changelog!! 4.5.0 (Komodo) (2026-10-11) NEW Permissions tab in settings 2 modes for the dragging overlay, to choose whether to render the nests or not Add a new workspace: the apps not yet in the nests New settings to make the categories openable by clicking on them (and apps) IMPROVED Small UI improvements everywhere FIXED Big icons loading issue due to race-conditions in core points logic Small issues with reset behavior ⚠️ Play Protect Warning Due to Android restrictions, disable Play Protect during installation to avoid Dragon being blocked."}, {"post_id": 78145, "ts": "2026-10-09T19:31:33Z", "hours": 5.2208, "text": "I’ve been fixing and adding small features the recnet times, and Iwill soon release a next version! Here are the recent commits I made: feat(workspace): add not in nests workspace type, closes #450 fix(ui): improve Ui of the App detail info bottom sheet and long press popup fix(ui): change typography styles for TextWithDescription feat(ui): add switch icons un the thumb fix(i18n): Merge remote-tracking branch ‘weblate/main’ feat(top-preview): Add scale parameter for the new point preview mode fix: AppDisplayTab was resetting colors, it now resets the UISettingsStore feat(display): define 2 modes for the top display dragging overlay: new and legacy . fix(ui): move permissions tab into advanced sub-menu of main settings screen"}, {"post_id": 77557, "ts": "2026-10-07T13:37:44Z", "hours": 7.5189, "text": "4.4.2 (Smaug) 2026-10-07 [NEW] Recent apps display a recent badge (will be improved soon) [IMPROVED] Category feature dialogs rework Drawer-related bugs and rework Optimization of core functions for performance [FIXED] Bottom sheets UI fixes"}, {"post_id": 76706, "ts": "2026-10-04T11:48:27Z", "hours": 8.4739, "text": "Finished refactoring the gesture system!! So basically, after tons of ours coding this stuff, I finally launched the release, it should finish the build soon. Here’s the changelog for this version! 4.4.0 (Smaug) 2026-10-04 [NEW] Complete refactor of all gesture system (real big ngl) New locked nest system [IMPROVED] Widgets tab UI Global UI refinements [FIXED] Icon rendering logic [NOTE] Removed migration system from 4.0.0"}, {"post_id": 76370, "ts": "2026-10-03T10:24:13Z", "hours": 6.8339, "text": "Complete refactor of the whole launching process So basically, in my previous devlog, I was talking about the new feature I made, to drop the nests in a position and keep it there. but when coding it, I noticed alot of off things in my old code, that was holding there for a while now. What I did recently, is that I moved all the gesture logic to the SwipeService class (an internal injected dependency) to centralize all the gesture logic, instead of keeping spread around in Compose. I’m really proud of myself, ngl!!"}, {"post_id": 75601, "ts": "2026-09-30T15:11:22Z", "hours": 8.0675, "text": "Implementing fixed nest feature So this is an issue one of my user asked long ago, the ability to have a nest fixed in place. So I’ve been implementing this for the past couple hours, but the only issue is that I’m now againsts a wall, and I have to refactor a very bit part of the gesture system to make everything work cleanly. Basically, I am moving all the heavy gesture logic that was in Compose to a single shared viewmodel to avoid the repetitions."}, {"post_id": 74641, "ts": "2026-09-27T20:41:59Z", "hours": 3.7736, "text": "Implementing completely new initialization screen. So I’ve been workijg on this new screen after that alot of ppl asked me to make more easy their integration to the launcher. Basically this will use hte usage stats permissions to get the recent apps (and most used) on your phone, and place them one by one on the circles. By default I keep them as circles to avoid users to be lost."}, {"post_id": 73718, "ts": "2026-09-25T19:33:20Z", "hours": 8.7417, "text": "Completely reworking the points setttings gesture system. So I’m refactorging this entire screen too allowsuper fine gesture control. before there used to be abutton to toggle botween 2 modes, but now only the gestures are responsible for that!! Also, I’m created a ALL NEW initialization system to allow you to easily import your apps to the nests the first time you launch dragon"}, {"post_id": 71087, "ts": "2026-09-20T08:55:55Z", "hours": 6.4903, "text": "Refactoring the app to improve performance. So recently I’ve been refactoring the app by moving some logic inside the viewmodels, reducing the amount of RAM the app uses and this, along with some minor optimizations and small features will be the next version. (soon!) Also, i added a new button in the Preset rows to import your themes aditionaly to exporting them. All of this into a clean json you can share Lots of people have been joinning the discord since last version and that’s super cool!!!"}, {"post_id": 67407, "ts": "2026-09-13T14:37:35Z", "hours": 6.14, "text": "Complete refactor of the welcome screen: I wanted to change it since a while now, so I did it! Here’s rhe new version, its a vertical scrollable pager that fully integrates the power of gestures!! I also added an easter egg in that version, when you select the “flashbang theme” from the color theme selector, it’ll play a flashbang grenade sound🤣"}, {"post_id": 66704, "ts": "2026-09-12T16:17:03Z", "hours": 7.2258, "text": "Various optimizations and ui fix Thanks to the new stargazers on github, I’m almost at 300⭐!!! I accepted a pull request from a friend that corrects some early performance issues I fixed multiple issues that related a crash I optimized several part of the launcher that were laggy and / or did not feel smooth I refactored the color picker to have something wayyy cleaner!!"}, {"post_id": 64840, "ts": "2026-09-09T15:12:34Z", "hours": 4.3044, "text": "I released a small changes update: Updated nest managment sheet (rework) Hold menu entries setting behavior fix F-Droid reproductible builds failing Correct race crash condition in charging animation. With all these fixes, the 4.1.1 was released!!!!"}, {"post_id": 61777, "ts": "2026-09-04T21:03:22Z", "hours": 4.4594, "text": "Implemented a complete category system I worked on the PR a friend of mine has submitted. It was originally ultra buggy and it crashed. I improved the Ui and the dialogs as well as corrected the crashes."}, {"post_id": 58953, "ts": "2026-08-31T14:52:16Z", "hours": 2.5906, "text": "Implemented ktlint and formatted whole codebase I spend a lot of time actually getting ktlint to work and once it was working, I had to format alot of things myself because it was not auto-fixable by ktlint."}, {"post_id": 58232, "ts": "2026-08-30T16:18:42Z", "hours": 3.9097, "text": "New minor release: 4.1.2 So I just published some little work I did, and the reason why is that I successfully find, after many failed attemps over the months) to hide the status bar , when the app is in fullscreen and that you open a modal bottom sheet. This was android’s default behavior to alway show them and that was ugly. Also, I did some pretty heavy work implementing ktlint into the app and running the checks and formatting. I had lots of non auto-resolvable issues that I had to solve by hand, like renaming files etc… Finally, I added a CI pipeline that runs a a lint check build and unit test for each commits in order to check the app’s sanity."}, {"post_id": 57938, "ts": "2026-08-30T08:42:03Z", "hours": 2.9967, "text": "Fixing the animation with the current offset in the main screen It’s been a while now that there was a subtle bizzare bug with this animated offset, and all of this was caused by a states mishandling and disalignment. I fixed that after stuggling for 2 hours debugging Here’s the final code result: And sadly I can’t manage to share videos , so here’s a picture of what happens under the hoods"}, {"post_id": 57585, "ts": "2026-08-29T19:36:39Z", "hours": 7.3111, "text": "Working on new update: 4.1.1 I was finishing and polishing everything for the nest minor version, noethign really huge in this one, but a clear improvement of all the UI, dialogs, and performance. Here’s the new changelog for the 4.1.1: 4.1.1 (Labyrinth) 2026-08-29 [NEW] Dragon Launcher WIKI! Check on GitHub Can customize angle a which points are snapped (defaults to 15°) Complete UI refactor and old dialogs refresh [IMPROVED] Revrote global navigation system to a viewmodel for performance and stability improvements Transformed several dialogs and pickers to modal sheets [FIXED] Global UI tweaks New navigation animations Correctly clears search query Corrected floating apps not openning"}, {"post_id": 56664, "ts": "2026-08-28T14:52:08Z", "hours": 7.9608, "text": "#Started working on global app optimizations. Lots of ppl told me some part of the app lags, so I started yb duty to optimize it as much as possible. Right now, I was putting each state items to viewmodels, in order to avoid reading disk the most, and also survive configuration changes. Also I did a pretty cool update on the color picker tab"}, {"post_id": 55220, "ts": "2026-08-26T20:04:08Z", "hours": 5.0217, "text": "Continued to work on ths compose lock library I’m using an external lib to provide the lock screens to Dragon launcher, and I improved it a lot!!! Basically, I rewrote the whole pin code thing, and then also the patter lock, because the used code was a bit old."}, {"post_id": 55008, "ts": "2026-08-26T13:11:50Z", "hours": 8.0697, "text": "Working on the Lock Screen UI since Yesterday!! I was trying to improve the pin lockscreen of my app, but I ended up trying to reproduce as closely as possible the Google Pixel lock screen, as I really like it alot! In the end, I’m pretty proud of the result, even though it ain’t finished yet, but I’m quite close!!!"}, {"post_id": 54411, "ts": "2026-08-25T12:43:23Z", "hours": 329.5175, "text": "Backup of previous hours from macondo. This devlog is not meant to log hours, I’m just migrating the project from macondo (even finished) to this one. since I link the same hackatimep project, there are a coupla more hours than allowed lol"}]...
|
Title: Dragon Launcher by @elnix | Stardance
Devl Title: Dragon Launcher by @elnix | Stardance
Devlogs:
Backup of previous hours from macondo. This devlog is not meant to log hours, I’m just migrating the project from macondo (even finished) to this one. since I link the same hackatimep project, there are a coupla more hours than allowed lol
Working on the Lock Screen UI since Yesterday!! I was trying to improve the pin lockscreen of my app, but I ended up trying to reproduce as closely as possible the Google Pixel lock screen, as I really like it alot! In the end, I’m pretty proud of the result, even though it ain’t finished yet, but I’m quite close!!!
Continued to work on ths compose lock library I’m using an external lib to provide the lock screens to Dragon launcher, and I improved it a lot!!! Basically, I rewrote the whole pin code thing, and then also the patter lock, because the used code was a bit old.
#Started working on global app optimizations. Lots of ppl told me some part of the app lags, so I started yb duty to optimize it as much as possible. Right now, I was putting each state items to viewmodels, in order to avoid reading disk the most, and also survive configuration changes. Also I did a pretty cool update on the color picker tab
Working on new update: 4.1.1 I was finishing and polishing everything for the nest minor version, noethign really huge in this one, but a clear improvement of all the UI, dialogs, and performance. Here’s the new changelog for the 4.1.1: 4.1.1 (Labyrinth) 2026-08-29 [NEW] Dragon Launcher WIKI! Check on GitHub Can customize angle a which points are snapped (defaults to 15°) Complete UI refactor and old dialogs refresh [IMPROVED] Revrote global navigation system to a viewmodel for performance and stability improvements Transformed several dialogs and pickers to modal sheets [FIXED] Global UI tweaks New navigation animations Correctly clears search query Corrected floating apps not openning
Fixing the animation with the current offset in the main screen It’s been a while now that there was a subtle bizzare bug with this animated offset, and all of this was caused by a states mishandling and disalignment. I fixed that after stuggling for 2 hours debugging Here’s the final code result: And sadly I can’t manage to share videos , so here’s a picture of what happens under the hoods
New minor release: 4.1.2 So I just published some little work I did, and the reason why is that I successfully find, after many failed attemps over the months) to hide the status bar , when the app is in fullscreen and that you open a modal bottom sheet. This was android’s default behavior to alway show them and that was ugly. Also, I did some pretty heavy work implementing ktlint into the app and running the checks and formatting. I had lots of non auto-resolvable issues that I had to solve by hand, like renaming files etc… Finally, I added a CI pipeline that runs a a lint check build and unit test for each commits in order to check the app’s sanity.
Implemented ktlint and formatted whole codebase I spend a lot of time actually getting ktlint to work and once it was working, I had to format alot of things myself because it was not auto-fixable by ktlint.
Implemented a complete category system I worked on the PR a friend of mine has submitted. It was originally ultra buggy and it crashed. I improved the Ui and the dialogs as well as corrected the crashes.
I released a small changes update: Updated nest managment sheet (rework) Hold menu entries setting behavior fix F-Droid reproductible builds failing Correct race crash condition in charging animation. With all these fixes, the 4.1.1 was released!!!!
Various optimizations and ui fix Thanks to the new stargazers on github, I’m almost at 300⭐!!! I accepted a pull request from a friend that corrects some early performance issues I fixed multiple issues that related a crash I optimized several part of the launcher that were laggy and / or did not feel smooth I refactored the color picker to have something wayyy cleaner!!
Complete refactor of the welcome screen: I wanted to change it since a while now, so I did it! Here’s rhe new version, its a vertical scrollable pager that fully integrates the power of gestures!! I also added an easter egg in that version, when you select the “flashbang theme” from the color theme selector, it’ll play a flashbang grenade sound🤣
Refactoring the app to improve performance. So recently I’ve been refactoring the app by moving some logic inside the viewmodels, reducing the amount of RAM the app uses and this, along with some minor optimizations and small features will be the next version. (soon!) Also, i added a new button in the Preset rows to import your themes aditionaly to exporting them. All of this into a clean json you can share Lots of people have been joinning the discord since last version and that’s super cool!!!
Completely reworking the points setttings gesture system. So I’m refactorging this entire screen too allowsuper fine gesture control. before there used to be abutton to toggle botween 2 modes, but now only the gestures are responsible for that!! Also, I’m created a ALL NEW initialization system to allow you to easily import your apps to the nests the first time you launch dragon
Implementing completely new initialization screen. So I’ve been workijg on this new screen after that alot of ppl asked me to make more easy their integration to the launcher. Basically this will use hte usage stats permissions to get the recent apps (and most used) on your phone, and place them one by one on the circles. By default I keep them as circles to avoid users to be lost.
Implementing fixed nest feature So this is an issue one of my user asked long ago, the ability to have a nest fixed in place. So I’ve been implementing this for the past couple hours, but the only issue is that I’m now againsts a wall, and I have to refactor a very bit part of the gesture system to make everything work cleanly. Basically, I am moving all the heavy gesture logic that was in Compose to a single shared viewmodel to avoid the repetitions.
Complete refactor of the whole launching process So basically, in my previous devlog, I was talking about the new feature I made, to drop the nests in a position and keep it there. but when coding it, I noticed alot of off things in my old code, that was holding there for a while now. What I did recently, is that I moved all the gesture logic to the SwipeService class (an internal injected dependency) to centralize all the gesture logic, instead of keeping spread around in Compose. I’m really proud of myself, ngl!!
Finished refactoring the gesture system!! So basically, after tons of ours coding this stuff, I finally launched the release, it should finish the build soon. Here’s the changelog for this version! 4.4.0 (Smaug) 2026-10-04 [NEW] Complete refactor of all gesture system (real big ngl) New locked nest system [IMPROVED] Widgets tab UI Global UI refinements [FIXED] Icon rendering logic [NOTE] Removed migration system from 4.0.0
4.4.2 (Smaug) 2026-10-07 [NEW] Recent apps display a recent badge (will be improved soon) [IMPROVED] Category feature dialogs rework Drawer-related bugs and rework Optimization of core functions for performance [FIXED] Bottom sheets UI fixes
I’ve been fixing and adding small features the recnet times, and Iwill soon release a next version! Here are the recent commits I made: feat(workspace): add not in nests workspace type, closes #450 fix(ui): improve Ui of the App detail info bottom sheet and long press popup fix(ui): change typography styles for TextWithDescription feat(ui): add switch icons un the thumb fix(i18n): Merge remote-tracking branch ‘weblate/main’ feat(top-preview): Add scale parameter for the new point preview mode fix: AppDisplayTab was resetting colors, it now resets the UISettingsStore feat(display): define 2 modes for the top display dragging overlay: new and legacy . fix(ui): move permissions tab into advanced sub-menu of main settings screen
Finally, Update 4.5.0!!!!Her’s the changelog!! 4.5.0 (Komodo) (2026-10-11) NEW Permissions tab in settings 2 modes for the dragging overlay, to choose whether to render the nests or not Add a new workspace: the apps not yet in the nests New settings to make the categories openable by clicking on them (and apps) IMPROVED Small UI improvements everywhere FIXED Big icons loading issue due to race-conditions in core points logic Small issues with reset behavior ⚠️ Play Protect Warning Due to Android restrictions, disable Play Protect during installation to avoid Dragon being blocked.
Various optimisations all around the app I’ve been closing issues and managed to reduce the number of them to less than 20!! And furthermore, alot o them are actually feature request that i may implement one day
Adaptative layout !! So, I’m building the adaptative layout my app needed, and some people wanted, before it was locked in a portrait orientation, but I remove that lock and build a different ui for several screens for them to adapt to the horizontal layouts. This is useful for the rotation, and the larger devices, such as the tablets...
|
1792777991.8261201
|
1793382791.8261201
|
|
1983
|
rasterminal by @PavolUlicny | Stardance
|
PavolUlicny
|
1
|
470.39
|
8580
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T16:24:17Z", "hours": 449.0, "multiplier": 19.99, "payout": 8580, "blessing": "neutral", "text": "rasterminal rasterminal is a 3D model viewer in the terminal Why i decided to build it The original idea didn’t really have any big inspiration, I’ve just always been fascinated by the inner workings of 3D and how that all works. I’ve been wanting to build a project involving 3D for a while and I didn’t want to make just another program that uses libraries and GPU drivers to do all the work. So I came up with the idea: a software rasterizer that renders in the terminal! There are lots of TUIs and lots of boring old software rasterizer projects, so I just combined the two into something unique. And over time, I realized I could make it an actually useful tool, with no real competition: a 3D model viewer in the terminal. Sure, there are some similar projects on GitHub (like taigrr’s trophy), but none are actually usable with heavier models or support pixel graphics. What I learned I learned a lot. I really mean a lot. Anything from math and rendering to how terminals work and how to control them using escape sequences. I don’t want to sit here and name everything I learned over the period of the last 5 months, but I can confidently say that this project really taught me how much work goes into everyday software and how to actually develop and maintain a project professionally. The future of rasterminal The whole project is very far from done. You can see that from the latest release version: v0.1.0-alpha.2. I’ve got a lot of work to do and I’ve roughly got the major landmarks mapped out. Main things I definitely want to change/add at some point before v1 are: Add animation support (currently can only render still meshes) Complete the renderer (complete support for basically every feature of every format that makes sense to support) Add optional GPU acceleration (after I’m satisfied with everything else) Hardware / OS support Supports every major OS (Windows, Linux, MacOS, and any other POSIX-based OS, so practically everything), and every CPU that I could think of (any architecture, 32 or 64bit). You would have to actually try a to find a platform that it doesn’t support (most of the unsupported hardware are big-endian systems, which are basically phased out completely). This is one of the main goals of the project, so (almost) any modern machine with a terminal can run it. Special thanks Special thanks to anyone who followed, liked, helped, or otherwise supported the project in any way. I wouldn’t have had the motivation to push it this far if it wasn’t for you guys.", "repo": "https://github.com/PavolUlicny/rasterminal", "demo": "https://github.com/PavolUlicny/rasterminal/releases/tag/v0.1.0-alpha.2"}]...
|
[{"post_id": 70278, "ts": "202 [{"post_id": 70278, "ts": "2026-09-18T21:10:51Z", "hours": 6.11, "text": "Code quality and CI improvements Finally did the long overdue main loop refactor. The main loop is now way shorter, more readable and more testable. I just split off some of the main loop’s work into it’s own modules, which made them way better looking and also, since they are now standalone modules, actually testable. A big win for repo structure. In the process, I also replaced the input handling’s long if chain that made each character do it’s job with a switch statement. It’s more readable and theoretically faster, although since I compile it with -O3, it probably made no difference or an unnoticeable one at best. I also finally fixed the super long CI times. Until now, CI used to take ~50 minutes (depending on how fast the GitHub runner was) because of cppcheck. Everything else finished in under 10 minutes, but cppcheck stalled it for an hour. It was stalling in mesh_assimp.cpp (the assimp wrapper) for most of it’s runtime. I always thought it was because assimp is a very large library. So I experimented with it a little. I included everything I include in the wrapper into a test file with a little code and ran cppcheck on that. It finished in less than 10 seconds. Eventually, I found out it was somehow taking that long because the main loader function was too long and handled too much by itself. So i just refactored it into 3 separate functions, without changing the behavior at all. Somehow, I still don’t get why, it reduced the whole cppcheck run to 9 minutes. a more than 5x improvement, just because I split a function into more functions. I’m not complaining, but it’s definitely weird. CI is now way faster and adding new things is gonna be way smoother now."}, {"post_id": 68728, "ts": "2026-09-15T17:06:41Z", "hours": 6.6975, "text": "Miscellaneous fixes and improvements Fixed two races in platform code (one MacOS, one Windows) Removed build flags that disabled some compiler security hardening at the cost of a little performance Fixed the test framework to not freak out on NaN in near assertions Improved thread launching and handling in loaders and renderer So overall just boring fixes and improvements, nothing special."}, {"post_id": 66825, "ts": "2026-09-12T18:42:57Z", "hours": 8.5847, "text": "Refactored the platform layer The whole platform layer was just one file until now. Since I did a lot of work on it recently, it grew to over 2400 lines of code. It was super confusing and disorienting. So I decided to refactor it (split it) into 8 files, based on what they handle: console.h - saving/restoring terminal state control.h - termination signal handling file.h - file operations (64bit) input_reader.h - handling input (not parsing, that is it’s own file) shared_memory.h - shared memory handling for the kitty protocol terminal_io.h - writes output to the terminal terminal_query.h - querying the terminal for things like graphics capability, etc. timing.h - frame timing and sleeps"}, {"post_id": 64252, "ts": "2026-09-08T14:55:07Z", "hours": 2.3467, "text": "Last pre-release checks and cleanup I’m finally ready to release v0.1.0-alpha.2. Only notable thing I changed here is that I changed the default thread count: It now defaults to hardware concurrency everywhere. Other than that, I of course did final documentation checks and fixes and now I’m just waiting for CI to pass so I can tag it and let the release workflow do the last step. So this is hopefully the last devlog before my ship!"}, {"post_id": 63837, "ts": "2026-09-07T20:19:19Z", "hours": 10.4164, "text": "Did some polish and cleanup of the platform layer Did final polish and cleanup of the platform layer since I want to actually finally cut a release relatively soon and I just did a lot of work there. Fixed things like useless tests, outdated or wrong comments and some platform specific quirks. Probably actually gonna cut a release soon (this time for real). Also added early rejections for BVH and CSM files, since they contain no model geometry (they can’t currently be displayed at all) and documented the change. The code is basically done (hopefully, I really don’t want to find another big gap that’s gonna take a week to close), I just want to correct anything wrong in the README, changelog, manpage or help menu and maybe make them look a little better before cutting a release and shipping."}, {"post_id": 62122, "ts": "2026-09-05T11:43:50Z", "hours": 9.5678, "text": "Working on SIGSTOP and SIGCONT handling SIGSTOP and SIGCONT are POSIX signals for stopping and resuming a running process. I’m working on adding handling for these, so you can safely pause and unpause rasterminal at any time. This is a lot of work, since until now, we just set up the terminal on program start and cleaned up when the program exited. There’s a lot of quirks and weird scenarios that I have to handle, for example if another signal gets sent while cleaning up the terminal for SIGSTOP. I’m trying to catch as many edge cases by just doing random things while using the program and also with the help of AI to come up with potentially uncaught scenarios."}, {"post_id": 59763, "ts": "2026-09-01T18:10:34Z", "hours": 4.3639, "text": "Added handling for SIGINT, SIGTERM, SIGQUIT and SIGHUP I don’t really have much to say here, I just added the full per-spec handling for all these. Only remaining POSIX-only gap is now SIGSTOP/SIGCONT (stop/resume process). I’m also starting school now, so I’ll be working on this less."}, {"post_id": 58964, "ts": "2026-08-31T15:12:04Z", "hours": 3.8394, "text": "Fully fixed and merged the first POSIX cleanup item Well, would you look at that! That took significantly less time than the Windows fix. It is partly because it was a smaller fix and only part whole POSIX fix, while the Windows one was the whole thing and also the foundation had already been laid out from the Windows work and I just integrated the POSIX path into that, but it is also very much because Microsoft is a horrible, terrible company that can’t make good software. I mean, look at GitHub, they have been going downhill ever since they got acquired by Microsoft. Now that I got that out of my system, here’s what was fixed: If the program cannot enable raw mode at startup, it safely fails instead of continuing and corrupting the terminal state If the cleanup gets interrupted, it retries cleanup so it doesn’t leave the terminal state corrupted after one failed attempt Onto the next POSIX fix: handling SIGQUIT and SIGHUP."}, {"post_id": 58269, "ts": "2026-08-30T17:14:59Z", "hours": 8.6936, "text": "Merged the full Windows console restoration branch My nightmare is over. I hopefully won’t have to deal with Windows for a while now. Summary of what is now fixed/handled on Windows: Ctrl+C, Ctrl+Break and Q exits fully recover the terminal’s state Ctrl+C and Ctrl+Break don’t leak mouse escape sequences into the next prompt if you terminate while actively dragging a model A bunch of other minor Windows or cmd.exe specific quirks Only thing that isn’t handled (didn’t find a good way to handle it) is task manager “end process”. It kills the program without cleaning up and sometimes freezes the shell."}, {"post_id": 56881, "ts": "2026-08-28T21:26:16Z", "hours": 9.6883, "text": "I HATE WINDOWS Windows just doesn’t work. It doesn’t work. Nothing works on Windows. Everything breaks. I don’t get it. THE UNIT TESTS PASS ON WINDOWS CI BUT WHEN I ACTUALLY RUN THE TESTS ON WINDOWS IT FAILS????? HOW IS THAT EVEN POSSIBLE. The release is now definitely getting delayed by at least a week because I keep running into more and more and more and more and more and more and more and more and more issues. I hate Windows. Microslop is the only company that could mess up a basic terminal emulator. And I also have to reboot my PC every time I fix something and push it and then reboot to get back to linux. this is torture. At one point I tried to do it on a Windows VM on linux but that was too slow so I just gave up."}, {"post_id": 55585, "ts": "2026-08-27T15:06:53Z", "hours": 8.8714, "text": "Found a bunch of terminal cleanup gaps Most of them are Windows or cmd.exe specific (nothing ever works on Windows), but some are present on POSIX too. The Windows specific ones are: cmd.exe for some unknown reason doesn’t turn off the raw input sequences, so arrow keys don’t work like they should, even though I explicitly turn it off (????????) (I hate Windows, they always have to do something unexplainable for no reason just so your code doesn’t work as it should) when you terminate the program with ctrl+c or ctrl+break while actively dragging the model around, it sometimes leaks mouse escape sequences into the next prompt bunch of other weird small stuff that nobody cares about And the few on POSIX are mostly ctrl+z suspend/resume behaviour not recovering the terminal and the same thing with ctrl+\\ (SIGQUIT). I’m still working on fixing these. Most of the windows ones are already fixed, but I haven’t even started with the linux/POSIX ones. I have postponed the planned release to when I fix these + any other issues I find."}, {"post_id": 54695, "ts": "2026-08-25T19:14:01Z", "hours": 10.7308, "text": "Cutting a release The repo is in a pretty complete and polished state, so I’ll cut a release here. This will also probably be the last release before I ship, so I’m making sure that nothing is broken and everything works on every platform. I’ve still got a lot of work to do though, even after the end of stardance, like animations, glTF PBR, format completeness for every format, GPU acceleration, etc."}, {"post_id": 53861, "ts": "2026-08-24T15:48:08Z", "hours": 10.9639, "text": "Merged the full assimp integration into main I really don’t have much to say here, I’ve already put all the info about the branch into the past devlogs. All the formats work and the wrapper is very sturdy. I’ve found more bugs in assimp itself than my code (devlog on that soon). So, rasterminal can now load basically any 3D model you throw at it. Some of the formats assimp supports are so niche, I’ve never even heard of them."}, {"post_id": 53278, "ts": "2026-08-23T18:46:58Z", "hours": 13.1411, "text": "Fuzzing my assimp wrapper I’m trying a bunch of hand-crafted models from all the formats that I can load and trying to find things that dont load or render properly. Also had AI write me a simple fuzzer in python and I’m just letting it run for a few hours. Also auditing the assimp loader paths against my wrapper to find any format specific behaviour that should be handled. I’ve already found a bunch of things and I’m still finding more. Assimp has a lot of weird quirks and issues that I keep running into. Honestly kinda regretting the decision to integrate it, but since I’m already so deep in, I’ll just keep going."}, {"post_id": 52574, "ts": "2026-08-22T19:13:37Z", "hours": 11.0969, "text": "Still working on the assimp intgration Currently trying various models from all the different model formats that assimp loads. So far found a segfault, some weird behavior and integration mistakes that I made. Also found a small bug in assimp itself, for which I’ve submitted the PR with the fix to their GitHub repo. For anyone interested, here’s the PR: https://github.com/assimp/assimp/pull/6799"}, {"post_id": 51884, "ts": "2026-08-21T19:41:32Z", "hours": 6.9825, "text": "Working on assimp integration Yop, I’m adding the Open Asset Import Library as a fallback for any model formats that aren’t natively supported with their own dedicated loader (only ones with dedicated loaders are glTF2, PLY, STL and OBJ). I’m still keeping the dedicated loaders, because they are more feature-complete, to-spec and wayyy faster (especially the glTF one). I added it because I feel like for a 3D model viewer, support for many formats, even niche and obscure ones, is pretty important, even though nobody might use them. This roughly doubled compile time and almost quadrupled binary size, which also made CI take way longer (of course). It somehow made the MacOS runners take 50 minutes to compile (from the previous 3 minutes), but I fixed that by bounding the number of processes CMake can spawn to the number of threads on the runner (previously was using -j which spawns as many as it wants and it was spawning about 230 of them). I’m still testing how it handles various model formats and trying to find any reachable segfaults."}, {"post_id": 51275, "ts": "2026-08-20T20:14:42Z", "hours": 6.7119, "text": "Cleanup and restructuring changes After I just merged three big feature branches (kitty and sixel graphics protocols and the high-res performance branch), I needed to do some overdue cleanup and refactoring. And so I did: Collapsed the super long changelog entries into way more readable and legible points Restructured the src directory into multiple subdirectories because it had like 50 files already Sadly completely removed the Make build system, so now you can only build with CMake (CMake is very much evil and even more evil but it’s the only one of the two that supports windows and I was tired of managing two build systems) Removed the –graphics-scale flag, so now everything renders at native resolution And some small docs and comment cleanup"}, {"post_id": 50683, "ts": "2026-08-20T00:07:13Z", "hours": 12.3297, "text": "Finally merging the performance branch It’s finally time to merge the performance branch. I basically redesigned the whole renderer and rasterizer around high resolution workloads, where it would still choose the old high-poly paths where they were faster. Even snuck in some SSE2 SIMD code (picture), although I will probably be switching to a dispatch SIMD library like Google’s Highway. Not entirely sure it will be Highway or even if I will do that yet, that depends on the code complexity and before/after benchmarks."}, {"post_id": 49184, "ts": "2026-08-17T20:28:00Z", "hours": 14.5689, "text": "Still optimizing… Spent the first ~7 hours trying to find microoptimizations and each one was either a wash or worse somehow. The compiler works in mysterious ways. At some point, I just gave up and let Claude have a go at the optimizing. Surprisingly it actually came up with a lot of interesting optimization techniques and solutions that I definitely couldn’t have come up with on my own. But it found so much, that the whole diff adds 5k lines of code. So now I’ll be cleaning up, testing, and maybe further optimizing that diff…"}, {"post_id": 48227, "ts": "2026-08-16T15:09:59Z", "hours": 3.5944, "text": "My reported bug in libtermkey has been fixed in the newest version Just got an email from one of the maintainers that the crash bug i reported a month ago was fixed in the new release. libtermkey is a terminal input parsing library that I considered using and found a crash bug in. The bug was already fixed in neovim’s fork of the library, so i just pointed the maintainers at that fix. For anybody interested, here’s the issue link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891"}, {"post_id": 48078, "ts": "2026-08-16T11:20:07Z", "hours": 11.47, "text": "Working on improving performance With the addition of the high-res protocols, the target resolutions quickly went from hundreds or thousands of pixels to millions. So I now desperately need to improve performance. So far it’s looking promising: A whole model covering the camera 6 moving at 4k went from about 8 fps to 20-30 fps. Not ideal yet, but I think we’re on the right track. Super dense meshes (more than 2 million polygons) improved 2-3x Meshes with transparent parts improved about 2x While these wins may seem really big (they kinda are), the jump in resolutions still means they are barely usable interactively. I do want to add gpu acceleration later (with the cpu path as a fallback), but until then I want to make it as fast as I possibly can."}, {"post_id": 47112, "ts": "2026-08-14T19:18:15Z", "hours": 9.0333, "text": "Fully merged sixel Fully merged the sixel protocol implementation. Works on all platforms everywhere that supports it. So now both high-res terminal protocols done. Moving onto other minor things and especially performance."}, {"post_id": 46486, "ts": "2026-08-13T18:38:49Z", "hours": 10.6753, "text": "Working on adding full Sixel support Working on adding support for the other mainstream terminal pixel protocol of the main two - Sixel. Already did fully implemented the kitty protocol last time, so once I’m done with this one, I’ll be done with terminal protocols (at least for the near future, hopefully). There are some other ones like the iterm2 protocol, but that one’s pretty rare and I won’t add it unless I really don’t have anything better to do. It’s basically done, just need to polish it and test it on a bunch of terminals and operating systems to make sure everything works before merging."}, {"post_id": 44676, "ts": "2026-08-10T16:23:20Z", "hours": 4.0767, "text": "Fully merged and done with Kitty Finally completed the kitty protocol implementation. It is kinda slow, since the resolution is so much bigger, so I will try to optimize the high-res performance even more. So now the next two big milestones are: Add Sixel on top of kitty, that’ll be a lot of work Optimize the rasterizer even more I was thinking of maybe adding gpu rendering as an option for super large meshes or high-res scenarios, but idk. I’ll definetly keep the pure cpu renderer for computers without gpus, but I’m not sure about a gpu implementation. It would be hard to do, less portable and it might not even work that well."}, {"post_id": 44513, "ts": "2026-08-10T09:59:08Z", "hours": 6.8483, "text": "Found a bug in Ghostty’s kitty protocol handling Ghostty is a modern and fast terminal emulator that i personally use. While testing the kitty protocol feature in rasterminal, I found a Ghostty bug that lagged my whole computer after a few minutes. I tested it in Kitty (terminal emulator) and there it worked fine. I looked at Ghostty’s code vs Kitty’s, found the bug and reported it to the Ghostty maintainers. Mitchell himself (the creator) fixed it in like 2 hours. Honestly I’m kinda sad I didn’t get to become a contributor and fix the bug, but since it was a small fix and I already described it in the issue, I get why Mitchell just fixed it in main. Here’s the full issue: https://github.com/ghostty-org/ghostty/discussions/13719"}, {"post_id": 43513, "ts": "2026-08-08T20:35:37Z", "hours": 7.6361, "text": "Working on adding support for the Kitty protocol Some modern terminals like Kitty and Ghostty have support for the Kitty protocol. It’s a feature that allows you to display high resolution content like images and videos in the terminal without it looking super pixelated. There’s also the Sixel protocol, which is basically the same thing but a little worse and more widely supported (even Windows terminal has it). I’ll add Sixel after i merge Kitty to main. It is very clearly a worthwhile feature and I have been planning to add it from the start of the project. Today I finally decided that it’s time. Most of the work is already done on the branch and i’m just polishing out the bugs and issues before I merge. In the photos, you can see the comparison between using just the block characters and using Kitty. It is a night and day difference. Although the performance isn’t great at that high of a resolution, but I’m still working on optimizing that."}, {"post_id": 42752, "ts": "2026-08-07T17:00:51Z", "hours": 3.5125, "text": "Minor comment cleanup Just did some comment cleanup: Deleted redundant comments and why comments Removed separator comments Compressed or rewrote some really long comments (without removing the info they give)"}, {"post_id": 42161, "ts": "2026-08-06T19:24:06Z", "hours": 8.2153, "text": "Added issue templates + contributing documentation Added templates and a config for submitting GitHub issues, for both bug reports and feature requests. Also added a CONTRIBUTING.md for clear instructions on how to make, structure and audit code contributions. (tests, linters, formatting, etc.) I tried to make some optimizations to the renderer by auditing the compiler generated assembly and looking for inefficiencies, but everything i tried turned out to actually hurt performance. And GitHub actions decided to have a major outage right when i pushed the commits, so that’s awesome"}, {"post_id": 39599, "ts": "2026-08-02T18:05:04Z", "hours": 7.4436, "text": "Completely redesigned and rewrote the HUD The HUD used to be just a single line at the bottom of the screen aligned to the left. It looked pretty bad, but it did tell the user everything they needed to know. [picture 1] First, I added model name sanitization, so models with control bytes like newline ( \\n ), line feed or other symbols like emojis can’t break the whole program when trying to display them in the HUD. Then, I completely redesigned the whole HUD to look better and be more robust, while still telling the user everything they need to know. I went with this design [picture 2]: On the left, you only have the model name. In the middle, first you have the current shading mode (highlighted in cyan), then the lighting mode in plain white and then the background color in gray. All three middle indicators are separated with a dot and are different colors, so nobody can confuse them. On the right, there’s 3 boolean indicators: spin (if the model spin is on), backface cull (if it’s currently culling backfaces) and texture (if it’s showing the texture, isn’t there at all on models without a texture). They are gray if inactive and cyan if active. The last thing on the right is just the fps number. There can also be optional indicators: Wireframe color (in the middle, after the shading mode) which only shows up in wireframe mode. [picture 3] First person speed multiplier (on the right, between the bools and the fps number) which shows up only in first person mode. [picture 4] I also made each “island” cleanly disappear when the terminal’s width is too low instead of just slowly getting cut off letter by letter. I think this design looks better, less cluttered and is pretty easy to understand at a glance. I would very much appreciate a star on GitHub!"}, {"post_id": 38478, "ts": "2026-07-31T21:36:35Z", "hours": 7.7572, "text": "Did a smaller fix and added a pretty big feature First, let’s talk about the small fix: I Fixed a super long model name showing up in the HUD in it’s full length, often blocking out other HUD elements. Previously, the HUD would display a model name of any length. Now there’s a hard cap of 24 chars, with any name longer than that truncated (middle style truncation) to fit into that limit. And now the big feature: Added a first person noclip-style camera mode. It’s accessed with the –first-person flag and let’s you explore the model as a floating camera (not bound like the default orbit camera). It was honestly easier to implement than I thought it would be. With it, I added two new keybinds special to the first person mode - E and V for going up and down. They don’t do nothing in orbit mode. Also added a second –first-person-speed flag for controlling the initial movement speed. It is also controllable during runtime with scrolling or +/- (I didn’t know what to bind these to in this mode since you can’t zoom like in orbit mode and this was the only place where they fit). In the photos, you can see some angles taken in the first person mode that weren’t possible in the default orbit mode."}, {"post_id": 37806, "ts": "2026-07-30T19:08:29Z", "hours": 2.7436, "text": "Finally committed and pushed the input rework Tested it on both linux and windows and everything seems to work. No inputs interpreted as other inputs, all edge cases handled, just works. Finally can move onto other things."}, {"post_id": 37656, "ts": "2026-07-30T15:25:21Z", "hours": 9.285, "text": "Still working on the input parsing system It is very hard and I keep finding bugs and reasons to redesign it. I’m in pain. I do think I’m getting closer to the final robust design."}, {"post_id": 36697, "ts": "2026-07-28T22:28:53Z", "hours": 9.9361, "text": "Working on completely rewriting the current input parsing handling The current input handling is subpar at best; it interprets a lot of random keys as escape, which currently quits the program (This will also be changed to Q and Ctrl+C only. Kind of a no-brainer since this is the more standard choice for TUIs - for example btop - and it also means I don’t have to deal with the headache of distinguishing function keys and others from escape) and has a lot of other quirky behavior that needs fixing. I’ll also try to improve robustness against malformed input like a leaky SSH session. There are a lot of various edge cases and situations where you have no way to distinguish real input from malformed input. This is all a very major pain in the ass. And I thought figuring out the raw mode output would be the hard part. And after all this, I’ll end up with way less attention than strictly slower, less robust competitors, just because they already have an audience from other projects. I bet nobody will even read this. I’m basically talking to myself right now. Or maybe, just to spite me, the algorithm will push this more than my other devlogs."}, {"post_id": 35924, "ts": "2026-07-27T17:55:43Z", "hours": 8.7953, "text": "So, i found two memory bugs in a widely used terminal input library I was researching terminal input libraries to use for this project because my current approach was so buggy that it wasn’t worth fixing. Both of them are memory bugs in the libtermkey library. There are forks of the lib with this fixed, but since many projects still rely on this lib, i submitted them anyways. I’ve also confirmed that the bug is present on my machine on Ubuntu 24.04 LTS on Neovim, because it links the vulnerable shared library. I didn’t mark them as CVEs (hopefully that isn’t a problem). If anyone want’s to look at the bug reports, they are at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891 and https://bugs.launchpad.net/ubuntu/+source/libtermkey/+bug/2161916"}, {"post_id": 33607, "ts": "2026-07-23T17:38:48Z", "hours": 4.5575, "text": "Added more CLI flags for startup customizability Added flags to set the camera pitch, yaw and zoom on startup. Now every runtime-settable variable can be set during startup through the CLI. The R button now resets the state to the CLI set state, not to factory defaults."}, {"post_id": 32607, "ts": "2026-07-21T21:48:11Z", "hours": 4.4442, "text": "Added –spin-speed and –spin-direction flags Added CLI flags for the spin speed and direction. The speed is in deg/s and the directions is simply left or right. Here’s what 1000 deg/s looks like spinning to the right:"}, {"post_id": 30923, "ts": "2026-07-18T22:17:24Z", "hours": 8.6892, "text": "Did a bunch of small code quality and usability improvements Fixed a Windows bug that crashed the program on model sizes bigger than 2GB, improved the orbit usability (fixed mouse drag behavior when models are turned upside down), and did a few cleanups and fixes in the CLI parsing. I’m planning on adding a few CLI flags that I think can be very useful for some people, specifically better spin settings, starting camera angle/zoom control and a few more."}, {"post_id": 29772, "ts": "2026-07-16T21:27:23Z", "hours": 0.7175, "text": "Finally merged color-fallback, I can move onto other things The branch is finally merged. I’ve accumulated a bunch of usability and code quirks and issues that i can finally get to now that the branch is merged. So now I’ll be reworking all the CLI flags, camera and other components. And we also passed the 700 commit mark with this merge!"}, {"post_id": 29484, "ts": "2026-07-16T13:40:29Z", "hours": 4.9444, "text": "Changed the 24bit to 256 color palette conversion logic Until now, the conversion picked the closest color possible mathematically. But from testing on a bunch of different models, I’ve realized that it doesn’t actually look very close to the human eye. So I swapped it out for a different method, called CIELAB distance. Now it still doesn’t look perfect, but as a fallback for older terminals it’s close enough."}, {"post_id": 28408, "ts": "2026-07-14T17:26:16Z", "hours": 9.2258, "text": "Working on a –color compatibility flag The color terminal compatibility thing I was working on has landed in the branch, now I’m adding a –color flag to override the automatic capability detection for situations like ssh, where we almost always degrade to the 256 color pallete for maximum compatibility. So now you’re gonna be able to use the right color mode even if the automatic detection is wrong for your situation."}, {"post_id": 27302, "ts": "2026-07-12T19:23:17Z", "hours": 10.3522, "text": "Working on terminal color capability detection I am adding automatic terminal capability detection, meaning that rasterminal will get the terminal type and either refuse to render on super old or “dumb” terminals, degrade on some terminals and render normally on modern ones."}, {"post_id": 24314, "ts": "2026-07-07T20:18:01Z", "hours": 5.1908, "text": "Working on adding 256 color support Some older terminals can’t display full 24bit RGB colors and use a 256 color palette instead. I’m adding a fallback so the older terminals can still use rasterminal. It still calculates the full old RGB colors, but then just maps them to the nearest 256 color with LUTs. On a side note, I switched my terminal emulator from Kitty to Ghostty."}, {"post_id": 23070, "ts": "2026-07-05T20:10:12Z", "hours": 10.4403, "text": "Working on portability Did a bunch of small fixes and improvements in the last ~week. Right now I’m on vacation for the next couple of days, so I won’t be active. I am currently working on broader terminal and platform support, so older systems and terminals will be able to run cleanly with some fallbacks or will fail loud with a clear message about what isn’t supported."}, {"post_id": 19371, "ts": "2026-06-30T17:34:50Z", "hours": 5.1925, "text": "Completely removed the shadow map Before, rasterminal built a shadow map on model load and displayed it during runtime. I now completely removed it, because it was slower during load, slower during runtime, sometimes looked broken on curved surfaces and added essentially no value. Here, the first picture is with the shadow map and the second is without."}, {"post_id": 18685, "ts": "2026-06-29T21:27:29Z", "hours": 13.4722, "text": "Wasted 7 hours of my life Did a bunch of smaller cleanups and fixes, and then I tried to template the unlit and lit paths in the rasterize_flat function, which turned out to be a performance regression. Awesome."}, {"post_id": 17021, "ts": "2026-06-27T17:00:39Z", "hours": 5.7733, "text": "Added a release workflow, manpage and changelog I added a github release workflow that works alongside the changelog and released the first pre-release version: v0.1.0-alpha.1 Also added a manpage and an install target to make and cmake that installs the binary, docs and manpage into the path."}, {"post_id": 16313, "ts": "2026-06-26T15:28:43Z", "hours": 5.1883, "text": "Pararelized the wireframe shading mode I did a bunch of small things alongside it, but the main feature for this devlog is the pararelization of the wireframe shading mode. It was previously fully single threaded, but it wasn’t that hard to pararelize, i just had to make the function it used to write into the framebuffer (draw_line) CAS atomic, to avoid race conditions. Now wireframe is the fastest shading mode in basically all scenarios. Below, you can see a performance benchmark (built into rasterminal using a flag) with wireframe mode on a super dense mesh and how the wireframe mode looks like (you can also cycle the colors)."}, {"post_id": 15932, "ts": "2026-06-25T21:35:36Z", "hours": 1.9053, "text": "Split the tests into sub-directories The test suite is now very long (20k LOC across 47 files), so i decided to split it into sub-directories instead of just having 47 files in one flat dir. It’s cleaner, more maintainable and looks better."}, {"post_id": 15741, "ts": "2026-06-25T16:48:43Z", "hours": 4.9903, "text": "Completely removed gouraud shading mode Gouraud was previously the main shading mode, but now I’ve just completely removed it. It was by far the slowest, while not adding any actual value to the project. Blinn-phong lighting is faster AND it supports more features (normal maps, etc.), so there was just no point in keeping gouraud. Now that I’ve removed it, the project has less code to maintain and a faster default shading mode with more features."}, {"post_id": 15551, "ts": "2026-06-25T08:50:38Z", "hours": 3.7597, "text": "Added proper OBJ bump map support OBJ bump maps are textures for simulating bumps and wrinkles on models. Blender used to author bump maps as normal maps for some reason, so I made it automatically detect if it’s a normal map disguised as a bump map and handle it well, since there are a lot of old Blender OBJ models in the wild. But it also handles bump maps as bump maps normally, so it’s basically the best of both worlds."}, {"post_id": 15117, "ts": "2026-06-24T15:43:58Z", "hours": 6.87, "text": "Added texture transform into the TEXCOORD branch and merged it into main Not that hard, just read it, pass it to the rasterizer and then display it. I did have a very sneaky bug in the loader that made the whole feature render wrong, where I just had to negate one value to fully fix it, but now everything fully works. Below you can see the Khronos test asset for texture transforms. (tick means fully working, clearcoat is not yet implemented so it doesn’t show as working)"}, {"post_id": 13839, "ts": "2026-06-22T17:59:12Z", "hours": 5.2097, "text": "Added TEXCOORD_1 support glTF sometimes authors a second TEXCOORD set (first one is TEXCOORD_0, 0 indexed numbering). The official spec only requires support for the first two TEXCOORD sets, even though there can theoretically be any number of them in a model. That said, major model exporters don’t author any more than the two sets, so to avoid extra work, I only added support for 0 and 1. (not merged into main yet, I want to polish it a little and maybe add KHR_texture_transform support on top of it first)"}, {"post_id": 12798, "ts": "2026-06-20T22:37:18Z", "hours": 7.6314, "text": "Optimized the transparent cleanup path in the renderer After rendering the model in the transparent path, we have to resolve the transparent pixels, which basically just pastes in the pixels behind it and sometimes tints it based on how dark and what color the transparent material is (tinted glass will make the things behind it darker, normal glass will be mostly completely untinted). Before, the resolve function looped over every single pixel in the frame, even non-transparent and background ones. This is obviously wasteful. So I made it find the smallest box, in which all the transparent pixels of the whole frame fit and just looped over that. It recovered the overhead of the transparent resolve on models with smaller transparent parts, but it also made fully transparent or mostly transparent models slightly slower (it still basically loops over almost the whole screen on these types of models, so keeping track of the smallest bounding box while also still doing the same work as before made it a little slower). But the performance benefits for the average model outweighed the losses on rare fully transparent models. In the image, you can see the benchmark results versus the baseline."}, {"post_id": 12171, "ts": "2026-06-19T21:42:34Z", "hours": 6.6653, "text": "Made the shading mode branches compile time instead of runtime in the renderer with templates Did the same template if constexpr (compile time if branches) thing that we already do for opaque/transparent models with the shading mode (was a runtime per triangle if branch before), which improved performance. It basically just makes a new copy of the function for each shading mode x each transparency mode, so 4x2 which is 8 slightly different functions and uses the correct one on each call. That increases binary size and icache pressure, but drops per triangle or per pixel if branches that hurt performance, so it’s an overall performance win. Benchmarked across a ton of different resolutions, models, shading modes, etc. (the benchmark by itself took like 2 hours to run)"}, {"post_id": 10115, "ts": "2026-06-16T18:24:38Z", "hours": 4.0297, "text": "Added support for wrap modes for textures Only in glTF and OBJ models (the only ones that support it) and verified with the Khronos group sample assets model. Also added PLY texture support."}, {"post_id": 9453, "ts": "2026-06-15T20:20:25Z", "hours": 4.6839, "text": "Working on adding supersampling anti-aliasing Still a work in progress and I might not merge it into main, because it’s a lot of work for not that much benefit. I have to catch a lot of bad_allocs and things like that for super large SSAA sizes, which is really annoying and can affect performance. SSAA works by rendering at a higher resolution and then downscaling for better edges (makes edges smooth and fade-in instead of jagged) Picture with 2x SSAA and without SSAA:"}, {"post_id": 8652, "ts": "2026-06-14T11:36:32Z", "hours": 5.2058, "text": "Adapted the arg parsing and CLI behaviour to the GNU standard Now, rasterminal’s CLI behaves under the GNU CLI standards, so on par with most linux tools."}, {"post_id": 8162, "ts": "2026-06-13T16:37:29Z", "hours": 2.8394, "text": "Added deduplicating vertices to the stl loader. After two unsuccessful and unmerged branches, I finally did something useful on main. I used to deduplicate the vertices in stl_reader and then reduplicate them in the loader. But now, we just dedup in stl_reader and use those. That also allowed me to enable ambient occlusion, which was disabled for stl before. And now crease smoothing fully works too. And it’s faster (runtime wise, load time is slower because of ambient occlusion and crease smoothing that weren’t there before). So an all-round very positive change, and also an end to my non-merging dry spell."}, {"post_id": 7990, "ts": "2026-06-13T10:20:35Z", "hours": 2.4908, "text": "Replaced tinyobjloader with rapidobj for way faster obj parsing But after actually replacing it and integrating it into the source code, i realized it’s not worth it, because rapidobj just has too many downsides and isn’t very actively supported anymore. For example, it doesn’t support multiple mtl files, which is against the spec. So if i want to keep it spec compliant, I need to find a workaround for it, which just isn’t worth the speed increase of rapidobj, even if it’s like 4x faster (from my testing on a large obj) The graph is from this article: https://aras-p.info/blog/2022/05/14/comparing-obj-parse-libraries/"}, {"post_id": 7643, "ts": "2026-06-12T19:26:54Z", "hours": 8.7975, "text": "I tried to rewrite the STL loader from scratch for more performance But it’s taking super long and I’m way too bored with it, so I think I’ll just abandon the branch and work on something else."}, {"post_id": 6791, "ts": "2026-06-11T11:35:25Z", "hours": 3.6575, "text": "Added full native 32 bit support for all platforms Didn’t have to redesign any of the source code (thankfully), just some warning suppressing and fixing some static casts. Also added a CI job that’ll flag future 32 bit compatibility regressions."}, {"post_id": 5755, "ts": "2026-06-09T17:34:17Z", "hours": 4.1133, "text": "Transparency is fully done and merged. Did some polish, cleanup and optimization on the transparency branch and successfully merged into main."}, {"post_id": 4897, "ts": "2026-06-08T13:53:56Z", "hours": 3.2906, "text": "Transparency is basically done, with caveats. Transparency works correctly, but transmission , which is completely different, is simplified to transparency. So for spec-complete gltf, I would need to implement the whole transmission pipeline, which I’m way too lazy to do right now. So for now, we just simplify it to transparency and call it a day."}, {"post_id": 4320, "ts": "2026-06-07T16:09:10Z", "hours": 6.2586, "text": "Working on adding transparency support. For that, I have to completely rework the rendering loop and the rasterizers, so basically the whole core of the project. It’s going very badly. And since performance is a big factor here, I’m going for a template approach so the transparency overhead doesn’t affect non-transparent meshes."}, {"post_id": 3846, "ts": "2026-06-06T22:11:48Z", "hours": 3.5269, "text": "I did a hot-loop performance cleanup run, because the hot loops were getting slower with new features, and I found a big optimization opportunity in clip-near call sites: clip_near slices off the part of a triangle that pokes behind the camera’s near plane, but almost every triangle is fully in front of it with nothing to clip. The pipeline still called it for all of them, and in the compiled binary that common case just copied all three vertices to memory and back, millions of times a frame. The fix was to check inline whether the triangle is fully in front and skip the call entirely if so. Result on a 2.77M-triangle model: median frame time dropped from 21.1 ms to 19.2 ms, about 8.7% faster."}, {"post_id": 3572, "ts": "2026-06-06T15:51:49Z", "hours": 2.4386, "text": "Because of all the libraries I added, the binary size increased significantly. I don’t use most of the vendored code, so I added build flags to ignore unused code in the final binary. Other than that, I added some other performance flags and also a CMakePresets.txt. It took longer than it should’ve, because I tested and benchmarked a bunch of other configs and flags. I put off PGO for now."}, {"post_id": 2939, "ts": "2026-06-05T20:55:20Z", "hours": 3.9267, "text": "I wired in Webp image format support by vendoring in google’s libwebp decoding library. It wasn’t that hard to wire into the source code, the hard part was the vendoring, dealing with licenses and professional vendoring practices. Only thing that remains to add for full gltf extension support is avif image support, but I’ll do that later."}, {"post_id": 2739, "ts": "2026-06-05T14:38:57Z", "hours": 1.3417, "text": "I just added unlit material support, which means materials that are supposed to stay intentionally unaffected by lighting render correctly. Pretty straightforward change, just read it at load time and then check if that material is unlit during the lighting pass and skip it."}, {"post_id": 2631, "ts": "2026-06-05T08:21:00Z", "hours": 3.3225, "text": "Reworked the whole readme with better instructions, screenshots and a gif. The gif was super annoying to polish, because i used asciinema which records all the setup escape sequences so there were gaps at the start and end that i had to manually read and remove. And I also had to perfectly close it exactly when it did one full rotation and that took like an hour to perfect. At least now I don’t have to touch the readme for a while."}, {"post_id": 2311, "ts": "2026-06-04T18:46:14Z", "hours": 3.1892, "text": "Well, I tried to refactor the main rendering loop for like the third time, because it’s horrifyingly indented, but it has defeated me once again. At this point, I’m confident that it’s impossible to do without a noticeable drop in performance, or g++ is just ragebaiting me. I installed a rainbow indentation neovim plugin just to show the absurdity of this."}, {"post_id": 386, "ts": "2026-06-01T18:58:14Z", "hours": 0.6783, "text": "I just implemented KTX2 and Basis texture support, which are special compressed texture formats. So now any models with these textures are viewable in rasterminal."}, {"post_id": 359, "ts": "2026-06-01T17:59:06Z", "hours": 4.5428, "text": "Hey everyone, I want to introduce my project! rasterminal is a full software 3D rasterizer and model viewer that runs entirely in your terminal. The whole rendering pipeline is implemented from scratch. I only rely on third-party libraries for load-time things like 3D model parsing, image parsing, and decompression. It doesn’t touch the GPU at all, running purely on the CPU. That makes it completely safe for SSH usage, though it does come with a performance cost. I use multithreading to recover some of what’s lost, and the result is still significantly faster than any other terminal 3D viewer I’ve come across. Right now I’m focused on broader 3D format feature support and transparent material rendering. If you want to try it out, I’d love to hear what you think, feedback and issues are very welcome over on GitHub. https://github.com/PavolUlicny/rasterminal Thanks for any support! 🙏"}]...
|
Title: rasterminal by @PavolUlicny | Stardance
De Title: rasterminal by @PavolUlicny | Stardance
Devlogs:
Hey everyone, I want to introduce my project! rasterminal is a full software 3D rasterizer and model viewer that runs entirely in your terminal. The whole rendering pipeline is implemented from scratch. I only rely on third-party libraries for load-time things like 3D model parsing, image parsing, and decompression. It doesn’t touch the GPU at all, running purely on the CPU. That makes it completely safe for SSH usage, though it does come with a performance cost. I use multithreading to recover some of what’s lost, and the result is still significantly faster than any other terminal 3D viewer I’ve come across. Right now I’m focused on broader 3D format feature support and transparent material rendering. If you want to try it out, I’d love to hear what you think, feedback and issues are very welcome over on GitHub. https://github.com/PavolUlicny/rasterminal Thanks for any support! 🙏
I just implemented KTX2 and Basis texture support, which are special compressed texture formats. So now any models with these textures are viewable in rasterminal.
Well, I tried to refactor the main rendering loop for like the third time, because it’s horrifyingly indented, but it has defeated me once again. At this point, I’m confident that it’s impossible to do without a noticeable drop in performance, or g++ is just ragebaiting me. I installed a rainbow indentation neovim plugin just to show the absurdity of this.
Reworked the whole readme with better instructions, screenshots and a gif. The gif was super annoying to polish, because i used asciinema which records all the setup escape sequences so there were gaps at the start and end that i had to manually read and remove. And I also had to perfectly close it exactly when it did one full rotation and that took like an hour to perfect. At least now I don’t have to touch the readme for a while.
I just added unlit material support, which means materials that are supposed to stay intentionally unaffected by lighting render correctly. Pretty straightforward change, just read it at load time and then check if that material is unlit during the lighting pass and skip it.
I wired in Webp image format support by vendoring in google’s libwebp decoding library. It wasn’t that hard to wire into the source code, the hard part was the vendoring, dealing with licenses and professional vendoring practices. Only thing that remains to add for full gltf extension support is avif image support, but I’ll do that later.
Because of all the libraries I added, the binary size increased significantly. I don’t use most of the vendored code, so I added build flags to ignore unused code in the final binary. Other than that, I added some other performance flags and also a CMakePresets.txt. It took longer than it should’ve, because I tested and benchmarked a bunch of other configs and flags. I put off PGO for now.
I did a hot-loop performance cleanup run, because the hot loops were getting slower with new features, and I found a big optimization opportunity in clip-near call sites: clip_near slices off the part of a triangle that pokes behind the camera’s near plane, but almost every triangle is fully in front of it with nothing to clip. The pipeline still called it for all of them, and in the compiled binary that common case just copied all three vertices to memory and back, millions of times a frame. The fix was to check inline whether the triangle is fully in front and skip the call entirely if so. Result on a 2.77M-triangle model: median frame time dropped from 21.1 ms to 19.2 ms, about 8.7% faster.
Working on adding transparency support. For that, I have to completely rework the rendering loop and the rasterizers, so basically the whole core of the project. It’s going very badly. And since performance is a big factor here, I’m going for a template approach so the transparency overhead doesn’t affect non-transparent meshes.
Transparency is basically done, with caveats. Transparency works correctly, but transmission , which is completely different, is simplified to transparency. So for spec-complete gltf, I would need to implement the whole transmission pipeline, which I’m way too lazy to do right now. So for now, we just simplify it to transparency and call it a day.
Transparency is fully done and merged. Did some polish, cleanup and optimization on the transparency branch and successfully merged into main.
Added full native 32 bit support for all platforms Didn’t have to redesign any of the source code (thankfully), just some warning suppressing and fixing some static casts. Also added a CI job that’ll flag future 32 bit compatibility regressions.
I tried to rewrite the STL loader from scratch for more performance But it’s taking super long and I’m way too bored with it, so I think I’ll just abandon the branch and work on something else.
Replaced tinyobjloader with rapidobj for way faster obj parsing But after actually replacing it and integrating it into the source code, i realized it’s not worth it, because rapidobj just has too many downsides and isn’t very actively supported anymore. For example, it doesn’t support multiple mtl files, which is against the spec. So if i want to keep it spec compliant, I need to find a workaround for it, which just isn’t worth the speed increase of rapidobj, even if it’s like 4x faster (from my testing on a large obj) The graph is from this article: https://aras-p.info/blog/2022/05/14/comparing-obj-parse-libraries/
Added deduplicating vertices to the stl loader. After two unsuccessful and unmerged branches, I finally did something useful on main. I used to deduplicate the vertices in stl_reader and then reduplicate them in the loader. But now, we just dedup in stl_reader and use those. That also allowed me to enable ambient occlusion, which was disabled for stl before. And now crease smoothing fully works too. And it’s faster (runtime wise, load time is slower because of ambient occlusion and crease smoothing that weren’t there before). So an all-round very positive change, and also an end to my non-merging dry spell.
Adapted the arg parsing and CLI behaviour to the GNU standard Now, rasterminal’s CLI behaves under the GNU CLI standards, so on par with most linux tools.
Working on adding supersampling anti-aliasing Still a work in progress and I might not merge it into main, because it’s a lot of work for not that much benefit. I have to catch a lot of bad_allocs and things like that for super large SSAA sizes, which is really annoying and can affect performance. SSAA works by rendering at a higher resolution and then downscaling for better edges (makes edges smooth and fade-in instead of jagged) Picture with 2x SSAA and without SSAA:
Added support for wrap modes for textures Only in glTF and OBJ models (the only ones that support it) and verified with the Khronos group sample assets model. Also added PLY texture support.
Made the shading mode branches compile time instead of runtime in the renderer with templates Did the same template if constexpr (compile time if branches) thing that we already do for opaque/transparent models with the shading mode (was a runtime per triangle if branch before), which improved performance. It basically just makes a new copy of the function for each shading mode x each transparency mode, so 4x2 which is 8 slightly different functions and uses the correct one on each call. That increases binary size and icache pressure, but drops per triangle or per pixel if branches that hurt performance, so it’s an overall performance win. Benchmarked across a ton of different resolutions, models, shading modes, etc. (the benchmark by itself took like 2 hours to run)
Optimized the transparent cleanup path in the renderer After rendering the model in the transparent path, we have to resolve the transparent pixels, which basically just pastes in the pixels behind it and sometimes tints it based on how dark and what color the transparent material is (tinted glass will make the things behind it darker, normal glass will be mostly completely untinted). Before, the resolve function looped over every single pixel in the frame, even non-transparent and background ones. This is obviously wasteful. So I made it find the smallest box, in which all the transparent pixels of the whole frame fit and just looped over that. It recovered the overhead of the transparent resolve on models with smaller transparent parts, but it also made fully transparent or mostly transparent models slightly slower (it still basically loops over almost the whole screen on these types of models, so keeping track of the smallest bounding box while also still doing the same work as before made it a little slower). But the performance benefits for the average model outweighed the losses on rare fully transparent models. In the image, you can see the benchmark results versus the baseline.
Added TEXCOORD_1 support glTF sometimes authors a second TEXCOORD set (first one is TEXCOORD_0, 0 indexed numbering). The official spec only requires support for the first two TEXCOORD sets, even though there can theoretically be any number of them in a model. That said, major model exporters don’t author any more than the two sets, so to avoid extra work, I only added support for 0 and 1. (not merged into main yet, I want to polish it a little and maybe add KHR_texture_transform support on top of it first)
Added texture transform into the TEXCOORD branch and merged it into main Not that hard, just read it, pass it to the rasterizer and then display it. I did have a very sneaky bug in the loader that made the whole feature render wrong, where I just had to negate one value to fully fix it, but now everything fully works. Below you can see the Khronos test asset for texture transforms. (tick means fully working, clearcoat is not yet implemented so it doesn’t show as working)
Added proper OBJ bump map support OBJ bump maps are textures for simulating bumps and wrinkles on models. Blender used to author bump maps as normal maps for some reason, so I made it automatically detect if it’s a normal map disguised as a bump map and handle it well, since there are a lot of old Blender OBJ models in the wild. But it also handles bump maps as bump maps normally, so it’s basically the best of both worlds.
Completely removed gouraud shading mode Gouraud was previously the main shading mode, but now I’ve just completely removed it. It was by far the slowest, while not adding any actual value to the project. Blinn-phong lighting is faster AND it supports more features (normal maps, etc.), so there was just no point in keeping gouraud. Now that I’ve removed it, the project has less code to maintain and a faster default shading mode with more features.
Split the tests into sub-directories The test suite is now very long (20k LOC across 47 files), so i decided to split it into sub-directories instead of just having 47 files in one flat dir. It’s cleaner, more maintainable and looks better.
Pararelized the wireframe shading mode I did a bunch of small things alongside it, but the main feature for this devlog is the pararelization of the wireframe shading mode. It was previously fully single threaded, but it wasn’t that hard to pararelize, i just had to make the function it used to write into the framebuffer (draw_line) CAS atomic, to avoid race conditions. Now wireframe is the fastest shading mode in basically all scenarios. Below, you can see a performance benchmark (built into rasterminal using a flag) with wireframe mode on a super dense mesh and how the wireframe mode looks like (you can also cycle the colors).
Added a release workflow, manpage and changelog I added a github release workflow that works alongside the changelog and released the first pre-release version: v0.1.0-alpha.1 Also added a manpage and an install target to make and cmake that installs the binary, docs and manpage into the path.
Wasted 7 hours of my life Did a bunch of smaller cleanups and fixes, and then I tried to template the unlit and lit paths in the rasterize_flat function, which turned out to be a performance regression. Awesome.
Completely removed the shadow map Before, rasterminal built a shadow map on model load and displayed it during runtime. I now completely removed it, because it was slower during load, slower during runtime, sometimes looked broken on curved surfaces and added essentially no value. Here, the first picture is with the shadow map and the second is without.
Working on portability Did a bunch of small fixes and improvements in the last ~week. Right now I’m on vacation for the next couple of days, so I won’t be active. I am currently working on broader terminal and platform support, so older systems and terminals will be able to run cleanly with some fallbacks or will fail loud with a clear message about what isn’t supported.
Working on adding 256 color support Some older terminals can’t display full 24bit RGB colors and use a 256 color palette instead. I’m adding a fallback so the older terminals can still use rasterminal. It still calculates the full old RGB colors, but then just maps them to the nearest 256 color with LUTs. On a side note, I switched my terminal emulator from Kitty to Ghostty.
Working on terminal color capability detection I am adding automatic terminal capability detection, meaning that rasterminal will get the terminal type and either refuse to render on super old or “dumb” terminals, degrade on some terminals and render normally on modern ones.
Working on a –color compatibility flag The color terminal compatibility thing I was working on has landed in the branch, now I’m adding a –color flag to override the automatic capability detection for situations like ssh, where we almost always degrade to the 256 color pallete for maximum compatibility. So now you’re gonna be able to use the right color mode even if the automatic detection is wrong for your situation.
Changed the 24bit to 256 color palette conversion logic Until now, the conversion picked the closest color possible mathematically. But from testing on a bunch of different models, I’ve realized that it doesn’t actually look very close to the human eye. So I swapped it out for a different method, called CIELAB distance. Now it still doesn’t look perfect, but as a fallback for older terminals it’s close enough.
Finally merged color-fallback, I can move onto other things The branch is finally merged. I’ve accumulated a bunch of usability and code quirks and issues that i can finally get to now that the branch is merged. So now I’ll be reworking all the CLI flags, camera and other components. And we also passed the 700 commit mark with this merge!
Did a bunch of small code quality and usability improvements Fixed a Windows bug that crashed the program on model sizes bigger than 2GB, improved the orbit usability (fixed mouse drag behavior when models are turned upside down), and did a few cleanups and fixes in the CLI parsing. I’m planning on adding a few CLI flags that I think can be very useful for some people, specifically better spin settings, starting camera angle/zoom control and a few more.
Added –spin-speed and –spin-direction flags Added CLI flags for the spin speed and direction. The speed is in deg/s and the directions is simply left or right. Here’s what 1000 deg/s looks like spinning to the right:
Added more CLI flags for startup customizability Added flags to set the camera pitch, yaw and zoom on startup. Now every runtime-settable variable can be set during startup through the CLI. The R button now resets the state to the CLI set state, not to factory defaults.
So, i found two memory bugs in a widely used terminal input library I was researching terminal input libraries to use for this project because my current approach was so buggy that it wasn’t worth fixing. Both of them are memory bugs in the libtermkey library. There are forks of the lib with this fixed, but since many projects still rely on this lib, i submitted them anyways. I’ve also confirmed that the bug is present on my machine on Ubuntu 24.04 LTS on Neovim, because it links the vulnerable shared library. I didn’t mark them as CVEs (hopefully that isn’t a problem). If anyone want’s to look at the bug reports, they are at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891 and https://bugs.launchpad.net/ubuntu/+source/libtermkey/+bug/2161916
Working on completely rewriting the current input parsing handling The current input handling is subpar at best; it interprets a lot of random keys as escape, which currently quits the program (This will also be changed to Q and Ctrl+C only. Kind of a no-brainer since this is the more standard choice for TUIs - for example btop - and it also means I don’t have to deal with the headache of distinguishing function keys and others from escape) and has a lot of other quirky behavior that needs fixing. I’ll also try to improve robustness against malformed input like a leaky SSH session. There are a lot of various edge cases and situations where you have no way to distinguish real input from malformed input. This is all a very major pain in the ass. And I thought figuring out the raw mode output would be the hard part. And after all this, I’ll end up with way less attention than strictly slower, less robust competitors, just because they already have an audience from other projects. I bet nobody will even read this. I’m basically talking to myself right now. Or maybe, just to spite me, the algorithm will push this more than my other devlogs.
Still working on the input parsing system It is very hard and I keep finding bugs and reasons to redesign it. I’m in pain. I do think I’m getting closer to the final robust design.
Finally committed and pushed the input rework Tested it on both linux and windows and everything seems to work. No inputs interpreted as other inputs, all edge cases handled, just works. Finally can move onto other things.
Did a smaller fix and added a pretty big feature First, let’s talk about the small fix: I Fixed a super long model name showing up in the HUD in it’s full length, often blocking out other HUD elements. Previously, the HUD would display a model name of any length. Now there’s a hard cap of 24 chars, with any name longer than that truncated (middle style truncation) to fit into that limit. And now the big feature: Added a first person noclip-style camera mode. It’s accessed with the –first-person flag and let’s you explore the model as a floating camera (not bound like the default orbit camera). It was honestly easier to implement than I thought it would be. With it, I added two new keybinds special to the first person mode - E and V for going up and down. They don’t do nothing in orbit mode. Also added a second –first-person-speed flag for controlling the initial movement speed. It is also controllable during runtime with scrolling or +/- (I didn’t know what to bind these to in this mode since you can’t zoom like in orbit mode and this was the only place where they fit). In the photos, you can see some angles taken in the first person mode that weren’t possible in the default orbit mode.
Completely redesigned and rewrote the HUD The HUD used to be just a single line at the bottom of the screen aligned to the left. It looked pretty bad, but it did tell the user everything they needed to know. [picture 1] First, I added model name sanitization, so models with control bytes like newline ( \n ), line feed or other symbols like emojis can’t break the whole program when trying to display them in the HUD. Then, I completely redesigned the whole HUD to look better and be more robust, while still telling the user everything they need to know. I went with this design [picture 2]: On the left, you only have the model name. In the middle, first you have the current shading mode (highlighted in cyan), then the lighting mode in plain white and then the background color in gray. All three middle indicators are separated with a dot and are different colors, so nobody can confuse them. On the right, there’s 3 boolean indicators: spin (if the model spin is on), backface cull (if it’s currently culling backfaces) and texture (if it’s showing the texture, isn’t there at all on models without a texture). They are gray if inactive and cyan if active. The last thing on the right is just the fps number. There can also be optional indicators: Wireframe color (in the middle, after the shading mode) which only shows up in wireframe mode. [picture 3] First person speed multiplier (on the right, between the bools and the fps number) which shows up only in first person mode. [picture 4] I also made each “island” cleanly disappear when the terminal’s width is too low instead of just slowly getting cut off letter by letter. I think this design looks better, less cluttered and is pretty easy to understand at a glance. I would very much appreciate a star on GitHub!
Added issue templates + contributing documentation Added templates and a config for submitting GitHub issues, for both bug reports and feature requests. Also added a CONTRIBUTING.md for clear instructions on how to make, structure and audit code contributions. (tests, linters, formatting, etc.) I tried to make some optimizations to the renderer by auditing the compiler generated assembly and looking for inefficiencies, but everything i tried turned out to actually hurt performance. And GitHub actions decided to have a major outage right when i pushed the commits, so that’s awesome
Minor comment cleanup Just did some comment cleanup: Deleted redundant comments and why comments Removed separator comments Compressed or rewrote some really long comments (without removing the info they give)
Working on adding support for the Kitty protocol Some modern terminals like Kitty and Ghostty have support for the Kitty protocol. It’s a feature that allows you to display high resolution content like images and videos in the terminal without it looking super pixelated. There’s also the Sixel protocol, which is basically the same thing but a little worse and more widely supported (even Windows terminal has it). I’ll add Sixel after i merge Kitty to main. It is very clearly a worthwhile feature and I have been planning to add it from the start of the project. Today I finally decided that it’s time. Most of the work is already done on the branch and i’m just polishing out the bugs and issues before I merge. In the photos, you can see the comparison between using just the block characters and using Kitty. It is a night and day difference. Although the performance isn’t great at that high of a resolution, but I’m still working on optimizing that.
Found a bug in Ghostty’s kitty protocol handling Ghostty is a modern and fast terminal emulator that i personally use. While testing the kitty protocol feature in rasterminal, I found a Ghostty bug that lagged my whole computer after a few minutes. I tested it in Kitty (terminal emulator) and there it worked fine. I looked at Ghostty’s code vs Kitty’s, found the bug and reported it to the Ghostty maintainers. Mitchell himself (the creator) fixed it in like 2 hours. Honestly I’m kinda sad I didn’t get to become a contributor and fix the bug, but since it was a small fix and I already described it in the issue, I get why Mitchell just fixed it in main. Here’s the full issue: https://github.com/ghostty-org/ghostty/discussions/13719
Fully merged and done with Kitty Finally completed the kitty protocol implementation. It is kinda slow, since the resolution is so much bigger, so I will try to optimize the high-res performance even more. So now the next two big milestones are: Add Sixel on top of kitty, that’ll be a lot of work Optimize the rasterizer even more I was thinking of maybe adding gpu rendering as an option for super large meshes or high-res scenarios, but idk. I’ll definetly keep the pure cpu renderer for computers without gpus, but I’m not sure about a gpu implementation. It would be hard to do, less portable and it might not even work that well.
Working on adding full Sixel support Working on adding support for the other mainstream terminal pixel protocol of the main two - Sixel. Already did fully implemented the kitty protocol last time, so once I’m done with this one, I’ll be done with terminal protocols (at least for the near future, hopefully). There are some other ones like the iterm2 protocol, but that one’s pretty rare and I won’t add it unless I really don’t have anything better to do. It’s basically done, just need to polish it and test it on a bunch of terminals and operating systems to make sure everything works before merging.
Fully merged sixel Fully merged the sixel protocol implementation. Works on all platforms everywhere that supports it. So now both high-res terminal protocols done. Moving onto other minor things and especially performance.
Working on improving performance With the addition of the high-res protocols, the target resolutions quickly went from hundreds or thousands of pixels to millions. So I now desperately need to improve performance. So far it’s looking promising: A whole model covering the camera 6 moving at 4k went from about 8 fps to 20-30 fps. Not ideal yet, but I think we’re on the right track. Super dense meshes (more than 2 million polygons) improved 2-3x Meshes with transparent parts improved about 2x While these wins may seem really big (they kinda are), the jump in resolutions still means they are barely usable interactively. I do want to add gpu acceleration later (with the cpu path as a fallback), but until then I want to make it as fast as I possibly can.
My reported bug in libtermkey has been fixed in the newest version Just got an email from one of the maintainers that the crash bug i reported a month ago was fixed in the new release. libtermkey is a terminal input parsing library that I considered using and found a crash bug in. The bug was already fixed in neovim’s fork of the library, so i just pointed the maintainers at that fix. For anybody interested, here’s the issue link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891
Still optimizing… Spent the first ~7 hours trying to find microoptimizations and each one was either a wash or worse somehow. The compiler works in mysterious ways. At some point, I just gave up and let Claude have a go at the optimizing. Surprisingly it actually came up with a lot of interesting optimization techniques and solutions that I definitely couldn’t have come up with on my own. But it found so much, that the whole diff adds 5k lines of code. So now I’ll be cleaning up, testing, and maybe further optimizing that diff…
Finally merging the performance branch It’s finally time to merge the performance branch. I basically redesigned the whole renderer and rasterizer around high resolution workloads, where it would still choose the old high-poly paths where they were faster. Even snuck in some SSE2 SIMD code (picture), although I will probably be switching to a dispatch SIMD library like Google’s Highway. Not entirely sure it will be Highway or even if I will do that yet, that depends on the code complexity and before/after benchmarks.
Cleanup and restructuring changes After I just merged three big feature branches (kitty and sixel graphics protocols and the high-res performance branch), I needed to do some overdue cleanup and refactoring. And so I did: Collapsed the super long changelog entries into way more readable and legible points Restructured the src directory into multiple subdirectories because it had like 50 files already Sadly completely removed the Make build system, so now you can only build with CMake (CMake is very much evil and even more evil but it’s the only one of the two that supports windows and I was tired of managing two build systems) Removed the –graphics-scale flag, so now everything renders at native resolution And some small docs and comment cleanup
Working on assimp integration Yop, I’m adding the Open Asset Import Library as a fallback for any model formats that aren’t natively supported with their own dedicated loader (only ones with dedicated loaders are glTF2, PLY, STL and OBJ). I’m still keeping the dedicated loaders, because they are more feature-complete, to-spec and wayyy faster (especially the glTF one). I added it because I feel like for a 3D model viewer, support for many formats, even niche and obscure ones, is pretty important, even though nobody might use them. This roughly doubled compile time and almost quadrupled binary size, which also made CI take way longer (of course). It somehow made the MacOS runners take 50 minutes to compile (from the previous 3 minutes), but I fixed that by bounding the number of processes CMake can spawn to the number of threads on the runner (previously was using -j which spawns as many as it wants and it was spawning about 230 of them). I’m still testing how it handles various model formats and trying to find any reachable segfaults.
Still working on the assimp intgration Currently trying various models from all the different model formats that assimp loads. So far found a segfault, some weird behavior and integration mistakes that I made. Also found a small bug in assimp itself, for which I’ve submitted the PR with the fix to their GitHub repo. For anyone interested, here’s the PR: https://github.com/assimp/assimp/pull/6799
Fuzzing my assimp wrapper I’m trying a bunch of hand-crafted models from all the formats that I can load and trying to find things that dont load or render properly. Also had AI write me a simple fuzzer in python and I’m just letting it run for a few hours. Also auditing the assimp loader paths against my wrapper to find any format specific behaviour that should be handled. I’ve already found a bunch of things and I’m still finding more. Assimp has a lot of weird quirks and issues that I keep running into. Honestly kinda regretting the decision to integrate it, but since I’m already so deep in, I’ll just keep going.
Merged the full assimp integration into main I really don’t have much to say here, I’ve already put all the info about the branch into the past devlogs. All the formats work and the wrapper is very sturdy. I’ve found more bugs in assimp itself than my code (devlog on that soon). So, rasterminal can now load basically any 3D model you throw at it. Some of the formats assimp supports are so niche, I’ve never even heard of them.
Cutting a release The repo is in a pretty complete and polished state, so I’ll cut a release here. This will also probably be the last release before I ship, so I’m making sure that nothing is broken and everything works on every platform. I’ve still got a lot of work to do though, even after the end of stardance, like animations, glTF PBR, format completeness for every format, GPU acceleration, etc.
Found a bunch of terminal cleanup gaps Most of them are Windows or cmd.exe specific (nothing ever works on Windows), but some are present on POSIX too. The Windows specific ones are: cmd.exe for some unknown reason doesn’t turn off the raw input sequences, so arrow keys don’t work like they should, even though I explicitly turn it off (????????) (I hate Windows, they always have to do something unexplainable for no reason just so your code doesn’t work as it should) when you terminate the program with ctrl+c or ctrl+break while actively dragging the model around, it sometimes leaks mouse escape sequences into the next prompt bunch of other weird small stuff that nobody cares about And the few on POSIX are mostly ctrl+z suspend/resume behaviour not recovering the terminal and the same thing with ctrl+\ (SIGQUIT). I’m still working on fixing these. Most of the windows ones are already fixed, but I haven’t even started with the linux/POSIX ones. I have postponed the planned release to when I fix these + any other issues I find.
I HATE WINDOWS Windows just doesn’t work. It doesn’t work. Nothing works on Windows. Everything breaks. I don’t get it. THE UNIT TESTS PASS ON WINDOWS CI BUT WHEN I ACTUALLY RUN THE TESTS ON WINDOWS IT FAILS????? HOW IS THAT EVEN POSSIBLE. The release is now definitely getting delayed by at least a week because I keep running into more and more and more and more and more and more and more and more and more issues. I hate Windows. Microslop is the only company that could mess up a basic terminal emulator. And I also have to reboot my PC every time I fix something and push it and then reboot to get back to linux. this is torture. At one point I tried to do it on a Windows VM on linux but that was too slow so I just gave up.
Merged the full Windows console restoration branch My nightmare is over. I hopefully won’t have to deal with Windows for a while now. Summary of what is now fixed/handled on Windows: Ctrl+C, Ctrl+Break and Q exits fully recover the terminal’s state Ctrl+C and Ctrl+Break don’t leak mouse escape sequences into the next prompt if you terminate while actively dragging a model A bunch of other minor Windows or cmd.exe specific quirks Only thing that isn’t handled (didn’t find a good way to handle it) is task manager “end process”. It kills the program without cleaning up and sometimes freezes the shell.
Fully fixed and merged the first POSIX cleanup item Well, would you look at that! That took significantly less time than the Windows fix. It is partly because it was a smaller fix and only part whole POSIX fix, while the Windows one was the whole thing and also the foundation had already been laid out from the Windows work and I just integrated the POSIX path into that, but it is also very much because Microsoft is a horrible, terrible company that can’t make good software. I mean, look at GitHub, they have been going downhill ever since they got acquired by Microsoft. Now that I got that out of my system, here’s what was fixed: If the program cannot enable raw mode at startup, it safely fails instead of continuing and corrupting the terminal state If the cleanup gets interrupted, it retries cleanup so it doesn’t leave the terminal state corrupted after one failed attempt Onto the next POSIX fix: handling SIGQUIT and SIGHUP.
Added handling for SIGINT, SIGTERM, SIGQUIT and SIGHUP I don’t really have much to say here, I just added the full per-spec handling for all these. Only remaining POSIX-only gap is now SIGSTOP/SIGCONT (stop/resume process). I’m also starting school now, so I’ll be working on this less.
Working on SIGSTOP and SIGCONT handling SIGSTOP and SIGCONT are POSIX signals for stopping and resuming a running process. I’m working on adding handling for these, so you can safely pause and unpause rasterminal at any time. This is a lot of work, since until now, we just set up the terminal on program start and cleaned up when the program exited. There’s a lot of quirks and weird scenarios that I have to handle, for example if another signal gets sent while cleaning up the terminal for SIGSTOP. I’m trying to catch as many edge cases by just doing random things while using the program and also with the help of AI to come up with potentially uncaught scenarios.
Did some polish and cleanup of the platform layer Did final polish and cleanup of the platform layer since I want to actually finally cut a release relatively soon and I just did a lot of work there. Fixed things like useless tests, outdated or wrong comments and some platform specific quirks. Probably actually gonna cut a release soon (this time for real). Also added early rejections for BVH and CSM files, since they contain no model geometry (they can’t currently be displayed at all) and documented the change. The code is basically done (hopefully, I really don’t want to find another big gap that’s gonna take a week to close), I just want to correct anything wrong in the README, changelog, manpage or help menu and maybe make them look a little better before cutting a release and shipping.
Last pre-release checks and cleanup I’m finally ready to release v0.1.0-alpha.2. Only notable thing I changed here is that I changed the default thread count: It now defaults to hardware concurrency everywhere. Other than that, I of course did final documentation checks and fixes and now I’m just waiting for CI to pass so I can tag it and let the release workflow do the last step. So this is hopefully the last devlog before my ship!
Refactored the platform layer The whole platform layer was just one file until now. Since I did a lot of work on it recently, it grew to over 2400 lines of code. It was super confusing and disorienting. So I decided to refactor it (split it) into 8 files, based on what they handle: console.h - saving/restoring terminal state control.h - termination signal handling file.h - file operations (64bit) input_reader.h - handling input (not parsing, that is it’s own file) shared_memory.h - shared memory handling for the kitty protocol terminal_io.h - writes output to the terminal terminal_query.h - querying the terminal for things like graphics capability, etc. timing.h - frame timing and sleeps
Miscellaneous fixes and improvements Fixed two races in platform code (one MacOS, one Windows) Removed build flags that disabled some compiler security hardening at the cost of a little performance Fixed the test framework to not freak out on NaN in near assertions Improved thread launching and handling in loaders and renderer So overall just boring fixes and improvements, nothing special.
Code quality and CI improvements Finally did the long overdue main loop refactor. The main loop is now way shorter, more readable and more testable. I just split off some of the main loop’s work into it’s own modules, which made them way better looking and also, since they are now standalone modules, actually testable. A big win for repo structure. In the process, I also replaced the input handling’s long if chain that made each character do it’s job with a switch statement. It’s more readable and theoretically faster, although since I compile it with -O3, it probably made no difference or an unnoticeable one at best. I also finally fixed the super long CI times. Until now, CI used to take ~50 minutes (depending on how fast the GitHub runner was) because of cppcheck. Everything else finished in under 10 minutes, but cppcheck stalled it for an hour. It was stalling in mesh_assimp.cpp (the assimp wrapper) for most of it’s runtime. I always thought it was because assimp is a very large library. So I experimented with it a little. I included everything I include in the wrapper into a test file with a little code and ran cppcheck on that. It finished in less than 10 seconds. Eventually, I found out it was somehow taking that long because the main loader function was too long and handled too much by itself. So i just refactored it into 3 separate functions, without changing the behavior at all. Somehow, I still don’t get why, it reduced the whole cppcheck run to 9 minutes. a more than 5x improvement, just because I split a function into more functions. I’m not complaining, but it’s definitely weird. CI is now way faster and adding new things is gonna be way smoother now.
Ships:
rasterminal rasterminal is a 3D model viewer in the terminal Why i decided to build it The original idea didn’t really have any big inspiration, I’ve just always been fascinated by the inner workings of 3D and how that all works. I’ve been wanting to build a project involving 3D for a while and I didn’t want to make just another program that uses libraries and GPU drivers to do all the work. So I came up with the idea: a software rasterizer that renders in the terminal! There are lots of TUIs and lots of boring old software rasterizer projects, so I just combined the two into something unique. And over time, I realized I could make it an actually useful tool, with no real competition: a 3D model viewer in the terminal. Sure, there are some similar projects on GitHub (like taigrr’s trophy), but none are actually usable with heavier models or support pixel graphics. What I learned I learned a lot. I really mean a lot. Anything from math and rendering to how terminals work and how to control them using escape sequences. I don’t want to sit here and name everything I learned over the period of the last 5 months, but I can confidently say that this project really taught me how much work goes into everyday software and how to actually develop and maintain a project professionally. The future of rasterminal The whole project is very far from done. You can see that from the latest release version: v0.1.0-alpha.2. I’ve got a lot of work to do and I’ve roughly got the major landmarks mapped out. Main things I definitely want to change/add at some point before v1 are: Add animation support (currently can only render still meshes) Complete the renderer (complete support for basically every feature of every format that makes sense to support) Add optional GPU acceleration (after I’m satisfied with everything else) Hardware / OS support Supports every major OS (Windows, Linux, MacOS, and any other POSIX-based OS, so practically everything), and every CPU that I could think of (any architecture, 32 or 64bit). You would have to actually try a to find a platform that it doesn’t support (most of the unsupported hardware are big-endian systems, which are basically phased out completely). This is one of the main goals of the project, so (almost) any modern machine with a terminal can run it. Special thanks Special thanks to anyone who followed, liked, helped, or otherwise supported the project in any way. I wouldn’t have had the motivation to push it this far if it wasn’t for you guys....
|
1792831867.873963
|
1792918267.873963
|
|
6268
|
Thalamus + AgentOverflow by @Hardcore_Real_Name_is Thalamus + AgentOverflow by @Hardcore_Real_Name_is_nitish | Stardance...
|
Hardcore_Real_Name_is_nitish
|
1
|
472.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T09:29:17Z", "hours": 35.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Reviewer Notes (School Incubator Startup) Status: Built in my school’s startup incubator; some edge-case features are undergoing rapid iteration. Auth Required: Sign up via email OTP to unlock Research/Build Modes or send >3 messages (prevents API exploitation/high costs). Credits: Runs on live premium models (Claude Opus via AWS Bedrock). Minor risk of downtime if incubator credits exhaust, but we should be fine. Thalamus AI: L4.5 Agent Platform Thalamus AI (by Aphantic Corporations) is an all-purpose Level 4.5 AI ecosystem combining multi-agent workflows, deep research, and true local QEMU OS virtualization inside your browser session via a lightweight 31MB local Node.js WebSocket bridge. The 4 Core Modes Chat: Context-aware assistant for writing, planning, and summarization. Research: Synthesizes live web search with inline source citations. Study: Adaptive RAG tutor; uploads notes to auto-generate custom quizzes/solutions. Build (Code): Multi-agent pipeline building full-stack apps from plain English. 9-Agent Code Pipeline Runs asynchronously via Convex scheduled functions using smart model routing: Researcher (Haiku): Maps existing engineering benchmarks. Analyser (Haiku): Dissects product requirements and edge cases. Planner (Haiku): Graphs detailed task execution plans. Coder (Opus 4.6/4.8): Authors core logic, APIs, and databases. Optimiser (Sonnet): Refactors code for scale and algorithmic efficiency. Organizer (Haiku): Automatically structures folder/file directories. Tester (Sonnet): Generates robust end-to-end unit test suites. Hacker (Sonnet/Opus): Conducts penetration audits to patch vulnerabilities. Critic (Haiku): Acts as the final quality gate; rejects incomplete work. Native Stack & OS Virtualization OS Support: Boots Windows 11/10, macOS Sequoia/Sonoma, Linux (Ubuntu/Kali), and Android. Browser-only instant boot for Alpine/Arch Linux. Ultra-Lean Desktop: Built with Neutralinojs (uses native Edge WebView2)—only 2.2 MB total app size. Integrated with GitHub OAuth for automated commits after agent cycles.", "repo": "https://github.com/hardcoregamingsyle/thalamus", "demo": "https://thalamus.aphantic.skinticals.com"}]...
|
[{"post_id": 37547, "ts": "202 [{"post_id": 37547, "ts": "2026-07-30T11:01:32Z", "hours": 9.0, "text": "I am now doing something kind of risky. giving AI adhd. Like literal ADHD. level 2/5 and for some tasks level 2.5/5 as per my research, this should increase the output quality of AI. also checked agentoverflow compute, it’s working Okayish. claude has access to it and my limit resets tommorow, so the automated checks aint happening and I have to check manually. Here is SS of me creating a whatsapp clone as the test of this AI(hopefully this tells you what Im expecting form my AI.)"}, {"post_id": 37363, "ts": "2026-07-30T00:55:25Z", "hours": 2.0, "text": "Everything Finally works, except the VM, it got some error, debugging that, then I just came up with a new idea(thanks to my yt feed) add a ADHD mode toggle in Chat mode and Research mode, basically ADHD in AI will I think help AI leave its very formal guided approach t problems, with the distracter, it will be jumping here and there, maybe making connections, giving us a better take at making AI good. There will also be a Brainstorm mode, the Brainstorm mode will give AI ADHD and it will help in brainstorming startup Ideas, startegies, and stuff. can someone remove this screenshot compulsion. I dont have a screenshot every devpost."}, {"post_id": 37002, "ts": "2026-07-29T13:34:59Z", "hours": 7.0, "text": "Finally, got the routing to work properly. Everyting works now. My head is so done for it. also, I just saw something, and People like me may be the reason for it getting added. Im uploading it as the screenshot."}, {"post_id": 36337, "ts": "2026-07-28T12:00:04Z", "hours": 17.0, "text": "I dont understand why is my Code mode routing going to Ollama when everyting else point to NVIDIA NIM, even the OLLAMA Fallback is Nvidia NIM, the Primary provider is convex dashboard is NIM, my ollama keys are at limits and this great code mode is pointing at NIM. whyyy. Currently working on fixing the Github sanbox. thats kindof broken. rest everything works. For some reason, even on a successful github import, it shows an error(AI slop, thats why. I made the github system with AI) . the sandbox just doesnt detect the repo. and the Hack Club Fraud Squad is sus with me(I dnt blame them, 17hrs a day for a 14yr old is suspicious.) I have migrane, I dont have glasses and my eyes are very healthy(somehow). once any 1 of my project gets reviewed and I get payout, im spending it all on hostng and AI credits so I can switch over to Oracle and Modal. Agentoverflow is still going through filteration and final review. I have cooked myself. I am still procastinating the .exe(even with AI, building a native .exe is a headache.) here is SS of the new Sandbox tab"}, {"post_id": 35769, "ts": "2026-07-27T12:28:48Z", "hours": 21.0, "text": "polishing the VM and all, and good news, Im part of the 1 million founders, 5 day bootcamp. Its a very very god program, the onluy thing i hate about it is the dress code, like seriously, shirts and pants. why not joggers and t shirts, they are confortabel af. also, i monitored teh agentoverflow corpus, well, it had a problem, the API key of gemini to verify absolute gold tier learnings, im so dumb I waited 3 days for something to happen and only to realise forgot to set the APU key. yup, this is greatness at it’s peak. for thalamus, doing some polishing, just realised that git import diesnt work, fixing that, removing the requirement of git pat. Fixing a few more stuff. also, I just realised another problem, the database. how am I going to set up databases, like how do I set uo convex for everyone who uses this for free. well if the VM problem had a solution, this should also have a solution. API is working, tested it with claude code. Claud eput in 15 learnings for me. also, I realised that I forgot to change the sandbox tab to leave the old VM system an move on to the new Github Actions system. Also, long time I havent updated my .exe gotta do that also. Quick update- I got a Notif that I am suspiciously a fraud, like a serious fraud. the Fraud Squad app sent me the notif. after that, I am still trying to recover from the emotional trauma of the database loss. I will be angry with my mother for a bit more time(se was the one who deleted it). IK im cruel and he didnt mean it, but recovery takes time. also, For the next week, after I do the changes and fixes required, I will be using only and only thalamus to code Thalamus. right, An AI that will code itself, but I will be the one guiding it. because if I cant use it, my product aint ready for market launch. for screnshot, idk what to put. like all I did was console work and Im definately not showi my console here. the names are kindof inappropriate. so here is my old sandbox tab. Good Bye QEMU and VNC Viewer. you are getting replaced by Github(atleast they aint getting replaced by AI.)"}, {"post_id": 35073, "ts": "2026-07-26T08:12:34Z", "hours": 2.0, "text": "I FINALLY CRACKED THE UNLIMITED VM PROBLEM. Github Actions are unlimited usage for publrepos, and for source control, we are already making a public repo, and we get a Free VM with it. I can Run iOS, MacOS, Windows, Linux and Android on it, no restrictions, completely free. WoHoo. also, now I am no longer using Closed source Models, because Open Sourced Models, if Used correctly are alot cheaper and provide the same result as any Closed Sourced Models. Agentoverflow is still working well. Will shift from google Cloud to Oracle Cloud, as Orace gives a 50% more powerful, compoletely dedicated server for free with 200gb storage, and that additional 150gb that I need costs me just under $4 a month, so It is very very viable financially. will switch to it later. I will now add a Student Mode for anyone with the email given by my school, and a teacher mode for teacher emails. Still recovering from the emotional trauma of the database loss. Added gravity Ads, need to remove alot of adslots because right now, it is spam impressions, not hih quality impressios, but still, here is ss."}, {"post_id": 35023, "ts": "2026-07-26T05:38:11Z", "hours": 5.0, "text": "I purged all dad code, did a massive refractor, fixed anything broken, left nothing. both repos, around 15k lines touched(must be my most productive session.) and I am so done, my migrane is at its peak, but IDK, i cant sleep anyways so better work than stare at the ceiling. Also, AdminPanel finally works. and since I lost my entiredatabase, it will take a day or 2 for the reindexing to start, right now its just botting up, downloading the embedding model and the entire database. I am still depressed. will take me some time to recover from the emotional trauma."}, {"post_id": 34718, "ts": "2026-07-25T17:33:45Z", "hours": 18.0, "text": "i am so done for it. i spent this entire week. trying to find out why is the admin panel showing 0 learnings. guess what. my mom deleted the VM, thinking it would remove all charges, I didnt even have a backup. great, back to square 1. and the agentoverflow admin panel has a error, trying to integrate AdMesh for Ad Revenue. Will use Modal as it is a serverless infrastructure for hosting AI models. I now need credits. allso, my mouse and keyboard are giving up on me. here is ss of error."}, {"post_id": 34108, "ts": "2026-07-24T16:20:33Z", "hours": 34.0, "text": "busy fixing the agentoverflow error. still working on it, no time for a detailed devlog, here is ss of admin panel, latest."}, {"post_id": 32916, "ts": "2026-07-22T11:46:35Z", "hours": 11.0, "text": "my entire databse got wiped, 0 learnings. and that isnt the worst. my greatest enemy, Daal(We caal him that), literally told my crush, who was very close to me(we talked alot), and now, she avoids me. Thanks to my friends, I know why she avoids me(I skip school almost everyday). Here is a ss of the database with 0 learnings. Im broken, depressed, you can make me happy by sending a emaill to Anthropic, telling them to integrate agentoverflow directly into their tools list for code mode."}, {"post_id": 32405, "ts": "2026-07-21T15:50:48Z", "hours": 0.0, "text": "quick Update. Now im using ollama cloud wil like 3 different accounts, will exapnd this to like 50 different accounts so I never have to go on paid tier till I have the money. I was checking hackatime, And im No. 1 here is ss for proof."}, {"post_id": 32382, "ts": "2026-07-21T14:58:46Z", "hours": 3.0, "text": "Finally, found a reliable API aource(for now). well now I can finally relax. but I wont, why, I need to fix the bug that my input tokens are at like 200k while my output tokens are barely 20k, meaning my input is bloated. so gotta fix that full night. and as I was writing this, guess what I saw.Eror 403, insufficient balance. guess im back to looking for API. god bless me with unlimited credits."}, {"post_id": 32287, "ts": "2026-07-21T11:11:58Z", "hours": 15.0, "text": "Trying to find better API for the AI Agents in Thalamus. Currently trying our Cloudflare Workers AI, in Agentoverflow, the Database Size is now 1.125Mil. I was showcasing my project in the incubator, and guess what, I was surorised to see a payment error, My API hit it’s limit somehow and I got 0 RESPONSE. I GOT HUMILIATED. for SS, I got nothing, currently working on Dynamic Compressions and stuff, als, in agentoverflow, I expect a problem in searhc, the result being not relevant. I will be sending agentoverflow to Claude Code MCP forum so the reviewers review it and put it in. here is a ss of the admin panel."}, {"post_id": 31734, "ts": "2026-07-20T11:27:54Z", "hours": 9.0, "text": "i havent slept since the last 24 hours, cause FIFA world Cup was at night, and during the day, I never sleep, so Im forcing myself to work as hell. already crossedthe 800k point. Improved the Dispatcher in Thalamus. the Thalamus test is still going on. I have started blog posting for SEO. I have indexed both sites on Google search. set both Platforms completely unrestricted and free for now. Link to both websites: https://agentoverflow.aphantic.skinticals.com/ https://thalamus.aphantic.skinticals.com/ here is SS of the AI working."}, {"post_id": 31546, "ts": "2026-07-20T01:19:26Z", "hours": 12.0, "text": "Now working o SEO and indexing, Agentoverflow db has over 730k entries. Intigrated Agentoverflow MCP into thalamus and also integrated Sketchfab MCP for 3d models in case of Gameev or projects that require a 3d model. Currently testing my Code mode. Prompt: Build a highly advanced flight sim. Also, quick question, I made this AI, so I can use my own AI to build other projects, right."}, {"post_id": 31063, "ts": "2026-07-19T04:50:28Z", "hours": 8.0, "text": "agentoverflow has 475k+ examples in dataset(total is 3.7m), and im so great, I forgot to git push and deleed my folder, great, time to redo the special feature(not releasing yet). I published my site to google analytics. Im talking with my school rn if they can take my project and make it the official school AI. my school’s beurocracy is slow as hell. so idk if it will ever happen. also, here is a ss of the admin panel(of agentoverflow)"}, {"post_id": 30698, "ts": "2026-07-18T14:21:53Z", "hours": 2.0, "text": "did the UI and animations for agentoverflow also. https://agentoverflow.aphantic.skinticals.com/"}, {"post_id": 30650, "ts": "2026-07-18T12:07:49Z", "hours": 15.0, "text": "added 3d and scroll anims to Thalamus, increased the Limits per day in Agentoverflow so it can compete with StackOverflow, currently at 300k Examples for Agentoverflow, compute is slow, will reach to 3.7m+ by 3 weeks."}, {"post_id": 30145, "ts": "2026-07-17T14:16:22Z", "hours": 4.0, "text": "Testing MCP, I am setting AI training Aside because im currently creating the database. hopefully everythng will work, this AgentOverflow is like the brilliant idea, like barely any competition. website: https://agentoverflow.aphantic.skinticals.com/ git repo: https://github.com/hardcoregamingsyle/agentoverflow currently ingesting the entire stackoverflow database, while integrating it into thalamus. will also submit agentoverflow as a tool for ClaudeCode. SS of new website."}, {"post_id": 30046, "ts": "2026-07-17T09:48:59Z", "hours": 15.0, "text": "more work on Agentoverflow, added MCP tool, currently around 10% of stackoveflow database is in this bad boy. here is a ss of what im thinking of doing next."}, {"post_id": 29402, "ts": "2026-07-16T10:20:48Z", "hours": 14.0, "text": "working on Agentoberflow, which is stackoverlow for agents, Side by side working on dynamic pipeline. For agentoverflow, as a starting point, I am adding the entire stackoverflow database, like its entire codebase, Cleaned and filtered, Vectorised, and Graphed using GraphRAG, Storing it in maybe AWS EC2 as it is the cheapest. Also working on the Agentoverflow website, though both have the same database, like the exact same database in convex so that in the future, when I want to make a My entire ecosystem at 1 place, it is very very easy for me to do. and my life is in the greatest mess possible, my parents make me constantly change setups, due to which I need my own laptop, in the sense which I got on my own with my own effort so they cant take it from me, and I also need my own phone. so I dont have to make sure that my whatsapp is logged into every device. and I am completely dropping Payments in the App because BMAC requires stripe to connect payment. here is a screenshot of the new Agentoverflow Website."}, {"post_id": 28821, "ts": "2026-07-15T10:06:51Z", "hours": 11.0, "text": "don’t ask whats going on with my self trained AI, it is in no good state, the code either works, or it doesnt, or it works but something is off. I have a new idea, under thalamus, I will have AgentOverflow AgentOverflow is like StackOverflow but for Agents, will explain it later(when I actually start to work on it) BMAC is in queue. Dynamic pipeline is kindof done, kindof undone. Desktop app turned out to be nicer than I thought. rest I have nothing to say. here is a screenshot of the desktop app build mode returning a valid output instead of an error thats all I have to say"}, {"post_id": 28252, "ts": "2026-07-14T12:22:05Z", "hours": 2.0, "text": "I was trying to put in dynamic AI coding pipeline, and guess what, My code mode compeltely crashed. My AI is still being trained(errors o errors+ hitting my weekly limit.), also,My application for Emerging Ventures got rejected because I hadnt put in all info(mb), Will reapply again. For some reason, my GravityAds Account is showing unverified Via API but verified via dashboard, and I am still working on BMAC integration for paywall, I need to figure out on the payment and stuff. this is Devpost 1 of asking for the Claude Max x20 plan in the shop. and Huggingface GPU hours credits in the shop. here is a screenshot of of my rejection letter."}, {"post_id": 27695, "ts": "2026-07-13T14:07:31Z", "hours": 10.0, "text": "gravityads yet not working, BMAC under progress, how to deploy my AI is still a question with no practical answer, I asked my parents to buy huggingface paid plan for me so I can use zeroGPU, I got a hour long lecture on How I have to escape the fake tech world, and how these people scam us. currently working on improving the feel of the desktop app and vibe coder, step-1: Give it the feel of Claude Code, Codex or any other l4 vibe coder(easy) step 2: Upgrade the feel to make it a true l4.5 Agent(near impossible level difficulty, I wont be copying anyone here, I would have to make my own definatation of L4.5) Side Quest(Very Important): Either get yourself a Good amount of GPU hours or get yourself a way to deploy your AI model somewhere. Frustration is at it’s peak. and can someone please gift me a RTX Pro 6000(Blackwell), it has 96gb of VRAM, enough to trsin a 64B Model on it and make it very very good. here is the screenshot of a response from AI in the desktop App. Now I will work on MacOS desktop app."}, {"post_id": 27099, "ts": "2026-07-12T11:22:49Z", "hours": 28.0, "text": "Adding GravityAds for some revenue(this is a startup, remember), tried to add Payment but BuyMeACoffee crashed, HCB Bank isnt in india so I had to go with BMAC, so payments is the next task, the exe had some reworks done. still looking for a way to make my $50 of AMD credits last long, also I noticed that Rather than wasting it on running, I can use the aprox 200gb of VRAM to train a very powerful AI Model in like 25 hours, and then give you all the .gguf and then it is up to you if you want to test the AI or not. also, I am now applying for Emergent Ventures(EV) and Theil Fellowship, because I need the most amount of grant possible to get this to work. and currently on a hunt to find ISOs for the QEMU VM system, I am looking for Preactivated Pro verison of Windows 10 and 11, which I think is illigal but right now, we havent launched publically yet so I dont think it matters that I am going on the illeagal path of Software Piracy, but I promise I will once use real lisenced Windows version. For MacOS, it is something that can never be on the legal route till I get a good sustainable revenue stream. Using hackintosh version of MacOS 11 to current(MacOS 26), for those who dont know, Hackintosh is just a illeagal copy of Macintosh, or the Macbooks we use, so they need the MacOS that can run on sillicon other than Apple’s sillicon so thats why they are like cracked and all. hopefully I am not banned for distributing kindof illeagal information so here is a disclaimer: educational purppouses only here is a screenshot of me trying to debug why GravityAds are not being shown(console is empty and the adslots are not there meaning something is failing silently)"}, {"post_id": 25640, "ts": "2026-07-10T01:35:38Z", "hours": 3.0, "text": "I dont get it I understand the 30% AI rule but you have to see my project is not AI slop, Its quality work. like high quality work. I am here training my own AI(new skill), and creating an AI platform which will likely enter the AI race. and im getting rejected for “ai slop”??? please look into this, also, can someone see my ship, why does it have only 35hrs logges, it should be 200+ hours. request the community to look into this."}, {"post_id": 25287, "ts": "2026-07-09T14:00:50Z", "hours": 11.0, "text": "FINALLY GOT THE EXE CODE TO COMPILE i put it in h1 because it is news that deserves h1, been batteling it for like 4 days my ship which i have sent for recertification for the 5th or 6th time is still under review Please remove this hard limit of not logging more than 10 hours in 1 go, like I cant be posting devlogs every nhow and then the exe is made, but not launching, debugging that now and with this, I am officially over 200 hours. YAYYY here is the screenshot of teh github actions completing succesfully(the .exe code compiling) also my Work on AI is still ongoing, My previous run failed my expecatitions, thistime the overall adtasets used is a bit too large(100gb+) and the slitting database code is causing errors."}, {"post_id": 25078, "ts": "2026-07-09T01:30:41Z", "hours": 17.0, "text": "and while I was thinking to upgrade the UI, I broke the .exe, like the exe is now broken. yay also my AMD credits request got approves so now I need to find a way to put my AI on AMD and such that the AI only gets activated when someone requests so that $50 lasts a long time, but in this system, Every user would have to wait for like 3 to 6 minutes for the GPU to turn on and boot, causing massive delays. Here is a screenshoot of the Github Actions failing."}, {"post_id": 24049, "ts": "2026-07-07T10:45:39Z", "hours": 29.0, "text": "Finally got th exe to open, though it has more bugs than the entire insect population, but atleast it works. thats all I care abt, here is the login Popup that is done. gotta make the UI better and fix all these bugs now. and this is only windows, I still have to do this for macOS and linux(if possible) and then publish the app on microsoft app store and apple app store"}, {"post_id": 22188, "ts": "2026-07-04T14:53:01Z", "hours": 6.0, "text": "put AI declaration, and got scammed 3 times by different websites, claiming they give free GPU hours but ended up giving nothing but takng my email. currently working on a way to host my model, working on the exact workflow that my next AI project under thalamus will use, it will be JARVIS so here is a spoiler. it will beat fable 5. and I have ran out of the weekly Claude limit on all my 5 email IDs. the instaler is still ended up being corrupt or incorrect. neither me nor AI can understand the problem here. and today i drank 3 cups of coffee instead f my usual 2. here is a screenshot of the error im recieving. and now i will send my shit for recertification again, now I have everything in place, including the AI declarations. hopefully, i wont hve to do it for the fifth or sixth time."}, {"post_id": 21434, "ts": "2026-07-03T11:53:33Z", "hours": 21.0, "text": "i will be surprised if i Dont get a migrane tommorow morning cause ive been spamming the .exe to work, the build for the .exe installer and .msi installer is failing again and again. to the shipwrights, the .exe is completely safe and virus free, there are chances that you will install a .msi instead of .exe on running, there are chances that the installer will fail, if it does, I know that it is failing and I am trying to fix it, if it works, then it works. heres a screenshot of the build failing. all I hope is that my ship gets verified this tme, 4rth time sending this bad boy for re cert."}, {"post_id": 19984, "ts": "2026-07-01T13:41:02Z", "hours": 9.0, "text": "for the Ship reviewing team sry for last re cert request, forgot that I have to reqrite m readme.md did that, now im requesting re cert again. hopeefuylly it passes this time. ps.my credits request is still pending, AMD relied that they will respond ASAP, it is under review(do companes do that) and then also sent an apology letter for the delay(why? why did they send it?). and please remove the compulsion of having a photo/ss for software projects."}, {"post_id": 19160, "ts": "2026-06-30T12:31:19Z", "hours": 8.0, "text": "I will now request Recertification, I think that I have done enough. To the reviewers, there are chances that you will get to use my self trained model if my AMD clloud credits request gets approved or my Google Cloud Instance quota gets increased, otherwise, the only change I have made is nothing. Im unable to put my AI online. SS uploaded is my kaggle account o you can see proof of AI model."}, {"post_id": 18445, "ts": "2026-06-29T16:35:31Z", "hours": 0.0, "text": "devlog: the 100-hour milestone, a humaneval script blowout, and parsing raw logs context recap (the architecture so far) for anyone catching up on the architecture overhaul: my initial ship for thalamus got rejected because the UI looked like an AI wrapper template. instead of shifting pixels, i decided to completely redo the backend engine. i’m training a custom, specialized 32B model optimized explicitly for programming logic—named thalamus-thor-1 . general fluff is scrubbed to save weight; a gemini researcher agent sub-team handles web scraping to cover info blind spots. resource-wise, it’s a tight squeeze. puter.js failed on orchestration, so i’m entirely dependent on a drying runway of AWS credits while waiting on google cloud and cheap amd gpu server approvals. with school starting in two days, i’ve also been preparing a lightweight remote framework to monitor logs and trigger test suites from school lab computers during short periods. earlier tonight, i managed to bypass kaggle’s aggressive session killers, successfully compiled the FP8/4-bit compressed weights on their tpu clusters, and immediately threw the model straight into openai’s standard 164-problem HumanEval benchmark. here is the live update from late tonight. milestone: 100 hours in the dirt first off, a quick personal timestamp: as of setting up these evaluation scripts, i have officially crossed the 100-hour mark of active development on this project. hitting triple digits while drowning in memory leaks, credit run-outs, and hardware timeouts is a brutal milestone, but the core engine is standing. the humaneval script blowout i watched the model successfully plow past problem 90, and it kept charging all the way through the end of the execution run. but right at the finish line, instead of outputting the final pass@1 score summary, the script threw a fatal calculation error and crashed out. the evaluation script generated the completions, ran the test assertions, and executed the functional verification, but the section of the code responsible for processing the final combination formula or compiling the macro-averaged percentage broke completely. standard human-eval metric scripts use an unbiased estimator calculation to evaluate pass@k: $$\\text{pass@k} = 1 - \\frac{\\binom{n-c}{k}}{\\binom{n}{k}}$$ if the array containing the total number of generated completions ($n$) or the correct passes ($c$) contains a single malformed row, a zero-division error, or an unhandled null exception from an execution timeout, the entire summary wrapper explodes. i’m staring at a broken metrics calculator, but the actual data isn’t lost. shifting to manual validation i’m not letting a broken parsing script mask the actual performance metrics of the weights after 100 hours of grind. the script managed to compile and save the fine-grained data out to the raw <input_path>_results.jsonl log file before the summary function choked. each row in that file contains the literal execution results marked cleanly as \"passed\" , \"failed\" , or \"timed out\" . instead of trying to debug the evaluator framework’s entry points tonight, i’m going to pull the raw JSON lines into a basic python script i’m writing right now. i’ll manually iterate through the rows, count the hard instances of \"passed\" across the tasks, and divide it by 164 to find the true, absolute pass@1 score myself. the raw logs are sitting in the directory. writing the cleanup parser now to see what thalamus-thor-1 actually scored."}, {"post_id": 18433, "ts": "2026-06-29T16:17:02Z", "hours": 1.0, "text": "devlog: impatient engineering, skipping the wait, and running humaneval live the project recap quick context if you’re catching up: my initial submission for thalamus got rejected because the UI looked like a boilerplate wrapper. instead of a superficial skin-deep fix, i decided to overhaul the entire backend engine and train a custom, hyper-specialized 32B model optimized strictly for heavy coding logic—named thalamus-thor-1 . conversational filler was stripped entirely from the datasets to keep the weights lean; my existing gemini agent team handles live web scraping to cover general knowledge blind spots. the resource situation is a major scramble. puter.js was too limited for my 9-agent orchestration, so i abandoned it entirely. i’m burning through the absolute last of my AWS credits while waiting on approvals for google cloud and cheap amd gpu clusters. plus, school starts in a couple days, so i’m building a lightweight remote execution layer to trigger test suites and monitor terminal logs from the school computer lab during our free periods. earlier today, after a brutal 13-hour marathon fighting out-of-memory (OOM) errors and kaggle’s session killers on deepspeed ZeRO-3 initialization spikes, i finally pushed the parameters under the threshold and successfully compiled the weights on their tpu v5e-8 kernels. here is the live update from 1.5 hours later. the midnight deployment: saying screw it the plan from my last post was to sleep on the weights and stand up the evaluation harness tomorrow morning. i lasted twenty minutes. when you spend 13 straight hours fighting initialization crashes just to get a model cooked, you don’t leave the weights sitting cold on a drive. the curiosity and momentum make it impossible to step away. i went ahead, pulled down the evaluation scripts, configured the isolation wrappers, and slammed the model directly into the testing execution loop. right now, thalamus-thor-1 is running a live trial by fire. it is chewing through openai’s standard HumanEval dataset in real-time. as of typing this, the model has already plowed past 90 out of the 164 total programming problems in the suite. the screenshot attached is the raw stdout window of my evaluation terminal. you can see the script compiling generations, feeding function signatures, and executing validation unit tests back-to-back. what the logs are proving seeing the terminal scroll through 90+ consecutive problems without dropping a syntax exception or throwing infinite token loops is an immense relief. when you compress a 32B model down to tight FP8 and 4-bit configurations while scaling the context matrix toward an 800K target using RoPE and YaRN embeddings, the mathematical margin for error is razor-thin. one wrong scale factor and the model outputs broken brackets or repeats strings indefinitely. instead, the model is executing functional correctness cleanly. it’s handling complex array manipulations, algorithmic logic, and nested structural filters completely raw. because the weights are completely unburdened by chat filler, it behaves less like a chatbot and more like a lightning-fast logic compiler—reading the docstring and immediately piping clean python code directly to the testing harness. once it clears problem 164, the system will output the final pass@1 percentage. that single number will tell the definitive truth about the token economics i calculated earlier. if the pass rate holds up against these unit tests, we are looking at a model that can genuinely compete with sonnet 4.6 on pure engineering tasks, while operating at an estimated internal compute cost of just $2 per million input tokens and $6 per million output tokens—giving my agent pipeline high-tier logic execution at the price of haiku 4.5. i’m staying up until the script hits 164. final data drops the second the testing loops finish executing."}, {"post_id": 18372, "ts": "2026-06-29T14:36:24Z", "hours": 16.0, "text": "devlog: thalamus-thor-1 is trained. recap, kaggle breakthrough, and humaneval context recap if you haven’t been tracking: my first ship attempt for thalamus got rejected because the UI looked like a generic boilerplate wrapper. instead of a superficial patch, i decided to completely overhaul the core engine and train a custom 32B model optimized strictly for raw code logic—named thalamus-thor-1 . general knowledge was stripped out during data prep to keep weights lean; my existing gemini-led researcher team handles live web scraping instead. infrastructure-wise, it’s a massive scramble. puter.js proved way too limited for my 9-agent pipeline orchestration, so i’m entirely stranded there, burning through the absolute last of my aws credits and waiting on gcp/amd approvals. also, school starts in two days, so i’m building a lightweight remote pipeline to trigger test suites and monitor logs straight from school lab machines during free periods. the kaggle breakthrough yesterday, i was stuck in deepspeed ZeRO-3 initialization hell. every time the notebook tried to load the base parameters on kaggle’s free tpu v5e-8 clusters, a massive compute spike would trigger their aggressive backend session killers, immediately dropping the kernel. i spent hours adjusting chunk prefills, gradient accumulation steps, and stripping background overhead until the initialization sequence squeezed just under the termination threshold. the run finally executed, completed its QLoRA fine-tuning passes at FP8, scaled the context toward an 800K target using RoPE and YaRN with 4-bit compression, and successfully compiled the weights. the screenshot attached to this update is the actual kaggle notebook page of my AI training notebook showing the setup. initial sanity checks compiling weights is only half the battle. when you aggressively compress a 32B model down to FP8/4-bit formats while applying long-context scaling embeddings, the positional math can warp. if it breaks, the model turns into a hallucination engine. i spun up a local instance to run direct logic checks, and the structural syntax held together perfectly. it didn’t choke on deeply nested loops, accurately referenced parameters defined deep inside large codebase contexts, and skipped conversational fluff entirely to jump straight into code execution. tomorrow’s trial: the humaneval protocol vibe checks aren’t enough. tomorrow morning, i am setting up an automated evaluation harness to run thalamus-thor-1 through the full OpenAI HumanEval dataset (164 coding problems) to calculate the raw pass@1 rate. this will prove the token economics math i did earlier: whether this custom setup can genuinely compete with sonnet 4.6 and opus 4.6 on pure engineering tasks while running at an estimated cost of $2/1M input and $6/1M output tokens (top-tier intelligence at the price of haiku 4.5). hosting is still the looming issue. permanently serving this with an extended context window requires a dedicated 80gb VRAM prompt server configuration, which i’m trying to source while my teammate builds out the social media presence to push links. on a side note, fighting package conflicts during this nightmare inspired a lightweight side-utility: a clean CLI tool for coders that natively resolves dependency hell. the core engine is working perfectly, and you can track it here: https://stardance.hackclub.com/projects/6323 evaluation metrics drop tomorrow morning. let’s see what the numbers show."}, {"post_id": 17483, "ts": "2026-06-28T08:58:36Z", "hours": 13.0, "text": "quick recap on why the scope completely escalated: my first ship attempt for thalamus got rejected because the UI looked like a generic template wrapper and the documentation felt AI-generated. instead of just patching the CSS, i decided to completely overhaul the core engine and train a custom 32B model optimized for raw code logic—named thalamus-thor-1 . here is the brutal reality of the last 24 hours: 1. the infrastructure and credit crunch i previously planned to use puter.js as a temporary backend fallback router for the claude models while training. scratch that. puter.js is way too limited for the multi-agent architecture i’m running, so i’m entirely stranded there. right now, i’m burning through the absolute last of my AWS credits. i’ve applied for google cloud credits to spin up proper GPU instances, but everything hinges on getting that approval before the AWS runway hits zero. surviving on nothing but hope and coffee. 2. 13 hours battling kaggle i spent 13 hours straight fighting out-of-memory (OOM) errors and kaggle’s infrastructure quirks. i successfully patched the local OOM issues, but now i’m hitting a wall with their session killers. the platform completely terminates the notebook due to compute spikes right when ZeRO-3 is about to initialize. the screenshot for this post is the raw kaggle output cell showing exactly where the infra drops the hammer. because of this, i’ve applied for amd gpu credits. they’re vastly cheaper than nvidia options but offer massive amounts of vram, which is exactly what a high-context 32b setup needs to handle codebase ingestions via RoPE and YaRN. 3. Social Media on the startup side, my teammate is taking over the social media presence and will start pushing updates the second the app is not hope it’s functional. 4. dependency utility side-project ironically, fighting package conflicts during this 13-hour nightmare gave me an idea for a quality-of-life tool. i built a clean CLI tool for coders that natively resolves dependency hell. the core logic is already up and running perfectly. you can track and follow the new CLI project here: https://stardance.hackclub.com/projects/6323 going back to tweaking the zero-3 configurations before the credits completely empty out."}, {"post_id": 16791, "ts": "2026-06-27T08:04:57Z", "hours": 0.0, "text": "Just saw that puter.js brand themselves as unlimited AI, they arrent actually unlimited. Now on my hunt to find something to temporarily replace Puter.js for claude requests. Gotta start training my AI fast."}, {"post_id": 16771, "ts": "2026-06-27T07:22:32Z", "hours": 5.0, "text": "finally back from my trip. i didn’t post the last update because the entire scope of what i’m doing just completely escalated. to recap: my first ship attempt for thalamus got rejected. the feedback was that the UI looked too much like a generic AI wrapper boilerplate, the README felt AI-generated, and it needed unique features. instead of just doing a superficial skin change or tweaking the CSS to look pretty, i am using this as a reason to completely redo the underlying engineering and turn this into a true L4.5 or L5 agent that destroys things like claude code. i attached a photo of my handwritten notes to this post. it maps out the exact problem statements i’m tackling and the major flaws of currently existing solutions out there. my handwriting is messy, but the technical breakdown is all there. here is the actual game plan for the AI routing and training infrastructure: right now, i am updating the app to route claude models via puter.js. to be clear, this isn’t for the user interface—puter.js is strictly my temporary backend AI router. it acts as a fallback bridge while i build out my own custom models. i’m going to benchmark my self-trained models against every single task in my 9-agent pipeline. until my model is 100% foolproof on a specific task, puter.js will keep routing that specific agent’s requests to claude. but the second my custom model qualifies and beats the benchmarks for code mode, puter.js stops getting requests for it and the pipeline switches over entirely to my model. the actual training project is running parallel to this: i’m fine-tuning a 32B model optimized explicitly for pure coding and logical tasks. training is happening via QLoRA at FP8 with a 4k/8k base context, but i’m extending the context window all the way up to 800K using RoPE and YaRN with 4-bit compression, flashattention-3, and chunked prefills so it can digest entire codebases at once. i’m doing the actual training on kaggle kernels using the 30 free weekly hours on their TPU v5e-8 clusters. based on my calculations, this model will completely fail at things like history or literature, but it doesn’t need to be good at them. my gemini researcher agent team already handles live web search and pulls fresh information for those blind spots anyway. on pure code, this thing should easily beat sonnet 4.6 and compete with opus 4.6. the token economics are insane if this works: about $2 per million input tokens and $6 per million output tokens based on max output possible per hour versus GPU compute costs. that gives me sonnet/opus level intelligence at the price of haiku 4.5. the real bottleneck right now isn’t the data or the training—it’s hosting. deploying a 32B model with an extended context window means i need to secure an 80gb VRAM per parellel prompt configuration. figuring out how to source or fund that infrastructure without incinerating cash is the main issue i’m working through while compiling the training scripts. Today i will just do the rerouting to puter.js, then start working on fine tuning the 32b model. Wish me luck."}, {"post_id": 12491, "ts": "2026-06-20T12:13:17Z", "hours": 8.0, "text": "Following the rejection of my initial shipping submission, I am pivoting to address the required refinements. I am viewing this as a system audit rather than a failure—the core engineering is stable, but the interface and documentation need to move closer to a production-grade tool. Engineering Status Module Current Status Notes 9-Agent Pipeline Stable Successfully debugged AgentRouter integration. VM Bridge Alpha QEMU bridge is operational; optimizing latency. Claude Code Workflow Ready Pipeline errors resolved; full parsing functional. Feedback Audit The review team highlighted specific areas for improvement: Interface: The current UI requires a shift from “AI-template” style to a proprietary “Control Center” aesthetic. Documentation: The README is currently AI-generated; I will rewrite it to reflect the technical architecture of the 9-agent pipeline and the VM bridge implementation. Utility: Implementing “startup-specific” features that move beyond a standard chat wrapper. Schedule & Roadmap I am entering a maintenance window due to travel. No commits will be pushed during this period. June 20: Finalizing technical walkthrough assets. June 21 - 25: OFFLINE (Maintenance Mode) . June 26: Resuming development. Priority: UI Refactor & Documentation Audit. Project Repository: https://github.com/hardcoregamingsyle/thalamus ps. for anyone wondering, use markdown to format your devposts"}, {"post_id": 11911, "ts": "2026-06-19T12:32:42Z", "hours": 10.0, "text": "today has to be my most unproductive day yet. I am vey frustrated because of some error, and when I give it to claude code, guess what, Claude code is getting errors, Like it is topping in between, or giving me error 400, 401 or 403, That is what Im doing right now. it is just not working. Like I was fixing the Agent Output parasing so the Commands are Read properly. Thought to refractor all big files, Now refractoring myself would be time consuming, so I went to claude code, and giess what, Claude code is giving me errors, And i ended up spending the same number of time working as if I wouldve done manually. but atleast my code is fine and does not have any bugs. Once the WebUI is fixed PC, I will work on WebUI for other Devices, then work on the .exe file for the VM for any OS, I havegathered the ISOs for Windows 10, Widnows 11(Both are Pro Vesions and Preactivated), MacOS 11to MacOS 16, Android 14 and Android 13, Linux, Ubuntu and other Open Source OS systems, aftre that I will work on iOS. which is byfar the most difficult one. I also have to make some changes to the Referal System and Token Deduction system, It is currently Highly overpriced. Will update yall once I make some more progress"}, {"post_id": 11346, "ts": "2026-06-18T15:39:37Z", "hours": 6.0, "text": "This is devlog so I dont think we should only send our app progressions but treat it like a communuty, so to start with it. I finally got rid of a 400 error, found out while getting rid of it, my codebase got infected with corrupted files, I am now using claude code to clean uo my codebase. also sadly, I had to delete my entir git history, which is very sad. I am now from 68 coomits to just 4(the first commit has +~70k lines as proof that i had real work). Anyways, heres a photo of 2 corrupted files which I manually found. I better get some sleep before I get a headache and weaken my eyes."}, {"post_id": 11182, "ts": "2026-06-18T09:05:52Z", "hours": 8.0, "text": "Today, I finally got the code mode and study mode to work, They are a bit slow, Im working on it, also. right now, Im busy debugging this error that Im getting by claude code, all help will be highly appriciated. My Project is ready to be shipped, Will ship it today, all that I need to do is improve the already good documentation. REQUEST: Please help me solve this error that I am again and again getting while using claude code, I changed the settings.json of the .claude folder so I can use Claude code but the API will be of Agentrouter.org so I dont hve to buy the claude Plans. It works usually but sometimes I get this error, and when I di get it, it is just annoying. Demo: https://thalamus.aphantic.skinticals.com You will have to log in for More usage and access to Code mode and Research mode, had to restrict because it costs me money whenever someone uses it."}, {"post_id": 10641, "ts": "2026-06-17T14:31:46Z", "hours": 26.0, "text": "Well because my origional vibe coder got aquired by freebuff, I spent the rest of this time migrating from vly to Claude Code, made some progress, In initial testing, I found out that code mode and study mode were broken, Working on that, also stepping up my .exe from a Electron wrapper to a natice C++, C# Desktop app, Like of Minecraft/Roblox. This is taking me some time as claude code is kinda dumb for me because im like using it as my main Agent for the first time so it will take me some time getting the hang of it, Also I have cnnected Claude code to agentrouter, which is a third party that gives $100 initial credits and then $25 a day for signing in. Using my fav multi account system to get the most of this also. Will post another devlog as soon as I make some more progress. The image uploaded is just me working on code mode."}, {"post_id": 2023, "ts": "2026-06-04T09:34:49Z", "hours": 0.0, "text": "fixing the sandbox to actually work"}]...
|
Title: Thalamus + AgentOverflow by @Hardcore_Real_ Title: Thalamus + AgentOverflow by @Hardcore_Real_Name_is_nitish | Stardance
Devlogs:
fixing the sandbox to actually work
Well because my origional vibe coder got aquired by freebuff, I spent the rest of this time migrating from vly to Claude Code, made some progress, In initial testing, I found out that code mode and study mode were broken, Working on that, also stepping up my .exe from a Electron wrapper to a natice C++, C# Desktop app, Like of Minecraft/Roblox. This is taking me some time as claude code is kinda dumb for me because im like using it as my main Agent for the first time so it will take me some time getting the hang of it, Also I have cnnected Claude code to agentrouter, which is a third party that gives $100 initial credits and then $25 a day for signing in. Using my fav multi account system to get the most of this also. Will post another devlog as soon as I make some more progress. The image uploaded is just me working on code mode.
Today, I finally got the code mode and study mode to work, They are a bit slow, Im working on it, also. right now, Im busy debugging this error that Im getting by claude code, all help will be highly appriciated. My Project is ready to be shipped, Will ship it today, all that I need to do is improve the already good documentation. REQUEST: Please help me solve this error that I am again and again getting while using claude code, I changed the settings.json of the .claude folder so I can use Claude code but the API will be of Agentrouter.org so I dont hve to buy the claude Plans. It works usually but sometimes I get this error, and when I di get it, it is just annoying. Demo: https://thalamus.aphantic.skinticals.com You will have to log in for More usage and access to Code mode and Research mode, had to restrict because it costs me money whenever someone uses it.
This is devlog so I dont think we should only send our app progressions but treat it like a communuty, so to start with it. I finally got rid of a 400 error, found out while getting rid of it, my codebase got infected with corrupted files, I am now using claude code to clean uo my codebase. also sadly, I had to delete my entir git history, which is very sad. I am now from 68 coomits to just 4(the first commit has +~70k lines as proof that i had real work). Anyways, heres a photo of 2 corrupted files which I manually found. I better get some sleep before I get a headache and weaken my eyes.
today has to be my most unproductive day yet. I am vey frustrated because of some error, and when I give it to claude code, guess what, Claude code is getting errors, Like it is topping in between, or giving me error 400, 401 or 403, That is what Im doing right now. it is just not working. Like I was fixing the Agent Output parasing so the Commands are Read properly. Thought to refractor all big files, Now refractoring myself would be time consuming, so I went to claude code, and giess what, Claude code is giving me errors, And i ended up spending the same number of time working as if I wouldve done manually. but atleast my code is fine and does not have any bugs. Once the WebUI is fixed PC, I will work on WebUI for other Devices, then work on the .exe file for the VM for any OS, I havegathered the ISOs for Windows 10, Widnows 11(Both are Pro Vesions and Preactivated), MacOS 11to MacOS 16, Android 14 and Android 13, Linux, Ubuntu and other Open Source OS systems, aftre that I will work on iOS. which is byfar the most difficult one. I also have to make some changes to the Referal System and Token Deduction system, It is currently Highly overpriced. Will update yall once I make some more progress
Following the rejection of my initial shipping submission, I am pivoting to address the required refinements. I am viewing this as a system audit rather than a failure—the core engineering is stable, but the interface and documentation need to move closer to a production-grade tool. Engineering Status Module Current Status Notes 9-Agent Pipeline Stable Successfully debugged AgentRouter integration. VM Bridge Alpha QEMU bridge is operational; optimizing latency. Claude Code Workflow Ready Pipeline errors resolved; full parsing functional. Feedback Audit The review team highlighted specific areas for improvement: Interface: The current UI requires a shift from “AI-template” style to a proprietary “Control Center” aesthetic. Documentation: The README is currently AI-generated; I will rewrite it to reflect the technical architecture of the 9-agent pipeline and the VM bridge implementation. Utility: Implementing “startup-specific” features that move beyond a standard chat wrapper. Schedule & Roadmap I am entering a maintenance window due to travel. No commits will be pushed during this period. June 20: Finalizing technical walkthrough assets. June 21 - 25: OFFLINE (Maintenance Mode) . June 26: Resuming development. Priority: UI Refactor & Documentation Audit. Project Repository: https://github.com/hardcoregamingsyle/thalamus ps. for anyone wondering, use markdown to format your devposts
finally back from my trip. i didn’t post the last update because the entire scope of what i’m doing just completely escalated. to recap: my first ship attempt for thalamus got rejected. the feedback was that the UI looked too much like a generic AI wrapper boilerplate, the README felt AI-generated, and it needed unique features. instead of just doing a superficial skin change or tweaking the CSS to look pretty, i am using this as a reason to completely redo the underlying engineering and turn this into a true L4.5 or L5 agent that destroys things like claude code. i attached a photo of my handwritten notes to this post. it maps out the exact problem statements i’m tackling and the major flaws of currently existing solutions out there. my handwriting is messy, but the technical breakdown is all there. here is the actual game plan for the AI routing and training infrastructure: right now, i am updating the app to route claude models via puter.js. to be clear, this isn’t for the user interface—puter.js is strictly my temporary backend AI router. it acts as a fallback bridge while i build out my own custom models. i’m going to benchmark my self-trained models against every single task in my 9-agent pipeline. until my model is 100% foolproof on a specific task, puter.js will keep routing that specific agent’s requests to claude. but the second my custom model qualifies and beats the benchmarks for code mode, puter.js stops getting requests for it and the pipeline switches over entirely to my model. the actual training project is running parallel to this: i’m fine-tuning a 32B model optimized explicitly for pure coding and logical tasks. training is happening via QLoRA at FP8 with a 4k/8k base context, but i’m extending the context window all the way up to 800K using RoPE and YaRN with 4-bit compression, flashattention-3, and chunked prefills so it can digest entire codebases at once. i’m doing the actual training on kaggle kernels using the 30 free weekly hours on their TPU v5e-8 clusters. based on my calculations, this model will completely fail at things like history or literature, but it doesn’t need to be good at them. my gemini researcher agent team already handles live web search and pulls fresh information for those blind spots anyway. on pure code, this thing should easily beat sonnet 4.6 and compete with opus 4.6. the token economics are insane if this works: about $2 per million input tokens and $6 per million output tokens based on max output possible per hour versus GPU compute costs. that gives me sonnet/opus level intelligence at the price of haiku 4.5. the real bottleneck right now isn’t the data or the training—it’s hosting. deploying a 32B model with an extended context window means i need to secure an 80gb VRAM per parellel prompt configuration. figuring out how to source or fund that infrastructure without incinerating cash is the main issue i’m working through while compiling the training scripts. Today i will just do the rerouting to puter.js, then start working on fine tuning the 32b model. Wish me luck.
Just saw that puter.js brand themselves as unlimited AI, they arrent actually unlimited. Now on my hunt to find something to temporarily replace Puter.js for claude requests. Gotta start training my AI fast.
quick recap on why the scope completely escalated: my first ship attempt for thalamus got rejected because the UI looked like a generic template wrapper and the documentation felt AI-generated. instead of just patching the CSS, i decided to completely overhaul the core engine and train a custom 32B model optimized for raw code logic—named thalamus-thor-1 . here is the brutal reality of the last 24 hours: 1. the infrastructure and credit crunch i previously planned to use puter.js as a temporary backend fallback router for the claude models while training. scratch that. puter.js is way too limited for the multi-agent architecture i’m running, so i’m entirely stranded there. right now, i’m burning through the absolute last of my AWS credits. i’ve applied for google cloud credits to spin up proper GPU instances, but everything hinges on getting that approval before the AWS runway hits zero. surviving on nothing but hope and coffee. 2. 13 hours battling kaggle i spent 13 hours straight fighting out-of-memory (OOM) errors and kaggle’s infrastructure quirks. i successfully patched the local OOM issues, but now i’m hitting a wall with their session killers. the platform completely terminates the notebook due to compute spikes right when ZeRO-3 is about to initialize. the screenshot for this post is the raw kaggle output cell showing exactly where the infra drops the hammer. because of this, i’ve applied for amd gpu credits. they’re vastly cheaper than nvidia options but offer massive amounts of vram, which is exactly what a high-context 32b setup needs to handle codebase ingestions via RoPE and YaRN. 3. Social Media on the startup side, my teammate is taking over the social media presence and will start pushing updates the second the app is not hope it’s functional. 4. dependency utility side-project ironically, fighting package conflicts during this 13-hour nightmare gave me an idea for a quality-of-life tool. i built a clean CLI tool for coders that natively resolves dependency hell. the core logic is already up and running perfectly. you can track and follow the new CLI project here: https://stardance.hackclub.com/projects/6323 going back to tweaking the zero-3 configurations before the credits completely empty out.
devlog: thalamus-thor-1 is trained. recap, kaggle breakthrough, and humaneval context recap if you haven’t been tracking: my first ship attempt for thalamus got rejected because the UI looked like a generic boilerplate wrapper. instead of a superficial patch, i decided to completely overhaul the core engine and train a custom 32B model optimized strictly for raw code logic—named thalamus-thor-1 . general knowledge was stripped out during data prep to keep weights lean; my existing gemini-led researcher team handles live web scraping instead. infrastructure-wise, it’s a massive scramble. puter.js proved way too limited for my 9-agent pipeline orchestration, so i’m entirely stranded there, burning through the absolute last of my aws credits and waiting on gcp/amd approvals. also, school starts in two days, so i’m building a lightweight remote pipeline to trigger test suites and monitor logs straight from school lab machines during free periods. the kaggle breakthrough yesterday, i was stuck in deepspeed ZeRO-3 initialization hell. every time the notebook tried to load the base parameters on kaggle’s free tpu v5e-8 clusters, a massive compute spike would trigger their aggressive backend session killers, immediately dropping the kernel. i spent hours adjusting chunk prefills, gradient accumulation steps, and stripping background overhead until the initialization sequence squeezed just under the termination threshold. the run finally executed, completed its QLoRA fine-tuning passes at FP8, scaled the context toward an 800K target using RoPE and YaRN with 4-bit compression, and successfully compiled the weights. the screenshot attached to this update is the actual kaggle notebook page of my AI training notebook showing the setup. initial sanity checks compiling weights is only half the battle. when you aggressively compress a 32B model down to FP8/4-bit formats while applying long-context scaling embeddings, the positional math can warp. if it breaks, the model turns into a hallucination engine. i spun up a local instance to run direct logic checks, and the structural syntax held together perfectly. it didn’t choke on deeply nested loops, accurately referenced parameters defined deep inside large codebase contexts, and skipped conversational fluff entirely to jump straight into code execution. tomorrow’s trial: the humaneval protocol vibe checks aren’t enough. tomorrow morning, i am setting up an automated evaluation harness to run thalamus-thor-1 through the full OpenAI HumanEval dataset (164 coding problems) to calculate the raw pass@1 rate. this will prove the token economics math i did earlier: whether this custom setup can genuinely compete with sonnet 4.6 and opus 4.6 on pure engineering tasks while running at an estimated cost of $2/1M input and $6/1M output tokens (top-tier intelligence at the price of haiku 4.5). hosting is still the looming issue. permanently serving this with an extended context window requires a dedicated 80gb VRAM prompt server configuration, which i’m trying to source while my teammate builds out the social media presence to push links. on a side note, fighting package conflicts during this nightmare inspired a lightweight side-utility: a clean CLI tool for coders that natively resolves dependency hell. the core engine is working perfectly, and you can track it here: https://stardance.hackclub.com/projects/6323 evaluation metrics drop tomorrow morning. let’s see what the numbers show.
devlog: impatient engineering, skipping the wait, and running humaneval live the project recap quick context if you’re catching up: my initial submission for thalamus got rejected because the UI looked like a boilerplate wrapper. instead of a superficial skin-deep fix, i decided to overhaul the entire backend engine and train a custom, hyper-specialized 32B model optimized strictly for heavy coding logic—named thalamus-thor-1 . conversational filler was stripped entirely from the datasets to keep the weights lean; my existing gemini agent team handles live web scraping to cover general knowledge blind spots. the resource situation is a major scramble. puter.js was too limited for my 9-agent orchestration, so i abandoned it entirely. i’m burning through the absolute last of my AWS credits while waiting on approvals for google cloud and cheap amd gpu clusters. plus, school starts in a couple days, so i’m building a lightweight remote execution layer to trigger test suites and monitor terminal logs from the school computer lab during our free periods. earlier today, after a brutal 13-hour marathon fighting out-of-memory (OOM) errors and kaggle’s session killers on deepspeed ZeRO-3 initialization spikes, i finally pushed the parameters under the threshold and successfully compiled the weights on their tpu v5e-8 kernels. here is the live update from 1.5 hours later. the midnight deployment: saying screw it the plan from my last post was to sleep on the weights and stand up the evaluation harness tomorrow morning. i lasted twenty minutes. when you spend 13 straight hours fighting initialization crashes just to get a model cooked, you don’t leave the weights sitting cold on a drive. the curiosity and momentum make it impossible to step away. i went ahead, pulled down the evaluation scripts, configured the isolation wrappers, and slammed the model directly into the testing execution loop. right now, thalamus-thor-1 is running a live trial by fire. it is chewing through openai’s standard HumanEval dataset in real-time. as of typing this, the model has already plowed past 90 out of the 164 total programming problems in the suite. the screenshot attached is the raw stdout window of my evaluation terminal. you can see the script compiling generations, feeding function signatures, and executing validation unit tests back-to-back. what the logs are proving seeing the terminal scroll through 90+ consecutive problems without dropping a syntax exception or throwing infinite token loops is an immense relief. when you compress a 32B model down to tight FP8 and 4-bit configurations while scaling the context matrix toward an 800K target using RoPE and YaRN embeddings, the mathematical margin for error is razor-thin. one wrong scale factor and the model outputs broken brackets or repeats strings indefinitely. instead, the model is executing functional correctness cleanly. it’s handling complex array manipulations, algorithmic logic, and nested structural filters completely raw. because the weights are completely unburdened by chat filler, it behaves less like a chatbot and more like a lightning-fast logic compiler—reading the docstring and immediately piping clean python code directly to the testing harness. once it clears problem 164, the system will output the final pass@1 percentage. that single number will tell the definitive truth about the token economics i calculated earlier. if the pass rate holds up against these unit tests, we are looking at a model that can genuinely compete with sonnet 4.6 on pure engineering tasks, while operating at an estimated internal compute cost of just $2 per million input tokens and $6 per million output tokens—giving my agent pipeline high-tier logic execution at the price of haiku 4.5. i’m staying up until the script hits 164. final data drops the second the testing loops finish executing.
devlog: the 100-hour milestone, a humaneval script blowout, and parsing raw logs context recap (the architecture so far) for anyone catching up on the architecture overhaul: my initial ship for thalamus got rejected because the UI looked like an AI wrapper template. instead of shifting pixels, i decided to completely redo the backend engine. i’m training a custom, specialized 32B model optimized explicitly for programming logic—named thalamus-thor-1 . general fluff is scrubbed to save weight; a gemini researcher agent sub-team handles web scraping to cover info blind spots. resource-wise, it’s a tight squeeze. puter.js failed on orchestration, so i’m entirely dependent on a drying runway of AWS credits while waiting on google cloud and cheap amd gpu server approvals. with school starting in two days, i’ve also been preparing a lightweight remote framework to monitor logs and trigger test suites from school lab computers during short periods. earlier tonight, i managed to bypass kaggle’s aggressive session killers, successfully compiled the FP8/4-bit compressed weights on their tpu clusters, and immediately threw the model straight into openai’s standard 164-problem HumanEval benchmark. here is the live update from late tonight. milestone: 100 hours in the dirt first off, a quick personal timestamp: as of setting up these evaluation scripts, i have officially crossed the 100-hour mark of active development on this project. hitting triple digits while drowning in memory leaks, credit run-outs, and hardware timeouts is a brutal milestone, but the core engine is standing. the humaneval script blowout i watched the model successfully plow past problem 90, and it kept charging all the way through the end of the execution run. but right at the finish line, instead of outputting the final pass@1 score summary, the script threw a fatal calculation error and crashed out. the evaluation script generated the completions, ran the test assertions, and executed the functional verification, but the section of the code responsible for processing the final combination formula or compiling the macro-averaged percentage broke completely. standard human-eval metric scripts use an unbiased estimator calculation to evaluate pass@k: $$\text{pass@k} = 1 - \frac{\binom{n-c}{k}}{\binom{n}{k}}$$ if the array containing the total number of generated completions ($n$) or the correct passes ($c$) contains a single malformed row, a zero-division error, or an unhandled null exception from an execution timeout, the entire summary wrapper explodes. i’m staring at a broken metrics calculator, but the actual data isn’t lost. shifting to manual validation i’m not letting a broken parsing script mask the actual performance metrics of the weights after 100 hours of grind. the script managed to compile and save the fine-grained data out to the raw <input_path>_results.jsonl log file before the summary function choked. each row in that file contains the literal execution results marked cleanly as "passed" , "failed" , or "timed out" . instead of trying to debug the evaluator framework’s entry points tonight, i’m going to pull the raw JSON lines into a basic python script i’m writing right now. i’ll manually iterate through the rows, count the hard instances of "passed" across the tasks, and divide it by 164 to find the true, absolute pass@1 score myself. the raw logs are sitting in the directory. writing the cleanup parser now to see what thalamus-thor-1 actually scored.
I will now request Recertification, I think that I have done enough. To the reviewers, there are chances that you will get to use my self trained model if my AMD clloud credits request gets approved or my Google Cloud Instance quota gets increased, otherwise, the only change I have made is nothing. Im unable to put my AI online. SS uploaded is my kaggle account o you can see proof of AI model.
for the Ship reviewing team sry for last re cert request, forgot that I have to reqrite m readme.md did that, now im requesting re cert again. hopeefuylly it passes this time. ps.my credits request is still pending, AMD relied that they will respond ASAP, it is under review(do companes do that) and then also sent an apology letter for the delay(why? why did they send it?). and please remove the compulsion of having a photo/ss for software projects.
i will be surprised if i Dont get a migrane tommorow morning cause ive been spamming the .exe to work, the build for the .exe installer and .msi installer is failing again and again. to the shipwrights, the .exe is completely safe and virus free, there are chances that you will install a .msi instead of .exe on running, there are chances that the installer will fail, if it does, I know that it is failing and I am trying to fix it, if it works, then it works. heres a screenshot of the build failing. all I hope is that my ship gets verified this tme, 4rth time sending this bad boy for re cert.
put AI declaration, and got scammed 3 times by different websites, claiming they give free GPU hours but ended up giving nothing but takng my email. currently working on a way to host my model, working on the exact workflow that my next AI project under thalamus will use, it will be JARVIS so here is a spoiler. it will beat fable 5. and I have ran out of the weekly Claude limit on all my 5 email IDs. the instaler is still ended up being corrupt or incorrect. neither me nor AI can understand the problem here. and today i drank 3 cups of coffee instead f my usual 2. here is a screenshot of the error im recieving. and now i will send my shit for recertification again, now I have everything in place, including the AI declarations. hopefully, i wont hve to do it for the fifth or sixth time.
Finally got th exe to open, though it has more bugs than the entire insect population, but atleast it works. thats all I care abt, here is the login Popup that is done. gotta make the UI better and fix all these bugs now. and this is only windows, I still have to do this for macOS and linux(if possible) and then publish the app on microsoft app store and apple app store
and while I was thinking to upgrade the UI, I broke the .exe, like the exe is now broken. yay also my AMD credits request got approves so now I need to find a way to put my AI on AMD and such that the AI only gets activated when someone requests so that $50 lasts a long time, but in this system, Every user would have to wait for like 3 to 6 minutes for the GPU to turn on and boot, causing massive delays. Here is a screenshoot of the Github Actions failing.
FINALLY GOT THE EXE CODE TO COMPILE i put it in h1 because it is news that deserves h1, been batteling it for like 4 days my ship which i have sent for recertification for the 5th or 6th time is still under review Please remove this hard limit of not logging more than 10 hours in 1 go, like I cant be posting devlogs every nhow and then the exe is made, but not launching, debugging that now and with this, I am officially over 200 hours. YAYYY here is the screenshot of teh github actions completing succesfully(the .exe code compiling) also my Work on AI is still ongoing, My previous run failed my expecatitions, thistime the overall adtasets used is a bit too large(100gb+) and the slitting database code is causing errors.
I dont get it I understand the 30% AI rule but you have to see my project is not AI slop, Its quality work. like high quality work. I am here training my own AI(new skill), and creating an AI platform which will likely enter the AI race. and im getting rejected for “ai slop”??? please look into this, also, can someone see my ship, why does it have only 35hrs logges, it should be 200+ hours. request the community to look into this.
Adding GravityAds for some revenue(this is a startup, remember), tried to add Payment but BuyMeACoffee crashed, HCB Bank isnt in india so I had to go with BMAC, so payments is the next task, the exe had some reworks done. still looking for a way to make my $50 of AMD credits last long, also I noticed that Rather than wasting it on running, I can use the aprox 200gb of VRAM to train a very powerful AI Model in like 25 hours, and then give you all the .gguf and then it is up to you if you want to test the AI or not. also, I am now applying for Emergent Ventures(EV) and Theil Fellowship, because I need the most amount of grant possible to get this to work. and currently on a hunt to find ISOs for the QEMU VM system, I am looking for Preactivated Pro verison of Windows 10 and 11, which I think is illigal but right now, we havent launched publically yet so I dont think it matters that I am going on the illeagal path of Software Piracy, but I promise I will once use real lisenced Windows version. For MacOS, it is something that can never be on the legal route till I get a good sustainable revenue stream. Using hackintosh version of MacOS 11 to current(MacOS 26), for those who dont know, Hackintosh is just a illeagal copy of Macintosh, or the Macbooks we use, so they need the MacOS that can run on sillicon other than Apple’s sillicon so thats why they are like cracked and all. hopefully I am not banned for distributing kindof illeagal information so here is a disclaimer: educational purppouses only here is a screenshot of me trying to debug why GravityAds are not being shown(console is empty and the adslots are not there meaning something is failing silently)
gravityads yet not working, BMAC under progress, how to deploy my AI is still a question with no practical answer, I asked my parents to buy huggingface paid plan for me so I can use zeroGPU, I got a hour long lecture on How I have to escape the fake tech world, and how these people scam us. currently working on improving the feel of the desktop app and vibe coder, step-1: Give it the feel of Claude Code, Codex or any other l4 vibe coder(easy) step 2: Upgrade the feel to make it a true l4.5 Agent(near impossible level difficulty, I wont be copying anyone here, I would have to make my own definatation of L4.5) Side Quest(Very Important): Either get yourself a Good amount of GPU hours or get yourself a way to deploy your AI model somewhere. Frustration is at it’s peak. and can someone please gift me a RTX Pro 6000(Blackwell), it has 96gb of VRAM, enough to trsin a 64B Model on it and make it very very good. here is the screenshot of a response from AI in the desktop App. Now I will work on MacOS desktop app.
I was trying to put in dynamic AI coding pipeline, and guess what, My code mode compeltely crashed. My AI is still being trained(errors o errors+ hitting my weekly limit.), also,My application for Emerging Ventures got rejected because I hadnt put in all info(mb), Will reapply again. For some reason, my GravityAds Account is showing unverified Via API but verified via dashboard, and I am still working on BMAC integration for paywall, I need to figure out on the payment and stuff. this is Devpost 1 of asking for the Claude Max x20 plan in the shop. and Huggingface GPU hours credits in the shop. here is a screenshot of of my rejection letter.
don’t ask whats going on with my self trained AI, it is in no good state, the code either works, or it doesnt, or it works but something is off. I have a new idea, under thalamus, I will have AgentOverflow AgentOverflow is like StackOverflow but for Agents, will explain it later(when I actually start to work on it) BMAC is in queue. Dynamic pipeline is kindof done, kindof undone. Desktop app turned out to be nicer than I thought. rest I have nothing to say. here is a screenshot of the desktop app build mode returning a valid output instead of an error thats all I have to say
working on Agentoberflow, which is stackoverlow for agents, Side by side working on dynamic pipeline. For agentoverflow, as a starting point, I am adding the entire stackoverflow database, like its entire codebase, Cleaned and filtered, Vectorised, and Graphed using GraphRAG, Storing it in maybe AWS EC2 as it is the cheapest. Also working on the Agentoverflow website, though both have the same database, like the exact same database in convex so that in the future, when I want to make a My entire ecosystem at 1 place, it is very very easy for me to do. and my life is in the greatest mess possible, my parents make me constantly change setups, due to which I need my own laptop, in the sense which I got on my own with my own effort so they cant take it from me, and I also need my own phone. so I dont have to make sure that my whatsapp is logged into every device. and I am completely dropping Payments in the App because BMAC requires stripe to connect payment. here is a screenshot of the new Agentoverflow Website.
more work on Agentoverflow, added MCP tool, currently around 10% of stackoveflow database is in this bad boy. here is a ss of what im thinking of doing next.
Testing MCP, I am setting AI training Aside because im currently creating the database. hopefully everythng will work, this AgentOverflow is like the brilliant idea, like barely any competition. website: https://agentoverflow.aphantic.skinticals.com/ git repo: https://github.com/hardcoregamingsyle/agentoverflow currently ingesting the entire stackoverflow database, while integrating it into thalamus. will also submit agentoverflow as a tool for ClaudeCode. SS of new website.
added 3d and scroll anims to Thalamus, increased the Limits per day in Agentoverflow so it can compete with StackOverflow, currently at 300k Examples for Agentoverflow, compute is slow, will reach to 3.7m+ by 3 weeks.
did the UI and animations for agentoverflow also. https://agentoverflow.aphantic.skinticals.com/
agentoverflow has 475k+ examples in dataset(total is 3.7m), and im so great, I forgot to git push and deleed my folder, great, time to redo the special feature(not releasing yet). I published my site to google analytics. Im talking with my school rn if they can take my project and make it the official school AI. my school’s beurocracy is slow as hell. so idk if it will ever happen. also, here is a ss of the admin panel(of agentoverflow)
Now working o SEO and indexing, Agentoverflow db has over 730k entries. Intigrated Agentoverflow MCP into thalamus and also integrated Sketchfab MCP for 3d models in case of Gameev or projects that require a 3d model. Currently testing my Code mode. Prompt: Build a highly advanced flight sim. Also, quick question, I made this AI, so I can use my own AI to build other projects, right.
i havent slept since the last 24 hours, cause FIFA world Cup was at night, and during the day, I never sleep, so Im forcing myself to work as hell. already crossedthe 800k point. Improved the Dispatcher in Thalamus. the Thalamus test is still going on. I have started blog posting for SEO. I have indexed both sites on Google search. set both Platforms completely unrestricted and free for now. Link to both websites: https://agentoverflow.aphantic.skinticals.com/ https://thalamus.aphantic.skinticals.com/ here is SS of the AI working.
Trying to find better API for the AI Agents in Thalamus. Currently trying our Cloudflare Workers AI, in Agentoverflow, the Database Size is now 1.125Mil. I was showcasing my project in the incubator, and guess what, I was surorised to see a payment error, My API hit it’s limit somehow and I got 0 RESPONSE. I GOT HUMILIATED. for SS, I got nothing, currently working on Dynamic Compressions and stuff, als, in agentoverflow, I expect a problem in searhc, the result being not relevant. I will be sending agentoverflow to Claude Code MCP forum so the reviewers review it and put it in. here is a ss of the admin panel.
Finally, found a reliable API aource(for now). well now I can finally relax. but I wont, why, I need to fix the bug that my input tokens are at like 200k while my output tokens are barely 20k, meaning my input is bloated. so gotta fix that full night. and as I was writing this, guess what I saw.Eror 403, insufficient balance. guess im back to looking for API. god bless me with unlimited credits.
quick Update. Now im using ollama cloud wil like 3 different accounts, will exapnd this to like 50 different accounts so I never have to go on paid tier till I have the money. I was checking hackatime, And im No. 1 here is ss for proof.
my entire databse got wiped, 0 learnings. and that isnt the worst. my greatest enemy, Daal(We caal him that), literally told my crush, who was very close to me(we talked alot), and now, she avoids me. Thanks to my friends, I know why she avoids me(I skip school almost everyday). Here is a ss of the database with 0 learnings. Im broken, depressed, you can make me happy by sending a emaill to Anthropic, telling them to integrate agentoverflow directly into their tools list for code mode.
busy fixing the agentoverflow error. still working on it, no time for a detailed devlog, here is ss of admin panel, latest.
i am so done for it. i spent this entire week. trying to find out why is the admin panel showing 0 learnings. guess what. my mom deleted the VM, thinking it would remove all charges, I didnt even have a backup. great, back to square 1. and the agentoverflow admin panel has a error, trying to integrate AdMesh for Ad Revenue. Will use Modal as it is a serverless infrastructure for hosting AI models. I now need credits. allso, my mouse and keyboard are giving up on me. here is ss of error.
I purged all dad code, did a massive refractor, fixed anything broken, left nothing. both repos, around 15k lines touched(must be my most productive session.) and I am so done, my migrane is at its peak, but IDK, i cant sleep anyways so better work than stare at the ceiling. Also, AdminPanel finally works. and since I lost my entiredatabase, it will take a day or 2 for the reindexing to start, right now its just botting up, downloading the embedding model and the entire database. I am still depressed. will take me some time to recover from the emotional trauma.
I FINALLY CRACKED THE UNLIMITED VM PROBLEM. Github Actions are unlimited usage for publrepos, and for source control, we are already making a public repo, and we get a Free VM with it. I can Run iOS, MacOS, Windows, Linux and Android on it, no restrictions, completely free. WoHoo. also, now I am no longer using Closed source Models, because Open Sourced Models, if Used correctly are alot cheaper and provide the same result as any Closed Sourced Models. Agentoverflow is still working well. Will shift from google Cloud to Oracle Cloud, as Orace gives a 50% more powerful, compoletely dedicated server for free with 200gb storage, and that additional 150gb that I need costs me just under $4 a month, so It is very very viable financially. will switch to it later. I will now add a Student Mode for anyone with the email given by my school, and a teacher mode for teacher emails. Still recovering from the emotional trauma of the database loss. Added gravity Ads, need to remove alot of adslots because right now, it is spam impressions, not hih quality impressios, but still, here is ss.
polishing the VM and all, and good news, Im part of the 1 million founders, 5 day bootcamp. Its a very very god program, the onluy thing i hate about it is the dress code, like seriously, shirts and pants. why not joggers and t shirts, they are confortabel af. also, i monitored teh agentoverflow corpus, well, it had a problem, the API key of gemini to verify absolute gold tier learnings, im so dumb I waited 3 days for something to happen and only to realise forgot to set the APU key. yup, this is greatness at it’s peak. for thalamus, doing some polishing, just realised that git import diesnt work, fixing that, removing the requirement of git pat. Fixing a few more stuff. also, I just realised another problem, the database. how am I going to set up databases, like how do I set uo convex for everyone who uses this for free. well if the VM problem had a solution, this should also have a solution. API is working, tested it with claude code. Claud eput in 15 learnings for me. also, I realised that I forgot to change the sandbox tab to leave the old VM system an move on to the new Github Actions system. Also, long time I havent updated my .exe gotta do that also. Quick update- I got a Notif that I am suspiciously a fraud, like a serious fraud. the Fraud Squad app sent me the notif. after that, I am still trying to recover from the emotional trauma of the database loss. I will be angry with my mother for a bit more time(se was the one who deleted it). IK im cruel and he didnt mean it, but recovery takes time. also, For the next week, after I do the changes and fixes required, I will be using only and only thalamus to code Thalamus. right, An AI that will code itself, but I will be the one guiding it. because if I cant use it, my product aint ready for market launch. for screnshot, idk what to put. like all I did was console work and Im definately not showi my console here. the names are kindof inappropriate. so here is my old sandbox tab. Good Bye QEMU and VNC Viewer. you are getting replaced by Github(atleast they aint getting replaced by AI.)
I dont understand why is my Code mode routing going to Ollama when everyting else point to NVIDIA NIM, even the OLLAMA Fallback is Nvidia NIM, the Primary provider is convex dashboard is NIM, my ollama keys are at limits and this great code mode is pointing at NIM. whyyy. Currently working on fixing the Github sanbox. thats kindof broken. rest everything works. For some reason, even on a successful github import, it shows an error(AI slop, thats why. I made the github system with AI) . the sandbox just doesnt detect the repo. and the Hack Club Fraud Squad is sus with me(I dnt blame them, 17hrs a day for a 14yr old is suspicious.) I have migrane, I dont have glasses and my eyes are very healthy(somehow). once any 1 of my project gets reviewed and I get payout, im spending it all on hostng and AI credits so I can switch over to Oracle and Modal. Agentoverflow is still going through filteration and final review. I have cooked myself. I am still procastinating the .exe(even with AI, building a native .exe is a headache.) here is SS of the new Sandbox tab
Finally, got the routing to work properly. Everyting works now. My head is so done for it. also, I just saw something, and People like me may be the reason for it getting added. Im uploading it as the screenshot.
Everything Finally works, except the VM, it got some error, debugging that, then I just came up with a new idea(thanks to my yt feed) add a ADHD mode toggle in Chat mode and Research mode, basically ADHD in AI will I think help AI leave its very formal guided approach t problems, with the distracter, it will be jumping here and there, maybe making connections, giving us a better take at making AI good. There will also be a Brainstorm mode, the Brainstorm mode will give AI ADHD and it will help in brainstorming startup Ideas, startegies, and stuff. can someone remove this screenshot compulsion. I dont have a screenshot every devpost.
I am now doing something kind of risky. giving AI adhd. Like literal ADHD. level 2/5 and for some tasks level 2.5/5 as per my research, this should increase the output quality of AI. also checked agentoverflow compute, it’s working Okayish. claude has access to it and my limit resets tommorow, so the automated checks aint happening and I have to check manually. Here is SS of me creating a whatsapp clone as the test of this AI(hopefully this tells you what Im expecting form my AI.)
Ships:
Reviewer Notes (School Incubator Startup) Status: Built in my school’s startup incubator; some edge-case features are undergoing rapid iteration. Auth Required: Sign up via email OTP to unlock Research/Build Modes or send >3 messages (prevents API exploitation/high costs). Credits: Runs on live premium models (Claude Opus via AWS Bedrock). Minor risk of downtime if incubator credits exhaust, but we should be fine. Thalamus AI: L4.5 Agent Platform Thalamus AI (by Aphantic Corporations) is an all-purpose Level 4.5 AI ecosystem combining multi-agent workflows, deep research, and true local QEMU OS virtualization inside your browser session via a lightweight 31MB local Node.js WebSocket bridge. The 4 Core Modes Chat: Context-aware assistant for writing, planning, and summarization. Research: Synthesizes live web search with inline source citations. Study: Adaptive RAG tutor; uploads notes to auto-generate custom quizzes/solutions. Build (Code): Multi-agent pipeline building full-stack apps from plain English. 9-Agent Code Pipeline Runs asynchronously via Convex scheduled functions using smart model routing: Researcher (Haiku): Maps existing engineering benchmarks. Analyser (Haiku): Dissects product requirements and edge cases. Planner (Haiku): Graphs detailed task execution plans. Coder (Opus 4.6/4.8): Authors core logic, APIs, and databases. Optimiser (Sonnet): Refactors code for scale and algorithmic efficiency. Organizer (Haiku): Automatically structures folder/file directories. Tester (Sonnet): Generates robust end-to-end unit test suites. Hacker (Sonnet/Opus): Conducts penetration audits to patch vulnerabilities. Critic (Haiku): Acts as the final quality gate; rejects incomplete work. Native Stack & OS Virtualization OS Support: Boots Windows 11/10, macOS Sequoia/Sonoma, Linux (Ubuntu/Kali), and Android. Browser-only instant boot for Alpine/Arch Linux. Ultra-Lean Desktop: Built with Neutralinojs (uses native Edge WebView2)—only 2.2 MB total app size. Integrated with GitHub OAuth for automated commits after agent cycles....
|
1792882140.8869603
|
1793746140.8869603
|
|
2717
|
Voxly by @devlsx | Stardance
|
devlsx
|
0
|
523.94
|
0
|
[]
|
[{"post_id": 49741, "ts": "202 [{"post_id": 49741, "ts": "2026-08-18T17:41:48Z", "hours": 7.5717, "text": "Today, I focused on the menu subsystem, primarily implementing and refining the main menu and inventory screen functionalities. This work is essential for user interaction and enhancing the player experience through intuitive navigation."}, {"post_id": 49029, "ts": "2026-08-17T16:52:34Z", "hours": 8.4061, "text": "Today, I worked primarily on the HUD subsystem, focusing on the implementation of various HUD components and inventory screens. This is crucial for improving user interaction and providing feedback during gameplay"}, {"post_id": 48635, "ts": "2026-08-17T03:21:13Z", "hours": 8.1392, "text": "Today, I focused on enhancing the console subsystem, which is crucial for debugging and player input management. The improvements made today lay the groundwork for a more robust command interface, enabling better interaction with the game engine."}, {"post_id": 47593, "ts": "2026-08-15T16:07:27Z", "hours": 7.4953, "text": "Today I focused on the user interface subsystem, specifically initializing components for the HUD and integrating health and experience mechanics. This work is essential to establish a basis for player feedback and interaction, enhancing overall gameplayability."}, {"post_id": 47305, "ts": "2026-08-15T05:26:32Z", "hours": 8.2014, "text": "Today, I focused on the tools subsystem, particularly the tools registry and experience (XP) management systems. This work is crucial for establishing a structured framework for tool interactions and player progression"}, {"post_id": 46467, "ts": "2026-08-13T18:07:41Z", "hours": 7.835, "text": "Today I focused on the inventory and tools subsystems, specifically enhancing item durability management and transfer mechanisms. These additions are critical for ensuring that tool usage and inventory interactions are coherent and efficient."}, {"post_id": 45764, "ts": "2026-08-12T13:49:08Z", "hours": 3.4153, "text": "Today I focused on the inventory subsystem, specifically initializing and structuring the inventory components. This work is critical for ensuring a robust and functional system for managing player items, which is foundational for gameplay mechanics."}, {"post_id": 45616, "ts": "2026-08-12T07:06:28Z", "hours": 5.5572, "text": "Today I focused on the implementation of the fishing subsystem, which is crucial for adding interactive gameplay elements that enhance player engagement. This work lays the foundation for fishing mechanics, including casting, line management, and loot generation."}, {"post_id": 45119, "ts": "2026-08-11T12:21:18Z", "hours": 5.0722, "text": "This morning’s work focused on implementing mechanics related to fishing, an essential feature for gameplay. The changes address various aspects of the fishing system, including mechanics for enchantments and loot generation."}, {"post_id": 44638, "ts": "2026-08-10T15:15:36Z", "hours": 7.275, "text": "Today, I focused on the enchantment subsystem, establishing the foundational architecture for enchantments and their associated mechanics. This work is critical, as enchantments will enhance player interaction and item customization within the game."}, {"post_id": 44121, "ts": "2026-08-09T18:03:06Z", "hours": 5.5161, "text": "Today, I focused on the effects subsystem and the crafting system to enhance gameplay mechanics and item interactions. These improvements are crucial for player feedback and item management in the game."}, {"post_id": 43832, "ts": "2026-08-09T08:15:49Z", "hours": 6.155, "text": "Today, I focused on the crafting subsystem, establishing foundational components essential for managing crafting recipes and related functionalities. This work is crucial for enabling player interactions with crafting mechanics, which are integral to gameplay progression."}, {"post_id": 43212, "ts": "2026-08-08T10:42:59Z", "hours": 12.7892, "text": "Today, I focused on the building subsystem, which is critical for player interaction and environment manipulation. The work primarily involved finalizing and scaffolding various components of the building mechanics, including previews, placement, and rotation."}, {"post_id": 41484, "ts": "2026-08-05T18:37:03Z", "hours": 7.0583, "text": "Today, I focused on the spawning subsystem, specifically on the initial implementation of the spawnx module and the scaffolding of related systems. This work is essential for managing entity generation and behavior in the voxel environment."}, {"post_id": 40295, "ts": "2026-08-03T18:45:01Z", "hours": 8.5008, "text": "Today, I focused on the spawning subsystem, specifically on the initial implementation of the spawnx module and the scaffolding of related systems. This work is essential for managing entity generation and behavior in the voxel environment."}, {"post_id": 39476, "ts": "2026-08-02T13:26:12Z", "hours": 16.3919, "text": "Today, I focused on the projectile system within the game engine, specifically working on the memory management and foundational structures for spawning and managing projectiles. This work is crucial for optimizing projectile behavior and ensuring efficient resource allocation during gameplay."}, {"post_id": 38063, "ts": "2026-07-31T08:10:43Z", "hours": 8.2386, "text": "Today, I focused on the navigation subsystem, implementing several foundational components essential for pathfinding and AI navigation within the voxel environment. This work is crucial for enabling agents to navigate through the game world effectively."}, {"post_id": 37248, "ts": "2026-07-29T20:14:29Z", "hours": 5.8831, "text": "Today, I focused on the implementation of the mob subsystem, particularly in setting up the foundational structures and behaviors for various mobile entities within the engine. This work is crucial for establishing NPC interactions and their movement dynamics in the game world."}, {"post_id": 36423, "ts": "2026-07-28T15:19:47Z", "hours": 1.5781, "text": "Today, I focused on enhancing the physics subsystem, specifically the entity physics (ephysics) module. This work is essential to establish a robust framework for collision handling, motion integration, and interactions with the environment. ephysics_sweep: Expanded the logic to improve sweep tests for collision detection, ensuring accurate intersection calculations between moving entities and static geometry.ephysics_step: Initiated the implementation of the stepping function, which manages the simulation time step for physics updates, crucial for maintaining consistent behavior across frame rates.ephysics_spatial: Established a spatial partitioning system to optimize collision queries, using an efficient data structure to reduce the number of checks required during each physics update.ephysics_body_from_entity: Completed the function to create physics bodies from game entities, allowing for dynamic interaction based on entity properties and state.ephysics_query_solid_cell: Implemented a query method to check for solid cells within the voxel grid, facilitating accurate collision responses for entities interacting with the voxel environment.ephysics_pushout: Began development on the pushout mechanism, which resolves collisions by adjusting the position of entities to avoid overlaps with solid objects.ephysics_motion_ballistic: Filled in the calculations for ballistic motion, allowing entities to simulate projectile trajectories accurately under the influence of gravity.ephysics_falldmg: Developed functionality to handle fall damage, tying entity physics state to health mechanics based on vertical distance fallen. The physics subsystem is becoming more cohesive with these additions. The next logical step is to finalize the integration of the impulse and fluid simulation components, enhancing interaction realism further."}, {"post_id": 36375, "ts": "2026-07-28T13:29:59Z", "hours": 5.6275, "text": "This morning, I focused on enhancing the physics subsystem, specifically in the area of impulse and motion mechanics. This work is crucial for achieving realistic interactions and responses to forces within the game environment. ephysics_motion_ballistic: Implemented the initial projectile motion calculations, enabling objects to follow a parabolic trajectory under gravity.ephysics_pushout: Started designing the pushout mechanism to resolve overlaps between colliding objects, which will be essential for player movement and interaction.ephysics_impulse: Created a stub for impulse application, setting up the necessary data structures to handle instantaneous force applications on entities.ephysics_falldmg: Completed the fall damage calculation, accounting for the velocity of the entity at impact, which enhances realism in gameplay.ephysics_current: Filled in the functionality for current effects, allowing entities to be influenced by environmental forces, such as water currents. The current state includes foundational motion and interaction mechanics. The next step will involve expanding on impulse handling to ensure comprehensive force interactions across various physics scenarios."}, {"post_id": 36055, "ts": "2026-07-27T22:00:35Z", "hours": 7.0375, "text": "Today’s work focused on the integration of the entity-component-system (ECS) architecture and the initial implementation of the physics subsystem. This is crucial for establishing a robust framework for game object management and collision detection. ephysics_aabb: Implemented the Axis-Aligned Bounding Box (AABB) structure to support collision checks. This provides an efficient way to handle spatial queries.ephysics_broadphase: Developed the broad phase collision detection system. This module identifies potential collisions using AABBs to minimize computational overhead during the narrow phase checks.ephysics_ccd_resolve: Added continuous collision detection resolution to ensure accurate collision handling for fast-moving entities, preventing tunneling issues.ecs_world: Scaffolding for the ECS world management was set up, allowing for the organization and management of entities and components effectively.ecs_types: Established foundational data structures for components, enhancing type safety and access patterns within the ECS framework.ecs_get: Implemented the ecs_get function to retrieve components associated with entities, facilitating component retrieval in a type-safe manner.ecs_sys_collide: Wrote the initial collision system that integrates with the ECS, processing collision events and leveraging the broad phase detection.ecs_stats: Initiated the ECS stats module, which tracks performance metrics and entity counts, vital for optimizing system performance. The current state of the engine now includes a foundational ECS structure with a basic physics engine integrated. The next step involves refining the collision resolution mechanism and expanding the entity management features."}, {"post_id": 35390, "ts": "2026-07-26T19:15:43Z", "hours": 6.2511, "text": "Today, I focused on the development of the Entity-Component-System (ECS) architecture, specifically initializing spatial queries and establishing foundational components for entity management. This work is critical for optimizing game object interactions and enabling efficient systems for rendering and gameplay logic. ecs_spatial: Initiated the module to manage spatial queries for entities, allowing for efficient retrieval of entities based on their spatial positions. This is essential for implementing features like frustum culling and collision detection.ecs_query: Added the initial structure for querying entities based on components. Stubbing out this system lays the groundwork for flexible querying mechanisms essential for game logic processing.ecs_relations: Started the implementation of relational data structures to handle parent-child relationships between entities, which will facilitate a hierarchy for transformations and event propagation.ecs_blob_init: Completed the initialization sequence for ECS blobs, which encapsulate component data for entities, improving memory layout and access patterns while ensuring efficient entity creation and destruction.ecs_prefab: Introduced the prefab system for defining reusable entity templates. This system will streamline the instantiation of common game objects and reduce redundancy in entity creation.ecs_group_refresh: Enhanced the group management system to refresh entity groups based on component changes, optimizing the update cycle for systems relying on dynamic entity states.ecs_events: Implemented an event system to handle notifications between entities and systems, allowing for decoupled interactions and improved modularity.combat_resist, combat_rng, combat_knockback, and combat_log: Started implementing core combat mechanics, including resistance calculations and random number generation for combat outcomes, along with stubbing out logging for combat events. The ECS framework is now more robust, and the next step will be to integrate these components into a cohesive system, ensuring that queries and events operate seamlessly across the game engine."}, {"post_id": 35134, "ts": "2026-07-26T11:39:12Z", "hours": 1.6492, "text": "This morning, I focused on the combat subsystem, implementing new mechanics that enhance player interactions and feedback during combat. These changes are pivotal for establishing a robust gameplay foundation. combat_resist: Implemented a resistance mechanic that determines damage mitigation based on player attributes, allowing for more nuanced combat outcomes.combat_rng: Added a random number generator for damage calculations, introducing variability in combat results to enhance unpredictability and player engagement.combat_knockback: Developed a knockback effect that alters player position upon receiving damage, improving the physicality of combat interactions.combat_log_death_message: Implemented logging functionality to display a message when a player character dies, providing clear feedback for the player on their status.stub out combat_log: Created a basic structure for the combat log system, laying the groundwork for future enhancements in tracking combat events and player actions. Current progress has established essential combat mechanics. The next step will involve integrating these systems into the overall game loop for testing and refinement."}, {"post_id": 34884, "ts": "2026-07-25T23:24:12Z", "hours": 7.8778, "text": "Today, I focused on the combat subsystem, specifically implementing various components necessary for managing health, damage, and character behaviors during combat scenarios. This work is critical for establishing a solid foundation for player interactions and enemy behaviors. Combat System: Implemented combat_health, which tracks and manages health points for entities, including health reduction mechanics and thresholds for death events.Combat System: Added combat_invuln, providing temporary invulnerability states for characters, which allows for the management of damage immunity during specific animations or effects.Combat System: Developed combat_knockback, a mechanic that applies force to characters upon receiving damage, enhancing the feedback of combat interactions.Behavior Tree: Stubbed out the combat_combo, which will facilitate chaining of attacks for characters, setting up a framework for more advanced combat mechanics.Behavior Management: Completed behavior_tree_free to ensure proper memory management of behavior trees, preventing memory leaks during runtime.Behavior Management: Initiated behavior_runner_init, which sets up the initial state for behavior execution, crucial for managing different character actions effectively.Combat System: Implemented combat_dmg_info_get, which retrieves damage information relevant for interaction logic, aiding in the clarity of combat events.Cleanup: Conducted code tidying and minor fixes across the combat module to enhance readability and maintainability. The combat subsystem now has a more cohesive structure with the groundwork laid for complex interactions. The next step will involve fleshing out the behavior tree logic to integrate advanced AI behaviors and attack combos."}, {"post_id": 34137, "ts": "2026-07-24T17:15:39Z", "hours": 8.2794, "text": "Today, I focused on the animation subsystem of the voxl engine, specifically enhancing the animation systems to support skeletal animation and procedural walking behaviors. This work is crucial for implementing character animations that are both dynamic and responsive to gameplay inputs. behavior_leaf: Implemented the behavior_leaf module, establishing a base for behavior trees that allows for more complex AI decision-making processes.behavior_builder: Developed the behavior_builder to construct behavior trees programmatically, centralizing the creation and management of AI behaviors.behavior_act_target_in_reach: Completed the implementation of the behavior_act_target_in_reach, which checks proximity to targets for AI actions, enhancing interaction capabilities.anim_skeleton: Began scaffolding the anim_skeleton module, which will define the structure and hierarchy of skeletal animations, essential for character rigging.anim_rig: Set up the anim_rig, providing the framework for binding animations to skeletal structures, facilitating smooth character movement.animation_procedural_walk: Expanded the animation_procedural_walk to allow for dynamic adjustments based on character speed and terrain, improving realism in character locomotion.anim_controller: Introduced the anim_controller to manage the state and transitions of animations, allowing for layered animation blending and more responsive character behaviors.entity_render: Implemented entity_render functionality, which integrates the rendering of animated entities into the broader scene graph, ensuring visual coherence. The current state of the animation system is foundational but progressing well, with core modules in place for skeletal animation. The next steps will involve refining the blending of animations and integrating more complex animation states."}, {"post_id": 33722, "ts": "2026-07-23T21:05:30Z", "hours": 7.5361, "text": "Today, I focused on implementing the initial stages of the animation and AI subsystems, as well as enhancements to the water rendering pipeline. These components are critical for enhancing the game’s dynamic interactions and visual fidelity. Animation System: Implemented foundational structures for anim_blend. This allows for smooth transitions between different animations, improving character movement fluidity.Entity System: Completed the entity module, enabling proper management of game objects, including their lifecycle and state management, which is essential for gameplay.AI Module: Introduced the pathfind function, allowing entities to navigate the game world effectively. This is a crucial step towards integrating more complex AI behaviors.Water Rendering: Established the water_pass, implementing the water rendering pipeline. This includes setting up reflection and refraction capabilities using a dedicated reflection camera (water_reflcam), enhancing visual realism.Water Effects: Started work on water_wave and water_foam, which will simulate surface interactions and enhance the dynamic appearance of water bodies.AI Updates: Added ai_tick, which will manage updates to AI behaviors each frame, ensuring responsive and engaging NPC interactions. Current progress includes foundational setups for both animation and AI systems, alongside initial water rendering capabilities. The next logical step involves refining the AI behaviors and continuing the development of the water effects to enhance environmental interactions."}, {"post_id": 33113, "ts": "2026-07-22T18:48:49Z", "hours": 7.3406, "text": "Today, I focused on implementing various aspects of the volumetric rendering subsystem. This work is critical for enhancing the visual fidelity of the water rendering and introducing new volumetric effects, which are essential for achieving realistic environmental interactions in the engine. water_reflect: Implemented reflective properties for water surfaces, enhancing the realism of water rendering by calculating reflection vectors based on the viewer’s position and the surface normals.volumetric_programs_use_march: Wired up the volumetric rendering programs to utilize a raymarching approach for rendering volumetric effects, allowing for more complex light interactions within volumes.vol_raymarch: Began development of the raymarching algorithm for volumetric rendering, laying the groundwork for subsequent implementations of effects such as fog and smoke.volumetric_pass_run: Implemented the core function to execute volumetric passes, establishing a pipeline for rendering volumetric effects sequentially within the main render loop.vol_caustics: Initiated the caustics rendering system, which will simulate light patterns created by surface reflections on the volumetric medium, enhancing the visual complexity of water interactions.vol_pass: Scaffolded the volumetric pass structure, defining how different volumetric effects will be processed in the render pipeline.vol_medium: Created an initial implementation of volumetric mediums, allowing the engine to define properties such as density and scattering for various materials. The volumetric rendering subsystem is now more robust and modular, with foundational components in place. The next step is to continue refining the raymarching implementation and integrate the caustics calculations within the rendering pipeline."}, {"post_id": 32804, "ts": "2026-07-22T05:56:26Z", "hours": 3.2358, "text": "Today, I focused on the development of the tonemapping subsystem, which is essential for controlling the luminance and color mapping of rendered scenes to enhance visual fidelity. This work is crucial as it directly affects the output quality of rendered images. volumetric_blur: Scaffolded the vol_blur module to introduce volumetric blur processing. This lays the groundwork for further development of blur algorithms.tonemap: Established the initial framework for tonemapping, including scaffolded modules for tonemap_params, tonemap_grade, and tonemap_curve. This modular approach allows for easy future enhancements and testing.tonemap_selftest: Wired up self-testing capabilities for tonemapping to ensure that changes can be effectively validated. This includes fleshing out the self-test to cover edge cases and expected behavior.tonemap_lut: Implemented a lookup table (LUT) for tonemapping, which will optimize color grading processes. Set up associated functions to support LUT creation and application.tonemap_exposure: Started the implementation of exposure management in tonemapping, including functions to retrieve and adjust exposure levels dynamically.text_layout: Completed the implementation of the text layout system, which will be utilized for rendering debug information and UI elements related to tonemapping.cleanup: Conducted code cleanup across several modules, focusing on reducing technical debt and improving readability. The current state of the tonemapping subsystem is foundational, with several key components scaffolded and initial implementations underway. The next logical step involves further developing the tonemapping algorithms and integrating them into the rendering pipeline to evaluate their impact on scene output."}, {"post_id": 32348, "ts": "2026-07-21T13:39:12Z", "hours": 5.2303, "text": "This morning’s work focused on the tonemapping subsystem, particularly enhancing exposure control and initializing the necessary data structures. These changes are critical for achieving realistic rendering through proper dynamic range management. Tonemap Exposure: Implemented tonemap_exposure to calculate exposure values based on scene luminance, improving how bright areas are rendered.Tonemap Configuration: Added tonemap_config, defining parameters for exposure and curve settings, facilitating easy adjustments and future expansion.Tonemap Curve: Began the implementation of tonemap_curve, establishing a basis for non-linear mapping of color values to enhance dynamic range perception.Text Layout: Completed the text_layout function, which manages text rendering for UI elements, ensuring proper alignment and spacing.Tonemap Debugging: Implemented tonemap_debug_run_split to allow testing of various tonemapping scenarios, aiding in fine-tuning the visual output. Current progress sets a solid foundation for further work on the tonemapping pipeline, with the next steps aimed at refining the tonemap grading process and integrating it into the rendering loop."}, {"post_id": 31649, "ts": "2026-07-20T07:02:35Z", "hours": 8.5392, "text": "Today, I focused on the text rendering subsystem, specifically the development of the text context and text batch systems. This work is foundational for rendering 2D text efficiently, which is crucial for UI elements and in-game text displays. text_ctx: Implemented the initial structure for the text context, which manages the state related to text rendering. This includes setting up memory allocations for text data and glyph information.text_batch: Created a scaffold for the text batch system to handle multiple text draw calls efficiently. This will allow for batching of text rendering operations to minimize state changes.text_atlas: Developed the initial setup for the text atlas, which will store glyph images for rapid access during rendering. This will improve performance by reducing texture binding overhead.text_font: Initialized the text font subsystem to load and manage font data. This includes parsing font files and generating the necessary glyph data.text_glyphdata: Started the implementation of glyph data handling, allowing for precise control over individual characters and their metrics.ssr_settings and ssr_pass: Set up the screen space reflections (SSR) settings and pass, which will enhance the visual fidelity of reflective surfaces in the engine.ssrx_material_unpack: Completed the unpacking of material data for SSR, ensuring that material properties are correctly interpreted during rendering. The text rendering subsystem is now well-structured, and the next step will involve integrating the text rendering into the main rendering pipeline to ensure text is displayed correctly in the game environment."}, {"post_id": 30541, "ts": "2026-07-18T06:21:48Z", "hours": 6.8261, "text": "Today I worked on the implementation of screen space reflections (SSR) and screen space ambient occlusion (SSAO) within the rendering subsystem. These features are vital for enhancing visual fidelity and realism in lighting interactions within the voxel environment. SSR Module: Introduced the ssr_fsquad, which sets up a full-screen quad for executing the SSR shader pass. This establishes a foundation for reflection calculations.SSR Configuration: Created ssr_config scaffolding to manage SSR parameters, allowing for adjustable settings such as reflection intensity and roughness.SSR Depth Setup: Implemented the ssr_depth, which captures depth information necessary for accurate reflection rendering. This enables proper occlusion of reflections based on scene depth.SSR Debugging: Set up ssr_debug to visualize reflection calculations during development, aiding in the identification of rendering artifacts or inaccuracies.SSAO Configuration: Initialized ssao_settings to provide user-adjustable controls over ambient occlusion effects, including radius and intensity.SSAO Pass Setup: Established the ssao_pass, which integrates the SSAO calculations into the render pipeline, ensuring it runs alongside other post-processing effects.SSAO Sampling: Started working on ssao_sample, which defines the sampling strategy for ambient occlusion, leveraging a kernel to calculate occlusion values based on neighboring pixels.Kernel Statistics: Set up ssao_kernel_stats to track and debug the parameters of the SSAO kernel, which will assist in optimizing performance and quality. The rendering subsystem now has a foundational implementation for both SSR and SSAO, with key components in place. The next steps will involve refining the sampling methods for SSAO and integrating the blurring effect for the final output to enhance visual quality."}, {"post_id": 29650, "ts": "2026-07-16T18:32:56Z", "hours": 6.8736, "text": "Today, I focused on enhancing the rendering subsystem with the implementation of Screen Space Ambient Occlusion (SSAO). This feature is critical for improving scene depth and realism by simulating how light interacts with surfaces. SSAO Module: Implemented the foundational SSAO computation logic in ssao_compute, which calculates ambient occlusion based on depth and normal maps to enhance shading realism.SSAO Debugging: Developed ssao_debug to visualize SSAO outputs, allowing for quick verification of occlusion values and aiding in fine-tuning the algorithm.SSAO Blur: Completed the SSAO blur process in ssao_blur, which smooths the occlusion map to reduce artifacts and achieve a more visually appealing result. The blur uses a separable Gaussian filter for performance efficiency.Skybox Renderer: Progressed on the skybox rendering system by fleshing out skyb_renderer_upload_dome and skyb_dome_vertex, which define the dome geometry and texture uploads for the skybox, ensuring proper visual integration with the ambient occlusion effects.Skybox Palette and Gradient: Initiated the scaffolding for skyb_palette and set up skyb_gradient, enabling gradient-based skybox coloring to enhance atmospheric effects in conjunction with SSAO. The SSAO implementation is now functional, with debug features in place to assess its performance and visual fidelity. The next step will involve further optimizing the SSAO calculations and integrating them seamlessly into the main rendering pipeline."}, {"post_id": 29009, "ts": "2026-07-15T17:30:42Z", "hours": 7.0656, "text": "Today I focused on the lighting subsystem, specifically implementing shadow mapping techniques and enhancing the atmospheric rendering system. These improvements are crucial for achieving realistic lighting and depth effects in the voxel environment. shadow_map: Implemented the shadow mapping algorithm, which includes creating a depth texture to store the distance from the light source to the nearest surface, enabling more realistic shadows.shadow_pcf: Developed percentage-closer filtering (PCF) for shadows to soften the edges of the shadow map, increasing visual fidelity. This involved setting up the filtering process within the shader pipeline.shadow_split: Introduced the shadow split technique to improve shadow rendering across varying depths. This includes calculating split distances based on the camera’s frustum to reduce artifacts.shadow_matrix: Added a shadow matrix computation to transform world coordinates into shadow map space, ensuring correct shadow projection during rendering.skyb: Began implementing the skybox atmospheric effects, specifically the skyb_atmosphere_clear_color and skyb_billboard. This includes color adjustments for clearer skies and setting up billboards for celestial bodies.shadow_stabilize: Stubbed out a shadow stabilization technique to reduce flickering and aliasing in shadow rendering, which will be fleshed out in future commits.code maintenance: Conducted minor cleanups and cosmetic tweaks across multiple files for better readability and organization, including renaming functions for clarity. The current state of the shadow rendering system is functional with basic shadow mapping and initial atmospheric effects implemented. The next step will be to refine the shadow stabilization method and continue developing the full atmospheric rendering features."}, {"post_id": 28394, "ts": "2026-07-14T17:00:18Z", "hours": 6.8947, "text": "Today, I focused on the graphics subsystem, specifically enhancing the shader management and shadow rendering capabilities. This work is essential for achieving more sophisticated visual effects and better performance in the rendering pipeline. Shader Management Module: Implemented shaderman_set_hot_reload, enabling dynamic shader reloading during runtime to facilitate rapid iteration without restarting the engine.Shader Compilation: Completed the shader_compile function, which compiles shader code into GPU executable format, improving the setup time for rendering.Shader Initialization: Added shadow_init, which initializes parameters related to shadow rendering, ensuring proper setup before rendering occurs.Shader Stage Handling: Filled in the shader_stage structure to manage different stages of shader processing, which allows for cleaner organization of shader tasks.Active Uniforms Retrieval: Finalized shaderman_gl_active_uniforms, which retrieves and stores active uniform variables from shaders, enhancing the shader’s interaction with the rendering system.Debugging Support: Set up shader_debug, providing hooks for debugging shader issues during development, which improves the ease of identifying and resolving shader-related problems.Bloom Effect: Added a basic implementation of bloom rendering through bloom_resize and the bloom module, initiating post-processing effects to enhance scene brightness. The shader management system is now more robust, allowing for dynamic updates and improved shader handling. The next step will involve integrating the shadow rendering into the main rendering loop to evaluate performance and visual fidelity."}, {"post_id": 27739, "ts": "2026-07-13T15:47:05Z", "hours": 2.3244, "text": "Today I focused on the particle system and initial components for voxel chunk mesh building, which are critical for enhancing visual effects and optimizing rendering performance in the engine. Particle System: Implemented particle_rng, which initializes a random number generator for particle behavior, crucial for generating varied particle effects.Particle Emission: Completed the particles_rng_in_cone function, allowing for particles to be emitted in a cone-shaped area, enhancing the realism of effects like explosions or smoke.Particle Pool Management: Developed particles_pool_clear, which efficiently resets the particle pool between frames, minimizing memory usage and helping maintain performance during high-load scenarios.Vertex Packing: Set up vertex_pack, which organizes vertex data into a compact format suitable for GPU processing, improving data transfer efficiency and reducing memory bandwidth usage.Chunk Mesh Building: Started the meshbuild_chunk implementation to facilitate efficient chunk rendering, laying the groundwork for further optimizations like greedy meshing.Emitter System: Added a basic emitter class to manage particle emission attributes, enabling future extensibility for different particle effects and behaviors.Cleanup and Organization: Conducted minor cleanups and formatting across various files, ensuring code maintainability and consistency. The particle system is now more robust, and the chunk building process has a foundational structure in place. The next step involves completing the mesh building logic and integrating more complex particle behaviors using the emitter system."}, {"post_id": 27651, "ts": "2026-07-13T12:42:19Z", "hours": 4.5136, "text": "This morning’s work focused on enhancing the rendering pipeline and starting the implementation of the particle emitter system. These improvements are crucial for visual fidelity and performance in voxel rendering. clamp01: Implemented a function to constrain values between 0 and 1, ensuring proper normalization for graphical calculations.curves: Began the implementation of curve interpolation methods for smoother transitions in animations and particle emissions.gpu_buffer: Added a structured buffer for GPU memory allocation, enhancing the efficiency of data transfer between CPU and GPU for rendering tasks.emitter: Developed the foundational structure for the particle emitter, which will support dynamic visual effects in the game environment.meshbuild_chunk: Completed the initial version of the chunk mesh building algorithm, optimizing how voxel data is converted into renderable geometry. Current progress sets the stage for integrating the particle system fully and refining the mesh building process. The next logical step will be to finalize the emitter’s functionality and connect it to the rendering pipeline."}, {"post_id": 27194, "ts": "2026-07-12T15:15:38Z", "hours": 0.7075, "text": "Today I focused on the mesh building subsystem, which is critical for generating and managing the geometry of voxel chunks in real-time. This work is foundational for optimizing rendering and ensuring efficient memory usage. MeshBuild Module: Started the implementation of the meshbuild system, establishing the groundwork for efficient chunk geometry generation. This includes setting up the initial data structures for mesh management.Snapshot System: Implemented the mb_snapshot functionality, which allows for capturing the state of the mesh at a given time. This is crucial for optimizing updates and rendering by reducing unnecessary computations.Statistics Tracking: Scaffolding for mb_stats was added to track performance metrics related to mesh generation, providing insights into the efficiency of the rendering pipeline.Block Properties: Introduced initial definitions for block_shape and face_dir, setting up the essential parameters required for defining voxel geometry.Terrain Type Management: Added the lt_terrain module to manage different terrain types within the game, enabling diverse environments and interaction mechanics.Bounds Checking: Fixed a bounds check issue during initialization, ensuring that the allocation of voxel data structures remains within valid memory limits, thus preventing potential crashes or corruption. Current state reflects a significant advancement in the mesh building architecture, with basic functionality established. The next steps will involve fleshing out the mesh generation algorithms and integrating them with the rendering pipeline for further testing."}, {"post_id": 27141, "ts": "2026-07-12T12:58:04Z", "hours": 6.1558, "text": "This morning, I focused on establishing the foundational components for the voxel engine’s module system, which is crucial for modularizing functionality and enhancing maintainability. I initiated the groundwork for both configuration and debugging systems. mb_config: Started the configuration module to manage engine settings, establishing a basic structure for loading and saving configurations.mb_debug: Added the debugging module, scaffolding the structure to allow for runtime diagnostics and performance monitoring.lt_stats_format: Implemented a format for terrain statistics, ensuring that performance metrics can be effectively logged and analyzed.block_shape: Began work on the block shape definitions, laying the groundwork for specifying voxel dimensions and orientations.cross_mesh: Stubbed out the cross-mesh functionality, preparing for future implementation of cross-sectional rendering techniques. The foundational modules are now in place, and the next step will involve fleshing out the configuration and debugging features to support real-time adjustments and diagnostics."}, {"post_id": 26593, "ts": "2026-07-11T14:45:10Z", "hours": 8.4497, "text": "Today, I focused on the implementation of the instancing subsystem within the rendering pipeline. This work is critical for optimizing draw calls and managing multiple instances of meshes efficiently, which will enhance rendering performance in voxel environments. lt_mesh: Implemented the initial mesh structure to accommodate instance data. This includes setting up vertex attributes for instance transformations.lt_grid: Created an initial grid structure to manage spatial organization of instances, allowing for efficient frustum culling.lt_gpu: Stubbed out the GPU interface to handle instanced rendering commands, establishing a foundation for future integration.lt_cache_init: Implemented the cache initialization routine for storing instance data, which reduces overhead during rendering.instancing_stats: Completed the stats tracking for instanced objects, capturing performance metrics that can be analyzed for optimization.instancing_transform_bounds: Finished the bounding volume calculations for instances, crucial for frustum culling to avoid unnecessary rendering.frustum_batch: Scaffolded the frustum batching system to group instances based on visibility, optimizing the rendering process and minimizing state changes.Cleanup: Executed minor cleanups across multiple modules to enhance code readability and maintainability. The instancing subsystem is now in a functional state, with core structures established and initial implementations completed. The next step will involve refining the GPU integration for instanced rendering and testing performance metrics in various scenarios."}, {"post_id": 25478, "ts": "2026-07-09T19:31:03Z", "hours": 7.7797, "text": "Today, I focused on enhancing the rendering pipeline, specifically the implementation of the g-buffer and draw call management. This work is critical for achieving efficient deferred rendering, which is essential for handling complex lighting scenarios in the engine. Rendering System: Implemented draw_indirect, allowing for batch processing of draw commands without CPU intervention, which reduces overhead and improves performance during frame rendering.Batch Management: Stubbed out batch functionality to prepare for more efficient draw call aggregation, laying the groundwork for optimizing the number of draw calls issued per frame.G-buffer Implementation: Completed the gbuffer_shade, gbuffer_normal, and gbuffer_material modules, each responsible for storing necessary per-pixel data for deferred shading, enhancing the ability to handle multiple light sources effectively.G-buffer Lighting: Initiated the gbuffer_light and gbuffer_brdf_eval_light components, which are responsible for evaluating lighting based on stored g-buffer data and enabling realistic material responses to light.Edge Case Handling: Fixed an edge case in gbuffer_emit_from_chunk, ensuring correct handling when emitting light from chunk edges, which aids in visual consistency across chunk borders.Utility Functions: Implemented clampf for clamping float values, which will be used in various calculations across the rendering pipeline to maintain valid ranges for rendering parameters.Texture Management: Added make_tex to streamline texture creation, facilitating easier integration of textures into the rendering pipeline. The rendering pipeline has significantly improved with these updates, and the next step will be to integrate the batching process fully and assess the overall performance impact in various rendering scenarios."}, {"post_id": 24172, "ts": "2026-07-07T15:58:24Z", "hours": 7.6097, "text": "Today, I focused on the integration and initial implementation of the G-buffer system and Fast Approximate Anti-Aliasing (FXAA) in the rendering pipeline. This work is crucial for improving the visual fidelity and performance of the rendering process. G-buffer Module: Implemented the initial G-buffer structure, facilitating the storage of geometry attributes for deferred rendering. This involves creating texture storage for position, normal, and albedo data.G-buffer Initialization: Developed the gbuffer_init function to allocate and configure the G-buffer textures, ensuring proper setup for rendering operations.FXAA Implementation: Added the core FXAA functionality, including fxaa_main and fxaa_settings_apply, allowing for real-time anti-aliasing effects to smooth out jagged edges in rendered frames.Self-Test for FXAA: Completed the fxaa_selftest implementation to validate the correctness of the FXAA algorithm, ensuring that edge cases are handled and results are consistent across different scenarios.Sampling and Quality: Finished the grid_sample function to enhance texture sampling for FXAA and initiated fxaa_quality, laying the groundwork for different quality settings in the anti-aliasing process.Historical Data Management: Implemented fxaa_history to maintain previous frame data necessary for temporal smoothing in the FXAA algorithm.Stubs for Future Work: Created stubs for fxaa_blit and fxaa_debug, preparing the framework for future enhancements and debugging capabilities. The rendering engine now has foundational G-buffer and FXAA support, significantly advancing the visual quality of the output. The next steps will involve refining the FXAA implementation and integrating the remaining stub functions to complete the"}, {"post_id": 23624, "ts": "2026-07-06T18:05:07Z", "hours": 7.5222, "text": "Today, I focused on implementing the depth of field (DoF) post-processing effect within the rendering pipeline. This is a critical enhancement for visual fidelity, as it allows for more realistic focus transitions in the scene. Depth of Field (dof_programs): Implemented dof_programs_unload, which properly releases shaders and associated resources when no longer needed, optimizing memory usage.Depth of Field (dof_pass): Began the development of the dof_pass, which will serve as the new rendering stage to handle depth of field computations, ensuring it integrates smoothly with the existing render pipeline.Depth of Field (dof_gather): Completed the dof_gather function, which samples the scene to collect color and depth information needed for the DoF effect, with attention to efficient texture access patterns.Depth of Field (dof_quad): Started implementing the dof_quad, which will represent the screen-space quad used for applying the DoF effect in a fragment shader.Depth of Field (dof_focus): Added functionality for dof_focus, allowing users to set the focal distance dynamically, enhancing control over the DoF effect.Depth of Field (dof_coc): Initiated the dof_coc (circle of confusion) calculations, which are essential for determining which parts of the scene should appear in focus versus out of focus based on their distance from the camera.Code Cleanup: Performed various minor cleanups and formatting changes throughout the modules to improve code readability and maintainability. The depth of field implementation is progressing well, with foundational components in place. The next step will involve integrating the dof_coc calculations into the rendering pipeline and refining the dof_pass to ensure correct visual output."}, {"post_id": 22929, "ts": "2026-07-05T15:56:09Z", "hours": 8.4486, "text": "Today, I focused on implementing the decals subsystem, which is critical for enhancing visual fidelity by allowing textured decals to be rendered on surfaces in the voxel environment. This will significantly improve the realism of interactions and environmental details. Decals Types: Established the decals_types module to define various decal types and their properties, facilitating extensibility for future decal features.Decals Pass: Implemented the decals_pass, which organizes the rendering of decals in the pipeline. This pass is integrated into the main render loop to ensure decals are drawn after opaque geometry.GLSL Shader Setup: Began the decals_glsl to handle decal shaders, ensuring that the shaders can accommodate blending and fading effects, which are crucial for realistic rendering.Decal Atlas: Developed the decals_atlas, allowing for efficient texture sampling by consolidating multiple decal textures into a single texture atlas, reducing state changes during rendering.Decals Fade and Blend: Added functionality for decals_fade and decals_blend, implementing visual effects that allow decals to gradually appear or disappear and blend with underlying textures, enhancing realism.Debug Drawing: Finished the debugdraw_timed and fleshed out debugdraw_flush_labels, providing tools for visual debugging of decals, which will assist in ensuring correct placements and transitions. The decals subsystem is now partially operational, with foundational components in place for rendering. The next step will involve completing the decals_config and integrating it fully into the scene management system."}, {"post_id": 22346, "ts": "2026-07-04T19:31:24Z", "hours": 7.6814, "text": "Today, I focused on the debug rendering subsystem, which is crucial for visualizing various components of the engine during development. This work will facilitate easier debugging of spatial relationships, frustum culling, and occlusion handling. debugdraw: Established the foundational structure for the debug drawing system, enabling visualization of shapes and paths in the rendering pipeline.debugdraw_helpers: Completed the implementation of helper functions to streamline the rendering of basic shapes (lines, spheres, etc.), improving the clarity of debug visuals.debugdraw_path: Added functionality to visualize paths, which aids in debugging movement and AI-related features.debugdraw_frustum: Implemented frustum visualization, allowing for the assessment of what is currently visible in the scene, thereby enhancing frustum culling debugging.frustum_cull: Integrated frustum culling logic to improve performance by eliminating objects outside the view, with bounds checks refined for edge cases.sphere_cull: Developed a sphere-based culling mechanism to efficiently determine visibility of spherical objects, optimizing rendering performance.cull_occlusion_run: Fixed a bounds check issue within the occlusion culling routine, ensuring accurate visibility determinations.chunk_dist_sq: Implemented a distance-squared function for chunks, which will be useful in sorting and rendering optimization. The debug rendering system is now significantly more functional, laying the groundwork for more complex visualizations. The next step will involve integrating these debug features with the main rendering loop to ensure they can be toggled during runtime for effective debugging."}, {"post_id": 21610, "ts": "2026-07-03T17:28:02Z", "hours": 8.0522, "text": "Today’s work focused primarily on the implementation of the bloom post-processing system, specifically the initial setup and functionality of the bloom2 module. This subsystem is essential for enhancing the visual quality of the rendered scene by simulating the effect of light bleeding and softening bright areas. bloom2_pass: Implemented the initial pass for the bloom effect, which includes setting up the framebuffer and rendering targets to capture bright sections of the scene.bloom2_target_bind: Defined the binding process for the bloom render target, ensuring that the correct framebuffers are activated during the bloom rendering sequence.bloom2_blur_v: Stubbed out the vertical blur function, which will be responsible for processing the intermediate bloom render results, preparing for the subsequent blur pass.bloom2_gauss_eval: Added an evaluation function for Gaussian weights, which will be used in the blur calculations to create a smooth transition effect.bloom2_quad: Set up a quad for rendering the bloom effect onto the screen, which serves as the final output display of the bloom post-processing.bloom2_params: Began the definition of parameters for the bloom effect, including thresholds for bright areas and intensity settings, allowing for future adjustments.upload_taps: Implemented the upload process for the sampling taps used in the Gaussian blur, ensuring efficient access to texture samples during rendering. The bloom post-processing pipeline is now in its early stages, with the foundational components established. The next step will be to flesh out the blur functionality and integrate it with the bloom pass for a complete visual effect."}, {"post_id": 20950, "ts": "2026-07-02T18:01:03Z", "hours": 1.6128, "text": "Today, I focused on the initialization and setup of various subsystems related to rendering and environmental simulation within the voxl engine. This work is foundational, as it establishes the groundwork for rendering techniques and weather simulation mechanics. OpenGL Module: Implemented initial OpenGL context creation to prepare for rendering. This included setting up basic state configurations for future draw calls.Camera System: Added a camera system to manage view transformations. The camera setup allows for dynamic movement and orientation adjustments, facilitating a clean separation of view logic from game entities.Chunk Queue: Began the implementation of a chunk queue to handle asynchronous chunk loading. This structure will optimize memory usage and improve performance by deferring loading operations until necessary.Ambient Occlusion: Scaffolded the ambient occlusion module, allowing for more realistic lighting interactions. Initial ambient occlusion calculations were introduced, which will be refined in subsequent iterations.Weather Simulation: Implemented core components of the weather simulation system, including the weathersim_front and weathersim_front_pool_init functions. This lays the foundation for managing weather states and transitions effectively. The current state of the engine includes basic rendering capabilities and preliminary environmental simulations. The next step involves refining the ambient occlusion calculations and expanding the weather simulation features to include precipitation dynamics."}, {"post_id": 20714, "ts": "2026-07-02T11:45:25Z", "hours": 4.8128, "text": "Today’s work focused primarily on foundational systems related to environmental effects and rendering, specifically fog, camera setup, and ambient occlusion. These components are crucial for enhancing the visual quality and atmospheric realism of the engine. Camera Module: Implemented a basic camera system that supports perspective projection, allowing for a flexible viewpoint in the 3D environment.Fog Implementation: Began initial work on fog rendering, laying out a basic framework to integrate atmospheric effects into the scene, improving depth perception.Chunk Queue System: Established a chunk_queue to manage chunk updates and rendering efficiently, which is vital for optimizing visibility and performance.Ambient Occlusion: Started scaffolding the ambient occlusion module to simulate soft shadows and improve lighting realism, enhancing the overall visual fidelity.Weather Simulation: Developed foundational components for weather simulation, including the weathersim_report and weathersim_front, which will facilitate dynamic environmental changes. Current progress sets a strong base for further development of visual effects. The next steps will involve completing the ambient occlusion implementation and integrating fog into the rendering pipeline."}, {"post_id": 19452, "ts": "2026-06-30T19:35:54Z", "hours": 10.0364, "text": "Weather’s looking a lot more interesting in voxly! Today, I kicked off the weather simulation with some solid progress on precipitation and the foundations for advecting particles through the environment. The rain isn’t just for show, it’s got a role to play now. Also worked out the tree generation system, which means they will have more than just empty ground to stand on."}, {"post_id": 18583, "ts": "2026-06-29T19:32:20Z", "hours": 5.2333, "text": "Just when I thought I was digging in the trenches, the trees started working! Finally got the tree generation demo up and running, which has been a bit of a puzzle piece I’ve been working on for a while. Cleared out a bunch of clutter in the codebase too. It feels good to put some roots down in this project, literally and figuratively."}, {"post_id": 17520, "ts": "2026-06-28T10:25:48Z", "hours": 3.1486, "text": "The puzzle pieces are finally coming together with the struct generators. I wrestled with structgen_buffer_init today. Thats such a simple name for a surprisingly deep rabbit hole, but getting it wired up felt like unlocking a secret door. A few cosmetic tweaks and renamings later and im already done. Onward to strongholds!"}, {"post_id": 17420, "ts": "2026-06-28T05:55:16Z", "hours": 6.5364, "text": "Just wrapped up the stronghold_rng_next implementation, and let me tell you, it feels good to finally have that randomness flowing where it needs to! The stronghold features are coming together with stronghold_query also in the mix. Sure, there were some cosmetic tweaks and minor cleanups along the way, but every small piece is building towards that epic world."}, {"post_id": 15849, "ts": "2026-06-25T19:27:56Z", "hours": 10.1414, "text": "Building a stronghold feels a bit like crafting a slice of medieval magic. Today, I wrangled a bunch of components into our stronghold system with corridors, boxes, and initial buffers. Not to mention, I tamed the chaotic skies with some weather initialization."}, {"post_id": 15260, "ts": "2026-06-24T19:35:56Z", "hours": 9.715, "text": "Finally got the rivers flowing with some real depth implemented everything from types to flow mechanics. It’s like watching the world come alive; every little tweak adds to that immersion. And yes, the moon now has phases that actually reflect in the sky."}, {"post_id": 14620, "ts": "2026-06-23T20:02:56Z", "hours": 10.0336, "text": "Cracked open the vault of regions today, and finally wrangled the region_codec into shape! It feels good to see that component take form after a few iterations. Took the time to clean up and scaffold the cache while getting those chunks to read smoothly. A few cosmetic tweaks here and there, but hey, every small fix adds to the whole."}, {"post_id": 13891, "ts": "2026-06-22T19:31:53Z", "hours": 9.9464, "text": "Diving into the wild world of noise generation today, specifically ravines. After a good chunk of head-scratching, I’ve got the initial ravine noise and debug systems wired up, laying the groundwork for some seriously dramatic landscapes."}, {"post_id": 13287, "ts": "2026-06-21T19:11:03Z", "hours": 9.8797, "text": "Nothing quite like the rush of finally tackling those mineshaft features. After all the planning, I can now see the maze taking shape and the ore types just begging to be mined. I spent a good chunk of time cleaning up leaks and renaming stuff for clarity. The mineshaft feels alive and thats really cool and important"}, {"post_id": 12820, "ts": "2026-06-21T00:02:53Z", "hours": 10.0989, "text": "After a marathon of coding, I finally got the loader queue working. It’s a joy to see all those little pieces, like logic grids and queues, slot together. There’s something satisfying about renaming for clarity. Its kinda like cleaning up a messy drawer and finding all the tools you forgot you had. Now, on to scaffolding the loader worker."}, {"post_id": 12227, "ts": "2026-06-19T23:05:16Z", "hours": 9.6194, "text": ". After wrangling with a mountain of renames and tidying up the loader, I finally got the light properties implemented and running through the pipeline. The loader’s debug functions are on the horizon too, which means I’ll be able to dive deep into those shadows and highlights soon."}, {"post_id": 11490, "ts": "2026-06-18T19:31:07Z", "hours": 10.0503, "text": "Finally cracked the heightmap samples, they’re now alive with weirdness! It’s a subtle but game-changing layer to the terrain; I can already picture the landscapes taking shape. Spent way too long wrangling typos and cleaning up the code, but hey, it’s all part of the grind. The scaffolding for some tree and structure features is in place, so we’re on the wya to success"}, {"post_id": 10838, "ts": "2026-06-17T19:40:36Z", "hours": 9.6964, "text": "Fluid dynamics are finally bubbling to the surface! I spent the day diving into the guts of the voxel engine, fleshing out the fluid simulation code. I’ve carved out the groundwork for water spreading and even kicked off lava behavior."}, {"post_id": 10154, "ts": "2026-06-16T19:26:47Z", "hours": 10.0178, "text": "So I dove into the farming system today, and let me tell you, crafting the mechanics feels like planting seeds in soil. I even tackled some erosion dynamics, which is just a fancy way of saying I’m making dirt work for me."}, {"post_id": 9412, "ts": "2026-06-15T19:22:42Z", "hours": 10.0094, "text": "Experimenting with erosion algorithms has been a wild ride today. I finally got the thermal erosion system wired up and running in tandem with the various types. Implementing that flux function was a puzzle, but seeing the terrain shift under different conditions was totally worth it."}, {"post_id": 8875, "ts": "2026-06-14T19:35:32Z", "hours": 9.8747, "text": "After a long grind, I finally got cave generation fleshed out and worms and ravines are slithering their way into the world! It’s all about those small victories right now."}, {"post_id": 8305, "ts": "2026-06-13T20:09:05Z", "hours": 9.8025, "text": "Finally wrangled the biomes into something that feels alive. Implemented the blending and height parameters, and even dived into the noise generation getting the worldgen to feel organic is like layering a sweet melody over a rough track. There’s still a ton of work to do, but it’s exciting to see the terrain start to take shape, complete with the first ore deposits peeking through. This is one step closer to that voxel heaven"}, {"post_id": 7629, "ts": "2026-06-12T19:06:38Z", "hours": 9.9367, "text": "There’s something satisfying about watching light dance across a voxel landscape. Today, I wired up the lighting for chunk re-computation, finally getting that glowy ambience just right. The little wins all add up, and each tweak brings me closer to my vision."}, {"post_id": 7010, "ts": "2026-06-11T19:21:18Z", "hours": 11.1639, "text": "Cracked the code for serialization today. Finally got ‘serialize_save’ up and running, which means I can actually save my voxel worlds without losing my work to the void of digital oblivion. 🥳 The octree stuff is coming together too. wired up the raycasting and node setup, making progress on spatial queries."}, {"post_id": 6315, "ts": "2026-06-10T17:04:58Z", "hours": 9.0033, "text": "Octrees are now officially part of the voxl family! After wrestling with a JSON function, I finally got the octree’s initial structure up and running. Implementing the octree_collect_pairs was a puzzle, but seeing it all click is worth it. Still a ways to go, but today feels like a solid step toward the final goal!"}, {"post_id": 5736, "ts": "2026-06-09T17:12:29Z", "hours": 8.4711, "text": "Finally got the job system framework working! The scaffolding is up, and I’ve wired in the parallel execution and fence management. It’s like building a complicated LEGO set and each piece finally feels like it fkts."}, {"post_id": 5033, "ts": "2026-06-08T18:07:41Z", "hours": 16.8914, "text": "Finally managed to defeat bounding volume hierarchy (BVH) . I’ve wrapped up the raycasting and query functions. Tidied up some code, renamed a few things for clarity, and even kicked off a basic profiler. The structure is starting to solidify, and I can almost taste the optimization magic."}, {"post_id": 4444, "ts": "2026-06-07T19:27:18Z", "hours": 1.6194, "text": "made some good progress today, finally started on the README and added a basic skeleton for the Makefile. also cleaned up some formatting and added a stub config along with an AABB implementation"}]...
|
Title: Voxly by @devlsx | Stardance
Devlogs:
made Title: Voxly by @devlsx | Stardance
Devlogs:
made some good progress today, finally started on the README and added a basic skeleton for the Makefile. also cleaned up some formatting and added a stub config along with an AABB implementation
Finally managed to defeat bounding volume hierarchy (BVH) . I’ve wrapped up the raycasting and query functions. Tidied up some code, renamed a few things for clarity, and even kicked off a basic profiler. The structure is starting to solidify, and I can almost taste the optimization magic.
Finally got the job system framework working! The scaffolding is up, and I’ve wired in the parallel execution and fence management. It’s like building a complicated LEGO set and each piece finally feels like it fkts.
Octrees are now officially part of the voxl family! After wrestling with a JSON function, I finally got the octree’s initial structure up and running. Implementing the octree_collect_pairs was a puzzle, but seeing it all click is worth it. Still a ways to go, but today feels like a solid step toward the final goal!
Cracked the code for serialization today. Finally got ‘serialize_save’ up and running, which means I can actually save my voxel worlds without losing my work to the void of digital oblivion. 🥳 The octree stuff is coming together too. wired up the raycasting and node setup, making progress on spatial queries.
There’s something satisfying about watching light dance across a voxel landscape. Today, I wired up the lighting for chunk re-computation, finally getting that glowy ambience just right. The little wins all add up, and each tweak brings me closer to my vision.
Finally wrangled the biomes into something that feels alive. Implemented the blending and height parameters, and even dived into the noise generation getting the worldgen to feel organic is like layering a sweet melody over a rough track. There’s still a ton of work to do, but it’s exciting to see the terrain start to take shape, complete with the first ore deposits peeking through. This is one step closer to that voxel heaven
After a long grind, I finally got cave generation fleshed out and worms and ravines are slithering their way into the world! It’s all about those small victories right now.
Experimenting with erosion algorithms has been a wild ride today. I finally got the thermal erosion system wired up and running in tandem with the various types. Implementing that flux function was a puzzle, but seeing the terrain shift under different conditions was totally worth it.
So I dove into the farming system today, and let me tell you, crafting the mechanics feels like planting seeds in soil. I even tackled some erosion dynamics, which is just a fancy way of saying I’m making dirt work for me.
Fluid dynamics are finally bubbling to the surface! I spent the day diving into the guts of the voxel engine, fleshing out the fluid simulation code. I’ve carved out the groundwork for water spreading and even kicked off lava behavior.
Finally cracked the heightmap samples, they’re now alive with weirdness! It’s a subtle but game-changing layer to the terrain; I can already picture the landscapes taking shape. Spent way too long wrangling typos and cleaning up the code, but hey, it’s all part of the grind. The scaffolding for some tree and structure features is in place, so we’re on the wya to success
. After wrangling with a mountain of renames and tidying up the loader, I finally got the light properties implemented and running through the pipeline. The loader’s debug functions are on the horizon too, which means I’ll be able to dive deep into those shadows and highlights soon.
After a marathon of coding, I finally got the loader queue working. It’s a joy to see all those little pieces, like logic grids and queues, slot together. There’s something satisfying about renaming for clarity. Its kinda like cleaning up a messy drawer and finding all the tools you forgot you had. Now, on to scaffolding the loader worker.
Nothing quite like the rush of finally tackling those mineshaft features. After all the planning, I can now see the maze taking shape and the ore types just begging to be mined. I spent a good chunk of time cleaning up leaks and renaming stuff for clarity. The mineshaft feels alive and thats really cool and important
Diving into the wild world of noise generation today, specifically ravines. After a good chunk of head-scratching, I’ve got the initial ravine noise and debug systems wired up, laying the groundwork for some seriously dramatic landscapes.
Cracked open the vault of regions today, and finally wrangled the region_codec into shape! It feels good to see that component take form after a few iterations. Took the time to clean up and scaffold the cache while getting those chunks to read smoothly. A few cosmetic tweaks here and there, but hey, every small fix adds to the whole.
Finally got the rivers flowing with some real depth implemented everything from types to flow mechanics. It’s like watching the world come alive; every little tweak adds to that immersion. And yes, the moon now has phases that actually reflect in the sky.
Building a stronghold feels a bit like crafting a slice of medieval magic. Today, I wrangled a bunch of components into our stronghold system with corridors, boxes, and initial buffers. Not to mention, I tamed the chaotic skies with some weather initialization.
Just wrapped up the stronghold_rng_next implementation, and let me tell you, it feels good to finally have that randomness flowing where it needs to! The stronghold features are coming together with stronghold_query also in the mix. Sure, there were some cosmetic tweaks and minor cleanups along the way, but every small piece is building towards that epic world.
The puzzle pieces are finally coming together with the struct generators. I wrestled with structgen_buffer_init today. Thats such a simple name for a surprisingly deep rabbit hole, but getting it wired up felt like unlocking a secret door. A few cosmetic tweaks and renamings later and im already done. Onward to strongholds!
Just when I thought I was digging in the trenches, the trees started working! Finally got the tree generation demo up and running, which has been a bit of a puzzle piece I’ve been working on for a while. Cleared out a bunch of clutter in the codebase too. It feels good to put some roots down in this project, literally and figuratively.
Weather’s looking a lot more interesting in voxly! Today, I kicked off the weather simulation with some solid progress on precipitation and the foundations for advecting particles through the environment. The rain isn’t just for show, it’s got a role to play now. Also worked out the tree generation system, which means they will have more than just empty ground to stand on.
Today’s work focused primarily on foundational systems related to environmental effects and rendering, specifically fog, camera setup, and ambient occlusion. These components are crucial for enhancing the visual quality and atmospheric realism of the engine. Camera Module: Implemented a basic camera system that supports perspective projection, allowing for a flexible viewpoint in the 3D environment.Fog Implementation: Began initial work on fog rendering, laying out a basic framework to integrate atmospheric effects into the scene, improving depth perception.Chunk Queue System: Established a chunk_queue to manage chunk updates and rendering efficiently, which is vital for optimizing visibility and performance.Ambient Occlusion: Started scaffolding the ambient occlusion module to simulate soft shadows and improve lighting realism, enhancing the overall visual fidelity.Weather Simulation: Developed foundational components for weather simulation, including the weathersim_report and weathersim_front, which will facilitate dynamic environmental changes. Current progress sets a strong base for further development of visual effects. The next steps will involve completing the ambient occlusion implementation and integrating fog into the rendering pipeline.
Today, I focused on the initialization and setup of various subsystems related to rendering and environmental simulation within the voxl engine. This work is foundational, as it establishes the groundwork for rendering techniques and weather simulation mechanics. OpenGL Module: Implemented initial OpenGL context creation to prepare for rendering. This included setting up basic state configurations for future draw calls.Camera System: Added a camera system to manage view transformations. The camera setup allows for dynamic movement and orientation adjustments, facilitating a clean separation of view logic from game entities.Chunk Queue: Began the implementation of a chunk queue to handle asynchronous chunk loading. This structure will optimize memory usage and improve performance by deferring loading operations until necessary.Ambient Occlusion: Scaffolded the ambient occlusion module, allowing for more realistic lighting interactions. Initial ambient occlusion calculations were introduced, which will be refined in subsequent iterations.Weather Simulation: Implemented core components of the weather simulation system, including the weathersim_front and weathersim_front_pool_init functions. This lays the foundation for managing weather states and transitions effectively. The current state of the engine includes basic rendering capabilities and preliminary environmental simulations. The next step involves refining the ambient occlusion calculations and expanding the weather simulation features to include precipitation dynamics.
Today’s work focused primarily on the implementation of the bloom post-processing system, specifically the initial setup and functionality of the bloom2 module. This subsystem is essential for enhancing the visual quality of the rendered scene by simulating the effect of light bleeding and softening bright areas. bloom2_pass: Implemented the initial pass for the bloom effect, which includes setting up the framebuffer and rendering targets to capture bright sections of the scene.bloom2_target_bind: Defined the binding process for the bloom render target, ensuring that the correct framebuffers are activated during the bloom rendering sequence.bloom2_blur_v: Stubbed out the vertical blur function, which will be responsible for processing the intermediate bloom render results, preparing for the subsequent blur pass.bloom2_gauss_eval: Added an evaluation function for Gaussian weights, which will be used in the blur calculations to create a smooth transition effect.bloom2_quad: Set up a quad for rendering the bloom effect onto the screen, which serves as the final output display of the bloom post-processing.bloom2_params: Began the definition of parameters for the bloom effect, including thresholds for bright areas and intensity settings, allowing for future adjustments.upload_taps: Implemented the upload process for the sampling taps used in the Gaussian blur, ensuring efficient access to texture samples during rendering. The bloom post-processing pipeline is now in its early stages, with the foundational components established. The next step will be to flesh out the blur functionality and integrate it with the bloom pass for a complete visual effect.
Today, I focused on the debug rendering subsystem, which is crucial for visualizing various components of the engine during development. This work will facilitate easier debugging of spatial relationships, frustum culling, and occlusion handling. debugdraw: Established the foundational structure for the debug drawing system, enabling visualization of shapes and paths in the rendering pipeline.debugdraw_helpers: Completed the implementation of helper functions to streamline the rendering of basic shapes (lines, spheres, etc.), improving the clarity of debug visuals.debugdraw_path: Added functionality to visualize paths, which aids in debugging movement and AI-related features.debugdraw_frustum: Implemented frustum visualization, allowing for the assessment of what is currently visible in the scene, thereby enhancing frustum culling debugging.frustum_cull: Integrated frustum culling logic to improve performance by eliminating objects outside the view, with bounds checks refined for edge cases.sphere_cull: Developed a sphere-based culling mechanism to efficiently determine visibility of spherical objects, optimizing rendering performance.cull_occlusion_run: Fixed a bounds check issue within the occlusion culling routine, ensuring accurate visibility determinations.chunk_dist_sq: Implemented a distance-squared function for chunks, which will be useful in sorting and rendering optimization. The debug rendering system is now significantly more functional, laying the groundwork for more complex visualizations. The next step will involve integrating these debug features with the main rendering loop to ensure they can be toggled during runtime for effective debugging.
Today, I focused on implementing the decals subsystem, which is critical for enhancing visual fidelity by allowing textured decals to be rendered on surfaces in the voxel environment. This will significantly improve the realism of interactions and environmental details. Decals Types: Established the decals_types module to define various decal types and their properties, facilitating extensibility for future decal features.Decals Pass: Implemented the decals_pass, which organizes the rendering of decals in the pipeline. This pass is integrated into the main render loop to ensure decals are drawn after opaque geometry.GLSL Shader Setup: Began the decals_glsl to handle decal shaders, ensuring that the shaders can accommodate blending and fading effects, which are crucial for realistic rendering.Decal Atlas: Developed the decals_atlas, allowing for efficient texture sampling by consolidating multiple decal textures into a single texture atlas, reducing state changes during rendering.Decals Fade and Blend: Added functionality for decals_fade and decals_blend, implementing visual effects that allow decals to gradually appear or disappear and blend with underlying textures, enhancing realism.Debug Drawing: Finished the debugdraw_timed and fleshed out debugdraw_flush_labels, providing tools for visual debugging of decals, which will assist in ensuring correct placements and transitions. The decals subsystem is now partially operational, with foundational components in place for rendering. The next step will involve completing the decals_config and integrating it fully into the scene management system.
Today, I focused on implementing the depth of field (DoF) post-processing effect within the rendering pipeline. This is a critical enhancement for visual fidelity, as it allows for more realistic focus transitions in the scene. Depth of Field (dof_programs): Implemented dof_programs_unload, which properly releases shaders and associated resources when no longer needed, optimizing memory usage.Depth of Field (dof_pass): Began the development of the dof_pass, which will serve as the new rendering stage to handle depth of field computations, ensuring it integrates smoothly with the existing render pipeline.Depth of Field (dof_gather): Completed the dof_gather function, which samples the scene to collect color and depth information needed for the DoF effect, with attention to efficient texture access patterns.Depth of Field (dof_quad): Started implementing the dof_quad, which will represent the screen-space quad used for applying the DoF effect in a fragment shader.Depth of Field (dof_focus): Added functionality for dof_focus, allowing users to set the focal distance dynamically, enhancing control over the DoF effect.Depth of Field (dof_coc): Initiated the dof_coc (circle of confusion) calculations, which are essential for determining which parts of the scene should appear in focus versus out of focus based on their distance from the camera.Code Cleanup: Performed various minor cleanups and formatting changes throughout the modules to improve code readability and maintainability. The depth of field implementation is progressing well, with foundational components in place. The next step will involve integrating the dof_coc calculations into the rendering pipeline and refining the dof_pass to ensure correct visual output.
Today, I focused on the integration and initial implementation of the G-buffer system and Fast Approximate Anti-Aliasing (FXAA) in the rendering pipeline. This work is crucial for improving the visual fidelity and performance of the rendering process. G-buffer Module: Implemented the initial G-buffer structure, facilitating the storage of geometry attributes for deferred rendering. This involves creating texture storage for position, normal, and albedo data.G-buffer Initialization: Developed the gbuffer_init function to allocate and configure the G-buffer textures, ensuring proper setup for rendering operations.FXAA Implementation: Added the core FXAA functionality, including fxaa_main and fxaa_settings_apply, allowing for real-time anti-aliasing effects to smooth out jagged edges in rendered frames.Self-Test for FXAA: Completed the fxaa_selftest implementation to validate the correctness of the FXAA algorithm, ensuring that edge cases are handled and results are consistent across different scenarios.Sampling and Quality: Finished the grid_sample function to enhance texture sampling for FXAA and initiated fxaa_quality, laying the groundwork for different quality settings in the anti-aliasing process.Historical Data Management: Implemented fxaa_history to maintain previous frame data necessary for temporal smoothing in the FXAA algorithm.Stubs for Future Work: Created stubs for fxaa_blit and fxaa_debug, preparing the framework for future enhancements and debugging capabilities. The rendering engine now has foundational G-buffer and FXAA support, significantly advancing the visual quality of the output. The next steps will involve refining the FXAA implementation and integrating the remaining stub functions to complete the
Today, I focused on enhancing the rendering pipeline, specifically the implementation of the g-buffer and draw call management. This work is critical for achieving efficient deferred rendering, which is essential for handling complex lighting scenarios in the engine. Rendering System: Implemented draw_indirect, allowing for batch processing of draw commands without CPU intervention, which reduces overhead and improves performance during frame rendering.Batch Management: Stubbed out batch functionality to prepare for more efficient draw call aggregation, laying the groundwork for optimizing the number of draw calls issued per frame.G-buffer Implementation: Completed the gbuffer_shade, gbuffer_normal, and gbuffer_material modules, each responsible for storing necessary per-pixel data for deferred shading, enhancing the ability to handle multiple light sources effectively.G-buffer Lighting: Initiated the gbuffer_light and gbuffer_brdf_eval_light components, which are responsible for evaluating lighting based on stored g-buffer data and enabling realistic material responses to light.Edge Case Handling: Fixed an edge case in gbuffer_emit_from_chunk, ensuring correct handling when emitting light from chunk edges, which aids in visual consistency across chunk borders.Utility Functions: Implemented clampf for clamping float values, which will be used in various calculations across the rendering pipeline to maintain valid ranges for rendering parameters.Texture Management: Added make_tex to streamline texture creation, facilitating easier integration of textures into the rendering pipeline. The rendering pipeline has significantly improved with these updates, and the next step will be to integrate the batching process fully and assess the overall performance impact in various rendering scenarios.
Today, I focused on the implementation of the instancing subsystem within the rendering pipeline. This work is critical for optimizing draw calls and managing multiple instances of meshes efficiently, which will enhance rendering performance in voxel environments. lt_mesh: Implemented the initial mesh structure to accommodate instance data. This includes setting up vertex attributes for instance transformations.lt_grid: Created an initial grid structure to manage spatial organization of instances, allowing for efficient frustum culling.lt_gpu: Stubbed out the GPU interface to handle instanced rendering commands, establishing a foundation for future integration.lt_cache_init: Implemented the cache initialization routine for storing instance data, which reduces overhead during rendering.instancing_stats: Completed the stats tracking for instanced objects, capturing performance metrics that can be analyzed for optimization.instancing_transform_bounds: Finished the bounding volume calculations for instances, crucial for frustum culling to avoid unnecessary rendering.frustum_batch: Scaffolded the frustum batching system to group instances based on visibility, optimizing the rendering process and minimizing state changes.Cleanup: Executed minor cleanups across multiple modules to enhance code readability and maintainability. The instancing subsystem is now in a functional state, with core structures established and initial implementations completed. The next step will involve refining the GPU integration for instanced rendering and testing performance metrics in various scenarios.
This morning, I focused on establishing the foundational components for the voxel engine’s module system, which is crucial for modularizing functionality and enhancing maintainability. I initiated the groundwork for both configuration and debugging systems. mb_config: Started the configuration module to manage engine settings, establishing a basic structure for loading and saving configurations.mb_debug: Added the debugging module, scaffolding the structure to allow for runtime diagnostics and performance monitoring.lt_stats_format: Implemented a format for terrain statistics, ensuring that performance metrics can be effectively logged and analyzed.block_shape: Began work on the block shape definitions, laying the groundwork for specifying voxel dimensions and orientations.cross_mesh: Stubbed out the cross-mesh functionality, preparing for future implementation of cross-sectional rendering techniques. The foundational modules are now in place, and the next step will involve fleshing out the configuration and debugging features to support real-time adjustments and diagnostics.
Today I focused on the mesh building subsystem, which is critical for generating and managing the geometry of voxel chunks in real-time. This work is foundational for optimizing rendering and ensuring efficient memory usage. MeshBuild Module: Started the implementation of the meshbuild system, establishing the groundwork for efficient chunk geometry generation. This includes setting up the initial data structures for mesh management.Snapshot System: Implemented the mb_snapshot functionality, which allows for capturing the state of the mesh at a given time. This is crucial for optimizing updates and rendering by reducing unnecessary computations.Statistics Tracking: Scaffolding for mb_stats was added to track performance metrics related to mesh generation, providing insights into the efficiency of the rendering pipeline.Block Properties: Introduced initial definitions for block_shape and face_dir, setting up the essential parameters required for defining voxel geometry.Terrain Type Management: Added the lt_terrain module to manage different terrain types within the game, enabling diverse environments and interaction mechanics.Bounds Checking: Fixed a bounds check issue during initialization, ensuring that the allocation of voxel data structures remains within valid memory limits, thus preventing potential crashes or corruption. Current state reflects a significant advancement in the mesh building architecture, with basic functionality established. The next steps will involve fleshing out the mesh generation algorithms and integrating them with the rendering pipeline for further testing.
This morning’s work focused on enhancing the rendering pipeline and starting the implementation of the particle emitter system. These improvements are crucial for visual fidelity and performance in voxel rendering. clamp01: Implemented a function to constrain values between 0 and 1, ensuring proper normalization for graphical calculations.curves: Began the implementation of curve interpolation methods for smoother transitions in animations and particle emissions.gpu_buffer: Added a structured buffer for GPU memory allocation, enhancing the efficiency of data transfer between CPU and GPU for rendering tasks.emitter: Developed the foundational structure for the particle emitter, which will support dynamic visual effects in the game environment.meshbuild_chunk: Completed the initial version of the chunk mesh building algorithm, optimizing how voxel data is converted into renderable geometry. Current progress sets the stage for integrating the particle system fully and refining the mesh building process. The next logical step will be to finalize the emitter’s functionality and connect it to the rendering pipeline.
Today I focused on the particle system and initial components for voxel chunk mesh building, which are critical for enhancing visual effects and optimizing rendering performance in the engine. Particle System: Implemented particle_rng, which initializes a random number generator for particle behavior, crucial for generating varied particle effects.Particle Emission: Completed the particles_rng_in_cone function, allowing for particles to be emitted in a cone-shaped area, enhancing the realism of effects like explosions or smoke.Particle Pool Management: Developed particles_pool_clear, which efficiently resets the particle pool between frames, minimizing memory usage and helping maintain performance during high-load scenarios.Vertex Packing: Set up vertex_pack, which organizes vertex data into a compact format suitable for GPU processing, improving data transfer efficiency and reducing memory bandwidth usage.Chunk Mesh Building: Started the meshbuild_chunk implementation to facilitate efficient chunk rendering, laying the groundwork for further optimizations like greedy meshing.Emitter System: Added a basic emitter class to manage particle emission attributes, enabling future extensibility for different particle effects and behaviors.Cleanup and Organization: Conducted minor cleanups and formatting across various files, ensuring code maintainability and consistency. The particle system is now more robust, and the chunk building process has a foundational structure in place. The next step involves completing the mesh building logic and integrating more complex particle behaviors using the emitter system.
Today, I focused on the graphics subsystem, specifically enhancing the shader management and shadow rendering capabilities. This work is essential for achieving more sophisticated visual effects and better performance in the rendering pipeline. Shader Management Module: Implemented shaderman_set_hot_reload, enabling dynamic shader reloading during runtime to facilitate rapid iteration without restarting the engine.Shader Compilation: Completed the shader_compile function, which compiles shader code into GPU executable format, improving the setup time for rendering.Shader Initialization: Added shadow_init, which initializes parameters related to shadow rendering, ensuring proper setup before rendering occurs.Shader Stage Handling: Filled in the shader_stage structure to manage different stages of shader processing, which allows for cleaner organization of shader tasks.Active Uniforms Retrieval: Finalized shaderman_gl_active_uniforms, which retrieves and stores active uniform variables from shaders, enhancing the shader’s interaction with the rendering system.Debugging Support: Set up shader_debug, providing hooks for debugging shader issues during development, which improves the ease of identifying and resolving shader-related problems.Bloom Effect: Added a basic implementation of bloom rendering through bloom_resize and the bloom module, initiating post-processing effects to enhance scene brightness. The shader management system is now more robust, allowing for dynamic updates and improved shader handling. The next step will involve integrating the shadow rendering into the main rendering loop to evaluate performance and visual fidelity.
Today I focused on the lighting subsystem, specifically implementing shadow mapping techniques and enhancing the atmospheric rendering system. These improvements are crucial for achieving realistic lighting and depth effects in the voxel environment. shadow_map: Implemented the shadow mapping algorithm, which includes creating a depth texture to store the distance from the light source to the nearest surface, enabling more realistic shadows.shadow_pcf: Developed percentage-closer filtering (PCF) for shadows to soften the edges of the shadow map, increasing visual fidelity. This involved setting up the filtering process within the shader pipeline.shadow_split: Introduced the shadow split technique to improve shadow rendering across varying depths. This includes calculating split distances based on the camera’s frustum to reduce artifacts.shadow_matrix: Added a shadow matrix computation to transform world coordinates into shadow map space, ensuring correct shadow projection during rendering.skyb: Began implementing the skybox atmospheric effects, specifically the skyb_atmosphere_clear_color and skyb_billboard. This includes color adjustments for clearer skies and setting up billboards for celestial bodies.shadow_stabilize: Stubbed out a shadow stabilization technique to reduce flickering and aliasing in shadow rendering, which will be fleshed out in future commits.code maintenance: Conducted minor cleanups and cosmetic tweaks across multiple files for better readability and organization, including renaming functions for clarity. The current state of the shadow rendering system is functional with basic shadow mapping and initial atmospheric effects implemented. The next step will be to refine the shadow stabilization method and continue developing the full atmospheric rendering features.
Today, I focused on enhancing the rendering subsystem with the implementation of Screen Space Ambient Occlusion (SSAO). This feature is critical for improving scene depth and realism by simulating how light interacts with surfaces. SSAO Module: Implemented the foundational SSAO computation logic in ssao_compute, which calculates ambient occlusion based on depth and normal maps to enhance shading realism.SSAO Debugging: Developed ssao_debug to visualize SSAO outputs, allowing for quick verification of occlusion values and aiding in fine-tuning the algorithm.SSAO Blur: Completed the SSAO blur process in ssao_blur, which smooths the occlusion map to reduce artifacts and achieve a more visually appealing result. The blur uses a separable Gaussian filter for performance efficiency.Skybox Renderer: Progressed on the skybox rendering system by fleshing out skyb_renderer_upload_dome and skyb_dome_vertex, which define the dome geometry and texture uploads for the skybox, ensuring proper visual integration with the ambient occlusion effects.Skybox Palette and Gradient: Initiated the scaffolding for skyb_palette and set up skyb_gradient, enabling gradient-based skybox coloring to enhance atmospheric effects in conjunction with SSAO. The SSAO implementation is now functional, with debug features in place to assess its performance and visual fidelity. The next step will involve further optimizing the SSAO calculations and integrating them seamlessly into the main rendering pipeline.
Today I worked on the implementation of screen space reflections (SSR) and screen space ambient occlusion (SSAO) within the rendering subsystem. These features are vital for enhancing visual fidelity and realism in lighting interactions within the voxel environment. SSR Module: Introduced the ssr_fsquad, which sets up a full-screen quad for executing the SSR shader pass. This establishes a foundation for reflection calculations.SSR Configuration: Created ssr_config scaffolding to manage SSR parameters, allowing for adjustable settings such as reflection intensity and roughness.SSR Depth Setup: Implemented the ssr_depth, which captures depth information necessary for accurate reflection rendering. This enables proper occlusion of reflections based on scene depth.SSR Debugging: Set up ssr_debug to visualize reflection calculations during development, aiding in the identification of rendering artifacts or inaccuracies.SSAO Configuration: Initialized ssao_settings to provide user-adjustable controls over ambient occlusion effects, including radius and intensity.SSAO Pass Setup: Established the ssao_pass, which integrates the SSAO calculations into the render pipeline, ensuring it runs alongside other post-processing effects.SSAO Sampling: Started working on ssao_sample, which defines the sampling strategy for ambient occlusion, leveraging a kernel to calculate occlusion values based on neighboring pixels.Kernel Statistics: Set up ssao_kernel_stats to track and debug the parameters of the SSAO kernel, which will assist in optimizing performance and quality. The rendering subsystem now has a foundational implementation for both SSR and SSAO, with key components in place. The next steps will involve refining the sampling methods for SSAO and integrating the blurring effect for the final output to enhance visual quality.
Today, I focused on the text rendering subsystem, specifically the development of the text context and text batch systems. This work is foundational for rendering 2D text efficiently, which is crucial for UI elements and in-game text displays. text_ctx: Implemented the initial structure for the text context, which manages the state related to text rendering. This includes setting up memory allocations for text data and glyph information.text_batch: Created a scaffold for the text batch system to handle multiple text draw calls efficiently. This will allow for batching of text rendering operations to minimize state changes.text_atlas: Developed the initial setup for the text atlas, which will store glyph images for rapid access during rendering. This will improve performance by reducing texture binding overhead.text_font: Initialized the text font subsystem to load and manage font data. This includes parsing font files and generating the necessary glyph data.text_glyphdata: Started the implementation of glyph data handling, allowing for precise control over individual characters and their metrics.ssr_settings and ssr_pass: Set up the screen space reflections (SSR) settings and pass, which will enhance the visual fidelity of reflective surfaces in the engine.ssrx_material_unpack: Completed the unpacking of material data for SSR, ensuring that material properties are correctly interpreted during rendering. The text rendering subsystem is now well-structured, and the next step will involve integrating the text rendering into the main rendering pipeline to ensure text is displayed correctly in the game environment.
This morning’s work focused on the tonemapping subsystem, particularly enhancing exposure control and initializing the necessary data structures. These changes are critical for achieving realistic rendering through proper dynamic range management. Tonemap Exposure: Implemented tonemap_exposure to calculate exposure values based on scene luminance, improving how bright areas are rendered.Tonemap Configuration: Added tonemap_config, defining parameters for exposure and curve settings, facilitating easy adjustments and future expansion.Tonemap Curve: Began the implementation of tonemap_curve, establishing a basis for non-linear mapping of color values to enhance dynamic range perception.Text Layout: Completed the text_layout function, which manages text rendering for UI elements, ensuring proper alignment and spacing.Tonemap Debugging: Implemented tonemap_debug_run_split to allow testing of various tonemapping scenarios, aiding in fine-tuning the visual output. Current progress sets a solid foundation for further work on the tonemapping pipeline, with the next steps aimed at refining the tonemap grading process and integrating it into the rendering loop.
Today, I focused on the development of the tonemapping subsystem, which is essential for controlling the luminance and color mapping of rendered scenes to enhance visual fidelity. This work is crucial as it directly affects the output quality of rendered images. volumetric_blur: Scaffolded the vol_blur module to introduce volumetric blur processing. This lays the groundwork for further development of blur algorithms.tonemap: Established the initial framework for tonemapping, including scaffolded modules for tonemap_params, tonemap_grade, and tonemap_curve. This modular approach allows for easy future enhancements and testing.tonemap_selftest: Wired up self-testing capabilities for tonemapping to ensure that changes can be effectively validated. This includes fleshing out the self-test to cover edge cases and expected behavior.tonemap_lut: Implemented a lookup table (LUT) for tonemapping, which will optimize color grading processes. Set up associated functions to support LUT creation and application.tonemap_exposure: Started the implementation of exposure management in tonemapping, including functions to retrieve and adjust exposure levels dynamically.text_layout: Completed the implementation of the text layout system, which will be utilized for rendering debug information and UI elements related to tonemapping.cleanup: Conducted code cleanup across several modules, focusing on reducing technical debt and improving readability. The current state of the tonemapping subsystem is foundational, with several key components scaffolded and initial implementations underway. The next logical step involves further developing the tonemapping algorithms and integrating them into the rendering pipeline to evaluate their impact on scene output.
Today, I focused on implementing various aspects of the volumetric rendering subsystem. This work is critical for enhancing the visual fidelity of the water rendering and introducing new volumetric effects, which are essential for achieving realistic environmental interactions in the engine. water_reflect: Implemented reflective properties for water surfaces, enhancing the realism of water rendering by calculating reflection vectors based on the viewer’s position and the surface normals.volumetric_programs_use_march: Wired up the volumetric rendering programs to utilize a raymarching approach for rendering volumetric effects, allowing for more complex light interactions within volumes.vol_raymarch: Began development of the raymarching algorithm for volumetric rendering, laying the groundwork for subsequent implementations of effects such as fog and smoke.volumetric_pass_run: Implemented the core function to execute volumetric passes, establishing a pipeline for rendering volumetric effects sequentially within the main render loop.vol_caustics: Initiated the caustics rendering system, which will simulate light patterns created by surface reflections on the volumetric medium, enhancing the visual complexity of water interactions.vol_pass: Scaffolded the volumetric pass structure, defining how different volumetric effects will be processed in the render pipeline.vol_medium: Created an initial implementation of volumetric mediums, allowing the engine to define properties such as density and scattering for various materials. The volumetric rendering subsystem is now more robust and modular, with foundational components in place. The next step is to continue refining the raymarching implementation and integrate the caustics calculations within the rendering pipeline.
Today, I focused on implementing the initial stages of the animation and AI subsystems, as well as enhancements to the water rendering pipeline. These components are critical for enhancing the game’s dynamic interactions and visual fidelity. Animation System: Implemented foundational structures for anim_blend. This allows for smooth transitions between different animations, improving character movement fluidity.Entity System: Completed the entity module, enabling proper management of game objects, including their lifecycle and state management, which is essential for gameplay.AI Module: Introduced the pathfind function, allowing entities to navigate the game world effectively. This is a crucial step towards integrating more complex AI behaviors.Water Rendering: Established the water_pass, implementing the water rendering pipeline. This includes setting up reflection and refraction capabilities using a dedicated reflection camera (water_reflcam), enhancing visual realism.Water Effects: Started work on water_wave and water_foam, which will simulate surface interactions and enhance the dynamic appearance of water bodies.AI Updates: Added ai_tick, which will manage updates to AI behaviors each frame, ensuring responsive and engaging NPC interactions. Current progress includes foundational setups for both animation and AI systems, alongside initial water rendering capabilities. The next logical step involves refining the AI behaviors and continuing the development of the water effects to enhance environmental interactions.
Today, I focused on the animation subsystem of the voxl engine, specifically enhancing the animation systems to support skeletal animation and procedural walking behaviors. This work is crucial for implementing character animations that are both dynamic and responsive to gameplay inputs. behavior_leaf: Implemented the behavior_leaf module, establishing a base for behavior trees that allows for more complex AI decision-making processes.behavior_builder: Developed the behavior_builder to construct behavior trees programmatically, centralizing the creation and management of AI behaviors.behavior_act_target_in_reach: Completed the implementation of the behavior_act_target_in_reach, which checks proximity to targets for AI actions, enhancing interaction capabilities.anim_skeleton: Began scaffolding the anim_skeleton module, which will define the structure and hierarchy of skeletal animations, essential for character rigging.anim_rig: Set up the anim_rig, providing the framework for binding animations to skeletal structures, facilitating smooth character movement.animation_procedural_walk: Expanded the animation_procedural_walk to allow for dynamic adjustments based on character speed and terrain, improving realism in character locomotion.anim_controller: Introduced the anim_controller to manage the state and transitions of animations, allowing for layered animation blending and more responsive character behaviors.entity_render: Implemented entity_render functionality, which integrates the rendering of animated entities into the broader scene graph, ensuring visual coherence. The current state of the animation system is foundational but progressing well, with core modules in place for skeletal animation. The next steps will involve refining the blending of animations and integrating more complex animation states.
Today, I focused on the combat subsystem, specifically implementing various components necessary for managing health, damage, and character behaviors during combat scenarios. This work is critical for establishing a solid foundation for player interactions and enemy behaviors. Combat System: Implemented combat_health, which tracks and manages health points for entities, including health reduction mechanics and thresholds for death events.Combat System: Added combat_invuln, providing temporary invulnerability states for characters, which allows for the management of damage immunity during specific animations or effects.Combat System: Developed combat_knockback, a mechanic that applies force to characters upon receiving damage, enhancing the feedback of combat interactions.Behavior Tree: Stubbed out the combat_combo, which will facilitate chaining of attacks for characters, setting up a framework for more advanced combat mechanics.Behavior Management: Completed behavior_tree_free to ensure proper memory management of behavior trees, preventing memory leaks during runtime.Behavior Management: Initiated behavior_runner_init, which sets up the initial state for behavior execution, crucial for managing different character actions effectively.Combat System: Implemented combat_dmg_info_get, which retrieves damage information relevant for interaction logic, aiding in the clarity of combat events.Cleanup: Conducted code tidying and minor fixes across the combat module to enhance readability and maintainability. The combat subsystem now has a more cohesive structure with the groundwork laid for complex interactions. The next step will involve fleshing out the behavior tree logic to integrate advanced AI behaviors and attack combos.
This morning, I focused on the combat subsystem, implementing new mechanics that enhance player interactions and feedback during combat. These changes are pivotal for establishing a robust gameplay foundation. combat_resist: Implemented a resistance mechanic that determines damage mitigation based on player attributes, allowing for more nuanced combat outcomes.combat_rng: Added a random number generator for damage calculations, introducing variability in combat results to enhance unpredictability and player engagement.combat_knockback: Developed a knockback effect that alters player position upon receiving damage, improving the physicality of combat interactions.combat_log_death_message: Implemented logging functionality to display a message when a player character dies, providing clear feedback for the player on their status.stub out combat_log: Created a basic structure for the combat log system, laying the groundwork for future enhancements in tracking combat events and player actions. Current progress has established essential combat mechanics. The next step will involve integrating these systems into the overall game loop for testing and refinement.
Today, I focused on the development of the Entity-Component-System (ECS) architecture, specifically initializing spatial queries and establishing foundational components for entity management. This work is critical for optimizing game object interactions and enabling efficient systems for rendering and gameplay logic. ecs_spatial: Initiated the module to manage spatial queries for entities, allowing for efficient retrieval of entities based on their spatial positions. This is essential for implementing features like frustum culling and collision detection.ecs_query: Added the initial structure for querying entities based on components. Stubbing out this system lays the groundwork for flexible querying mechanisms essential for game logic processing.ecs_relations: Started the implementation of relational data structures to handle parent-child relationships between entities, which will facilitate a hierarchy for transformations and event propagation.ecs_blob_init: Completed the initialization sequence for ECS blobs, which encapsulate component data for entities, improving memory layout and access patterns while ensuring efficient entity creation and destruction.ecs_prefab: Introduced the prefab system for defining reusable entity templates. This system will streamline the instantiation of common game objects and reduce redundancy in entity creation.ecs_group_refresh: Enhanced the group management system to refresh entity groups based on component changes, optimizing the update cycle for systems relying on dynamic entity states.ecs_events: Implemented an event system to handle notifications between entities and systems, allowing for decoupled interactions and improved modularity.combat_resist, combat_rng, combat_knockback, and combat_log: Started implementing core combat mechanics, including resistance calculations and random number generation for combat outcomes, along with stubbing out logging for combat events. The ECS framework is now more robust, and the next step will be to integrate these components into a cohesive system, ensuring that queries and events operate seamlessly across the game engine.
Today’s work focused on the integration of the entity-component-system (ECS) architecture and the initial implementation of the physics subsystem. This is crucial for establishing a robust framework for game object management and collision detection. ephysics_aabb: Implemented the Axis-Aligned Bounding Box (AABB) structure to support collision checks. This provides an efficient way to handle spatial queries.ephysics_broadphase: Developed the broad phase collision detection system. This module identifies potential collisions using AABBs to minimize computational overhead during the narrow phase checks.ephysics_ccd_resolve: Added continuous collision detection resolution to ensure accurate collision handling for fast-moving entities, preventing tunneling issues.ecs_world: Scaffolding for the ECS world management was set up, allowing for the organization and management of entities and components effectively.ecs_types: Established foundational data structures for components, enhancing type safety and access patterns within the ECS framework.ecs_get: Implemented the ecs_get function to retrieve components associated with entities, facilitating component retrieval in a type-safe manner.ecs_sys_collide: Wrote the initial collision system that integrates with the ECS, processing collision events and leveraging the broad phase detection.ecs_stats: Initiated the ECS stats module, which tracks performance metrics and entity counts, vital for optimizing system performance. The current state of the engine now includes a foundational ECS structure with a basic physics engine integrated. The next step involves refining the collision resolution mechanism and expanding the entity management features.
This morning, I focused on enhancing the physics subsystem, specifically in the area of impulse and motion mechanics. This work is crucial for achieving realistic interactions and responses to forces within the game environment. ephysics_motion_ballistic: Implemented the initial projectile motion calculations, enabling objects to follow a parabolic trajectory under gravity.ephysics_pushout: Started designing the pushout mechanism to resolve overlaps between colliding objects, which will be essential for player movement and interaction.ephysics_impulse: Created a stub for impulse application, setting up the necessary data structures to handle instantaneous force applications on entities.ephysics_falldmg: Completed the fall damage calculation, accounting for the velocity of the entity at impact, which enhances realism in gameplay.ephysics_current: Filled in the functionality for current effects, allowing entities to be influenced by environmental forces, such as water currents. The current state includes foundational motion and interaction mechanics. The next step will involve expanding on impulse handling to ensure comprehensive force interactions across various physics scenarios.
Today, I focused on enhancing the physics subsystem, specifically the entity physics (ephysics) module. This work is essential to establish a robust framework for collision handling, motion integration, and interactions with the environment. ephysics_sweep: Expanded the logic to improve sweep tests for collision detection, ensuring accurate intersection calculations between moving entities and static geometry.ephysics_step: Initiated the implementation of the stepping function, which manages the simulation time step for physics updates, crucial for maintaining consistent behavior across frame rates.ephysics_spatial: Established a spatial partitioning system to optimize collision queries, using an efficient data structure to reduce the number of checks required during each physics update.ephysics_body_from_entity: Completed the function to create physics bodies from game entities, allowing for dynamic interaction based on entity properties and state.ephysics_query_solid_cell: Implemented a query method to check for solid cells within the voxel grid, facilitating accurate collision responses for entities interacting with the voxel environment.ephysics_pushout: Began development on the pushout mechanism, which resolves collisions by adjusting the position of entities to avoid overlaps with solid objects.ephysics_motion_ballistic: Filled in the calculations for ballistic motion, allowing entities to simulate projectile trajectories accurately under the influence of gravity.ephysics_falldmg: Developed functionality to handle fall damage, tying entity physics state to health mechanics based on vertical distance fallen. The physics subsystem is becoming more cohesive with these additions. The next logical step is to finalize the integration of the impulse and fluid simulation components, enhancing interaction realism further.
Today, I focused on the implementation of the mob subsystem, particularly in setting up the foundational structures and behaviors for various mobile entities within the engine. This work is crucial for establishing NPC interactions and their movement dynamics in the game world.
Today, I focused on the navigation subsystem, implementing several foundational components essential for pathfinding and AI navigation within the voxel environment. This work is crucial for enabling agents to navigate through the game world effectively.
Today, I focused on the projectile system within the game engine, specifically working on the memory management and foundational structures for spawning and managing projectiles. This work is crucial for optimizing projectile behavior and ensuring efficient resource allocation during gameplay.
Today, I focused on the spawning subsystem, specifically on the initial implementation of the spawnx module and the scaffolding of related systems. This work is essential for managing entity generation and behavior in the voxel environment.
Today, I focused on the spawning subsystem, specifically on the initial implementation of the spawnx module and the scaffolding of related systems. This work is essential for managing entity generation and behavior in the voxel environment.
Today, I focused on the building subsystem, which is critical for player interaction and environment manipulation. The work primarily involved finalizing and scaffolding various components of the building mechanics, including previews, placement, and rotation.
Today, I focused on the crafting subsystem, establishing foundational components essential for managing crafting recipes and related functionalities. This work is crucial for enabling player interactions with crafting mechanics, which are integral to gameplay progression.
Today, I focused on the effects subsystem and the crafting system to enhance gameplay mechanics and item interactions. These improvements are crucial for player feedback and item management in the game.
Today, I focused on the enchantment subsystem, establishing the foundational architecture for enchantments and their associated mechanics. This work is critical, as enchantments will enhance player interaction and item customization within the game.
This morning’s work focused on implementing mechanics related to fishing, an essential feature for gameplay. The changes address various aspects of the fishing system, including mechanics for enchantments and loot generation.
Today I focused on the implementation of the fishing subsystem, which is crucial for adding interactive gameplay elements that enhance player engagement. This work lays the foundation for fishing mechanics, including casting, line management, and loot generation.
Today I focused on the inventory subsystem, specifically initializing and structuring the inventory components. This work is critical for ensuring a robust and functional system for managing player items, which is foundational for gameplay mechanics.
Today I focused on the inventory and tools subsystems, specifically enhancing item durability management and transfer mechanisms. These additions are critical for ensuring that tool usage and inventory interactions are coherent and efficient.
Today, I focused on the tools subsystem, particularly the tools registry and experience (XP) management systems. This work is crucial for establishing a structured framework for tool interactions and player progression
Today I focused on the user interface subsystem, specifically initializing components for the HUD and integrating health and experience mechanics. This work is essential to establish a basis for player feedback and interaction, enhancing overall gameplayability.
Today, I focused on enhancing the console subsystem, which is crucial for debugging and player input management. The improvements made today lay the groundwork for a more robust command interface, enabling better interaction with the game engine.
Today, I worked primarily on the HUD subsystem, focusing on the implementation of various HUD components and inventory screens. This is crucial for improving user interaction and providing feedback during gameplay
Today, I focused on the menu subsystem, primarily implementing and refining the main menu and inventory screen functionalities. This work is essential for user interaction and enhancing the player experience through intuitive navigation....
|
1791822083.9425588
|
1792686083.9425588
|
|
29733
|
SL-LLM-R: Can an AI learn from its own verified mi SL-LLM-R: Can an AI learn from its own verified mistakes? by @Samuelm | Stardance...
|
Samuelm
|
1
|
671.22
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-08T20:34:33Z", "hours": 381.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Most LLMs can recognize that they made a mistake, but they usually don’t actually learn from it. I’m building SL-LLM-R to explore whether that can be changed. The idea is to let a pretrained model learn from its own verified experience. When something goes wrong, the system saves where the decision came from, tries alternative decisions from the same state and checks what actually changes the outcome. If a possible improvement is supported by enough evidence, it can eventually be turned into a small, controlled update. If it makes things worse, the system must be able to reject it or roll it back. The research mechanism behind this is called Verifier-Grounded Counterfactual Plasticity, or VGCP. What matters to me is that the project does not just produce results that look good. The experiments are designed around reproducibility, fixed evaluation rules, independent verification, held-out tests and preserving failed experiments instead of quietly replacing them. The deterministic foundation is working and verified. The proposal system is implemented and tested, and the latest development benchmark was able to distinguish between different proposal strategies. The confirmatory experiment has now been preregistered and sealed. It has not been run yet. So I am not claiming that SL-LLM-R has solved continual learning or that it can already improve itself. That is exactly what the next experiments are meant to test. I have published the research, architecture, mathematics, experiment history, negative results and current evidence at: research.samuelm.de", "repo": "https://github.com/Samuel-Mencke/SL-LLM-R-Research", "demo": "https://samuelm.de/sl-llm-r"}]...
|
[{"post_id": 64120, "ts": "202 [{"post_id": 64120, "ts": "2026-09-08T09:56:53Z", "hours": 8.5761, "text": "DEVLOG #46 - Some repair scores could not be trusted Every possible repair SL-LLM-R produces should be linked back to the original proposal it came from so the search can be scored correctly. I found cases where that link was ambiguous, which can make the score describe the wrong search. I changed the scoring path so ambiguous pairs are rejected instead of guessed, and the earlier zero-hit result stays zero."}, {"post_id": 63496, "ts": "2026-09-07T11:54:01Z", "hours": 9.4925, "text": "DEVLOG #45 - Fixing one broken link still gave zero hits When SL-LLM-R fails to find a repair that I know should be reachable, I need to know whether the search is bad or the test case is broken. One case had a broken link between the original proposal and the repair I expected the search to find, so I fixed only that link and ran the case again with the same number of attempts. The search still found the target zero times, so that broken link was not the whole problem."}, {"post_id": 62759, "ts": "2026-09-06T08:48:26Z", "hours": 8.4917, "text": "DEVLOG #44 - I can explain 306 misses, but 1,224 still look the same I am trying to understand why SL-LLM-R’s repair search fails to find fixes that should exist. Right now I can explain 306 misses, while another 1,224 look identical in every field I am allowed to compare. Two different explanations for the source-signal problem also match the same 306 cases, so the available data still cannot separate those explanations for the larger group."}, {"post_id": 62552, "ts": "2026-09-06T00:19:11Z", "hours": 27.7922, "text": "DEVLOG #43 - I built one failure where I already knew the cause SL-LLM-R’s repair search was missing many fixes that I expected it to find, but I did not know why. I built one small synthetic failure where the component reading the source signal gets the wrong input, so I can reproduce that miss on purpose. At least one failure now has a known cause, which I can compare with the unexplained failures without assuming they are all the same problem."}, {"post_id": 60093, "ts": "2026-09-02T07:34:28Z", "hours": 21.6367, "text": "DEVLOG #42 - The first real learning run is still blocked The repaired SL-LLM-R comparison produced 1,530 completed results, but I still did not understand the repair-search failures well enough to start changing real model weights. Training therefore stayed off while I investigated why targets were being missed. I would rather delay the first learning update than call an unclear result progress."}, {"post_id": 58382, "ts": "2026-08-30T19:53:06Z", "hours": 17.5958, "text": "DEVLOG #41 - If the model grows, the extra capacity has to help I do not want SL-LLM-R to add parameters just because a larger model sounds better. If the system ever needs more capacity, my current idea is to add a small module in a copy and test whether that addition actually improves the model. If it does not help, the extra module should be deleted just like any other failed update."}, {"post_id": 56969, "ts": "2026-08-29T00:43:17Z", "hours": 0.3206, "text": "DEVLOG #40 - What happens if the model runs out of room? SL-LLM-R is meant to keep learning over time, which creates a long-term problem if a fixed-size model eventually runs out of useful capacity. My current idea is a stable core, fast memory, small learnable parts, and possibly extra specialist modules only when the existing capacity is not enough. The project cannot do that yet, so this is still future research."}, {"post_id": 56958, "ts": "2026-08-29T00:18:16Z", "hours": 0.6817, "text": "DEVLOG #39 - The repair-search failures are finally visible With a completed comparison, I can now inspect why SL-LLM-R’s repair search misses targets. Some misses come from repeated ideas, some repairs need more steps, and some targets are never reached by the current search. Separating those cases is more useful than treating every miss as one generic failure."}, {"post_id": 56943, "ts": "2026-08-28T23:37:01Z", "hours": 6.3122, "text": "DEVLOG #38 - The retry produced 1,530 completed results After the first SL-LLM-R comparison crashed, I fixed only the problems that prevented the test from running and repeated the same comparison. This time all 1,530 runs completed and produced scores. I could finally inspect failures in the repair search itself instead of only debugging the test setup."}, {"post_id": 56757, "ts": "2026-08-28T17:18:10Z", "hours": 0.3392, "text": "DEVLOG #37 - All 1,530 comparison runs crashed I ran a large SL-LLM-R comparison to measure the repair search, but all 1,530 runs crashed before producing a useful score. That means the run tells me nothing about whether the repair method was good or bad. The test setup failed, so I kept the result as a failed experiment instead of treating the crashes as model evidence."}, {"post_id": 56744, "ts": "2026-08-28T16:58:08Z", "hours": 0.3328, "text": "DEVLOG #36 - The learning loop is connected, but training is still off The main SL-LLM-R learning path is now connected. It starts with the original model, makes a temporary changed copy, checks whether the change helped and whether older abilities got worse, then either keeps the copy or throws it away. Real training is still disabled, so this is not yet a finished self-learning model."}, {"post_id": 56734, "ts": "2026-08-28T16:38:15Z", "hours": 0.2736, "text": "DEVLOG #35 - A better retry is still not model learning SL-LLM-R is meant to change future model behavior, not just get a better answer on the second attempt. Many AI systems can retry with more context and look like they learned even when the model itself stayed the same. I only care about a correction as learning if it affects later behavior, does not break other abilities, and can still be undone."}, {"post_id": 56723, "ts": "2026-08-28T16:21:26Z", "hours": 0.2608, "text": "DEVLOG #34 - Replay and consolidation fit the project together I realized two ideas from continual-learning research fit SL-LLM-R quite well. Replay means keeping older knowledge present while learning something new, while consolidation is about deciding which new experiences deserve to last longer. Together they match the goal of turning some verified experiences into lessons without making every observation permanent."}, {"post_id": 56711, "ts": "2026-08-28T16:05:48Z", "hours": 0.2606, "text": "DEVLOG #33 - Brain wiring gave me one idea to test I looked at connectomics, which is research on how brain cells are connected, because SL-LLM-R needs a way to keep model changes local. One idea is that connection structure might help choose which parts are safe to change together. It is only inspiration for an experiment, not a claim that transformers work like brains."}, {"post_id": 56701, "ts": "2026-08-28T15:50:13Z", "hours": 0.2608, "text": "DEVLOG #32 - The first real update has one clear path I wanted the first real SL-LLM-R model update to follow one understandable sequence. The system loads a parent model, copies it, changes only the child, tests the parent and child, then either keeps the child or deletes it. Training is still disabled, but the update path itself is now connected instead of being spread across separate pieces."}, {"post_id": 56690, "ts": "2026-08-28T15:34:39Z", "hours": 0.2606, "text": "DEVLOG #31 - A real base model is now part of the setup SL-LLM-R started with placeholder model inputs while I built the safety and comparison logic around them. I replaced that placeholder with a real open model that the system can identify and verify exactly. Training is still off, but future experiments can now start from a real model rather than a fake name."}, {"post_id": 56681, "ts": "2026-08-28T15:19:09Z", "hours": 0.2608, "text": "DEVLOG #30 - I can now undo a model update through the full practice loop SL-LLM-R needs a complete way to undo a model change before real learning updates can be trusted. I can now save the original model, make a changed copy, test it, switch to it, and return to the original in one practice run. I have not yet used that path to undo a genuinely learned LLM update, so the mechanism works but the real learning case is still untested."}, {"post_id": 56670, "ts": "2026-08-28T15:03:40Z", "hours": 0.2522, "text": "DEVLOG #29 - The cause finder is allowed to say it does not know Before SL-LLM-R changes a model, it tries to estimate what caused the original failure. I tested that part on simple cases where the cause was already known, especially to see what happens when the signal becomes weak. It can stop instead of inventing a confident answer, which is the behavior I want before any model update depends on that guess."}, {"post_id": 56662, "ts": "2026-08-28T14:48:25Z", "hours": 0.2606, "text": "DEVLOG #28 - Loading a model should not enable training SL-LLM-R needs access to a real base model before I can run realistic experiments. I made that access read-only so loading and checking the model does not automatically give the system permission to change its weights. Training can stay completely off while I verify exactly which model and data the project is using."}, {"post_id": 56654, "ts": "2026-08-28T14:32:51Z", "hours": 0.2522, "text": "DEVLOG #27 - Failed repairs still tell me something SL-LLM-R generates repair ideas after model mistakes, and many of those ideas get rejected. I started keeping track of why they fail instead of treating every rejected repair as the same kind of failure. Duplicates, impossible repairs, multi-step repairs, and bad ideas reveal different weaknesses in the search even when the model learns nothing from them."}, {"post_id": 56647, "ts": "2026-08-28T14:17:28Z", "hours": 0.4669, "text": "DEVLOG #26 - Every model change needs a history If SL-LLM-R keeps a model update, I want to be able to trace exactly why that change exists later. Each kept update should point back to the original mistake, the proposed repair, the parent model, and the checks that approved it. Otherwise a future model problem could turn into a mystery with no clear way to undo the right change."}, {"post_id": 55577, "ts": "2026-08-27T15:01:19Z", "hours": 0.3369, "text": "DEVLOG #25 - I need to know what caused a mistake before changing weights SL-LLM-R is supposed to learn from a model mistake without changing more of the model than necessary. A single bad result only tells me that something went wrong, not what caused it. The system first needs a likely cause before it can choose a small place where a repair might make sense."}, {"post_id": 55570, "ts": "2026-08-27T14:40:57Z", "hours": 0.345, "text": "DEVLOG #24 - I had to keep the final test separate I need to improve SL-LLM-R without slowly tuning it to the exact tasks used to judge it at the end. If I keep looking at those final tasks while changing the repair search, I can accidentally learn the test itself. Development tasks and final test tasks therefore stay separate."}, {"post_id": 55558, "ts": "2026-08-27T14:20:24Z", "hours": 0.3275, "text": "DEVLOG #23 - Random search was harder to beat than I expected SL-LLM-R uses a structured search to find possible repairs after model mistakes, and I compare it against random repair ideas. I expected random search to be an easy baseline to beat, but it was surprisingly competitive under the same budget. The structured search still has to prove that its extra complexity is actually worth using."}, {"post_id": 55386, "ts": "2026-08-27T05:56:33Z", "hours": 10.0881, "text": "DEVLOG #22 - More attempts can make a weak search look better I compare SL-LLM-R’s repair search against simpler search methods. If one method gets more attempts or more compute, it can look better just because it had more chances to get lucky. I now keep the search budget equal across methods so the comparison is about the method rather than the amount of compute."}, {"post_id": 55096, "ts": "2026-08-26T15:32:19Z", "hours": 0.2608, "text": "DEVLOG #21 - The learning controller mostly blocks updates SL-LLM-R has a controller that decides whether a possible model update is safe enough to try or keep. I originally imagined it mostly choosing how to learn, but most of its job is actually refusing weak updates. If the signal is weak, the change is too large, or forgetting risk is too high, the model stays unchanged."}, {"post_id": 55086, "ts": "2026-08-26T15:16:50Z", "hours": 0.6056, "text": "DEVLOG #20 - Memory can change fast, weights should change slowly SL-LLM-R uses two different kinds of adaptation. Temporary memory can change quickly because it can be thrown away, while real model weights should change much more slowly and only after stronger checks. This keeps a random observation from becoming permanent too easily."}, {"post_id": 53445, "ts": "2026-08-24T00:13:08Z", "hours": 5.4086, "text": "DEVLOG #19 - New lessons can overwrite old ones A continual-learning system like SL-LLM-R can forget older knowledge if it trains only on the newest mistake. I use replay, which means mixing some older verified examples back in while a new lesson is learned. The goal is to make new learning fit alongside old knowledge instead of pushing it out."}, {"post_id": 52830, "ts": "2026-08-23T05:53:45Z", "hours": 15.8025, "text": "DEVLOG #18 - Fixing one mistake can break something else SL-LLM-R cannot judge a learning update only on the mistake it was meant to fix. A model can improve on that one case and quietly get worse at older abilities. I therefore check for forgetting too, so an update is rejected if the local gain hides a larger loss elsewhere."}, {"post_id": 52112, "ts": "2026-08-22T06:10:57Z", "hours": 17.9328, "text": "DEVLOG #17 - A changed model has to beat the unchanged one SL-LLM-R creates a temporary child model when it tests a learning update. The child is not kept just because it is newer. It has to perform better than the unchanged parent under the same checks, otherwise the update is discarded."}, {"post_id": 51476, "ts": "2026-08-21T06:25:29Z", "hours": 16.7675, "text": "DEVLOG #16 - I wanted rollback before trusting any update SL-LLM-R should be able to undo a model change if the new version turns out worse. Every update starts from a saved parent model and happens in a temporary child copy. If the child fails the checks, it can be deleted and the original parent stays untouched."}, {"post_id": 50792, "ts": "2026-08-20T05:46:56Z", "hours": 0.3267, "text": "DEVLOG #15 - Which experiences should the model learn from? SL-LLM-R eventually needs to choose which experiences are worth using for learning instead of treating every case equally. I tested selecting problems near the model’s current ability limit rather than choosing practice cases randomly. In development tests that found useful cases more often, so task selection became part of the learning design too."}, {"post_id": 50788, "ts": "2026-08-20T05:24:10Z", "hours": 15.7136, "text": "DEVLOG #14 - I made the first real weight change in a test copy Most early SL-LLM-R tests only simulated what a learning update would do. This was the first time I changed actual model parameters with one tiny training step on an isolated copy while the original model stayed untouched. It does not prove self-learning works yet, but the real weight-update path itself did run."}, {"post_id": 50119, "ts": "2026-08-19T06:14:06Z", "hours": 9.7569, "text": "DEVLOG #13 - Context can look like learning when it is not SL-LLM-R needs to separate temporary memory from actual model learning. A model can answer better simply because the correct information is still in its context window, even though its weights never changed. I keep those two kinds of improvement separate so short-term memory does not get reported as permanent learning."}, {"post_id": 49872, "ts": "2026-08-18T20:28:23Z", "hours": 3.6808, "text": "This part of the project was mostly about making the final test harder to fool. I preregistered the analysis, froze the generator and sealer, and sealed the held-out split before looking at any confirmatory outcome. The important result here is a constraint rather than a score: if I can still change the test after seeing results, the result is not trustworthy. The evaluation itself was not run at this point, so this was preparation for evidence, not evidence that SL-LLM-R works. I would rather keep the experiment locked than make the final result easier to obtain."}, {"post_id": 49507, "ts": "2026-08-18T11:50:28Z", "hours": 16.385, "text": "DEVLOG #12 - One mistake should only allow a small change SL-LLM-R should not get permission to change the whole model because of one mistake. I want each repair to affect the smallest useful place, starting with temporary memory when possible and only touching learnable parameters when there is enough reason. A small amount of evidence should only allow a small intervention."}, {"post_id": 48823, "ts": "2026-08-17T11:28:00Z", "hours": 30.2072, "text": "DEVLOG #11 - The model cannot grade its own repair In SL-LLM-R the model can suggest a repair after it makes a mistake. I do not want the same model to also decide whether its own repair was successful, because that could turn into self-approval. The repair is checked separately from the model that proposed it."}, {"post_id": 47448, "ts": "2026-08-15T11:47:09Z", "hours": 16.7272, "text": "DEVLOG #10 - Sometimes the best update is no update SL-LLM-R is meant to learn from verified mistakes, but changing the model after every interesting result would probably teach it a lot of bad lessons. The system needs to be allowed to say there is not enough information and leave the model unchanged. One bad permanent update can be worse than learning nothing from that case."}, {"post_id": 46827, "ts": "2026-08-14T10:58:17Z", "hours": 14.0386, "text": "DEVLOG #09 - A working repair still does not tell me what broke SL-LLM-R can replay a model mistake with a repair and see whether the result gets better. The problem is that a better replay still does not tell me which part of the model caused the mistake. I split those jobs apart so the system first estimates the likely cause and only then decides what small part could be changed."}, {"post_id": 43890, "ts": "2026-08-09T10:33:42Z", "hours": 11.1233, "text": "DEVLOG #08 - I needed an A/B test for model mistakes The main idea in SL-LLM-R is to test a possible repair from the exact state before a model mistake happened. I replay the situation once normally and once with only one repair changed. Comparing those two runs is much more useful than seeing a better answer later and guessing that the repair caused it."}, {"post_id": 43243, "ts": "2026-08-08T12:13:50Z", "hours": 168.2683, "text": "I lost track of posting while I was building the first search loop, so this entry covers more than one session. I tried five simple ways of generating possible fixes under the same fixed budget and gave every candidate a reproducible identity and lineage. The annoying part was budget accounting: duplicates and rejected candidates still consume real search effort, which matters when I compare the method against a baseline. At this point the engine was implemented, but I still did not know whether the extra structure was actually better than random search. The next experiment was to test exactly that instead of assuming the machinery was useful."}, {"post_id": 30607, "ts": "2026-07-18T09:59:26Z", "hours": 21.1706, "text": "DEVLOG #07 - The new benchmark can finally separate methods I rebuilt the SL-LLM-R repair benchmark so it has more tasks that are difficult but still solvable. Different search methods finally started producing different results instead of all looking the same. That does not prove my search is good, but at least the benchmark can now show when one method is worse."}, {"post_id": 30003, "ts": "2026-07-17T07:30:10Z", "hours": 10.4578, "text": "DEVLOG #06 - Different searches kept finding the same repairs SL-LLM-R can try different ways of searching for a repair after a model mistake. I expected those methods to explore different ideas, but many of them kept finding the same repairs. I started tracking duplicates directly because a large attempt budget is not useful if most attempts repeat the same idea."}, {"post_id": 29761, "ts": "2026-07-16T21:03:05Z", "hours": 8.7039, "text": "DEVLOG #05 - My first benchmark could not tell the searches apart I need a benchmark to tell whether SL-LLM-R’s repair search is actually better than simple alternatives. The first one made structured search and random search look almost identical. Most tasks were either very easy or almost impossible, so I threw that benchmark away and rebuilt it with more tasks in the middle."}, {"post_id": 29361, "ts": "2026-07-16T08:21:54Z", "hours": 90.9133, "text": "DEVLOG #04 - The repair search was wasting attempts When SL-LLM-R sees a mistake, it searches for possible repairs to try. My first version kept spending attempts on duplicate fixes and repairs that were not valid in the first place. I changed the budget so every attempt counts, including the useless ones, because otherwise the search would look better than it really is."}, {"post_id": 27120, "ts": "2026-07-12T12:04:47Z", "hours": 15.1889, "text": "DEVLOG #03 - A crash cannot leave the model half changed SL-LLM-R compares a model before and after a possible learning update. If that update crashes halfway through, a half-changed model would make every later result impossible to trust. So each update is all or nothing: the system keeps either the old state or the complete new state."}, {"post_id": 26827, "ts": "2026-07-11T20:54:29Z", "hours": 9.4825, "text": "DEVLOG #02 - What should count as real learning? SL-LLM-R is supposed to make a model learn from mistakes, so I first had to decide what actually counts as learning. A better second answer is not enough. I only count it if the improvement still helps later, does not break other things, and can be undone if the change was bad."}, {"post_id": 26272, "ts": "2026-07-10T23:33:38Z", "hours": 56.8225, "text": "DEVLOG #1 - Why I Started SL-LLM-R Project: SL-LLM-R Introduction I originally just wanted a project for the summer. I had a few ideas, but most already existed or sounded like something I would abandon after a few days. Then I started thinking about AI. I use AI a lot for coding. It can understand large projects and solve difficult problems, but it can also repeat the same simple mistake several times. Even when it notices that something failed, it usually does not actually learn from it. The context becomes longer, but the model itself stays almost the same. Current models are trained on human-created data and updated through processes designed by humans. They can generate answers, but they normally cannot decide what to learn next, which decision caused a failure, or whether a change would damage another capability. So I started thinking about a system that could learn from its own verified experiences. That became SL-LLM-R. The Idea The core mechanism is called VGCP: Verifier-Grounded Counterfactual Plasticity. The simplified process is: Save the state before a decision. Let the model act. Check the result with an external verifier. Generate possible repairs. Replay the same situation with and without each repair. Compare the outcomes. Keep only changes supported by evidence. In simplified form: Δ = E[Y(change) - Y(original)] If the repaired version performs better across controlled tests, the change may be useful. If the evidence is weak, the system should not update. The goal is controlled, local, reversible, and verifiable learning. The PDF I first planned to write a short document. That did not go as planned. Every answer created more questions: How do I save the exact state? How do I compare runs fairly? How do I prevent leakage, forgetting, broken rollbacks, or the system approving its own changes? The document became the SL-LLM-R V1.2.2 specification. It is now 135 pages long and contains the architecture, mathematics, safety rules, algorithms, experiments, and failure conditions. The PDF does not prove that the system works. It defines what I need to build and what would count as failure. Completed Changes Defined the project idea. Created the VGCP concept. Wrote the V1.2.2 specification. Started the initial implementation. Next Steps Continue the deterministic foundation. Implement snapshots and rollback. Build the proposal system. Compare it against simple baselines. Summary I started with a few random project ideas, got annoyed by how intelligent and stupid AI can be at the same time, and ended up designing a system that should learn from verified mistakes. It might become something important. It might also be another stupid idea that takes over my entire summer holiday. Right now, I do not know. That is why I am building it. Summary (AI) SL-LLM-R is a pre-experimental project about controlled, verifier-grounded continual learning. No validated self-improvement result is currently claimed. Note I spent way too long writing this devlog and the PDF. I also started coding parts of the project, and it was… different from what I expected. More soon."}]...
|
Title: SL-LLM-R: Can an AI learn from its own veri Title: SL-LLM-R: Can an AI learn from its own verified mistakes? by @Samuelm | Stardance
Devlogs:
DEVLOG #1 - Why I Started SL-LLM-R Project: SL-LLM-R Introduction I originally just wanted a project for the summer. I had a few ideas, but most already existed or sounded like something I would abandon after a few days. Then I started thinking about AI. I use AI a lot for coding. It can understand large projects and solve difficult problems, but it can also repeat the same simple mistake several times. Even when it notices that something failed, it usually does not actually learn from it. The context becomes longer, but the model itself stays almost the same. Current models are trained on human-created data and updated through processes designed by humans. They can generate answers, but they normally cannot decide what to learn next, which decision caused a failure, or whether a change would damage another capability. So I started thinking about a system that could learn from its own verified experiences. That became SL-LLM-R. The Idea The core mechanism is called VGCP: Verifier-Grounded Counterfactual Plasticity. The simplified process is: Save the state before a decision. Let the model act. Check the result with an external verifier. Generate possible repairs. Replay the same situation with and without each repair. Compare the outcomes. Keep only changes supported by evidence. In simplified form: Δ = E[Y(change) - Y(original)] If the repaired version performs better across controlled tests, the change may be useful. If the evidence is weak, the system should not update. The goal is controlled, local, reversible, and verifiable learning. The PDF I first planned to write a short document. That did not go as planned. Every answer created more questions: How do I save the exact state? How do I compare runs fairly? How do I prevent leakage, forgetting, broken rollbacks, or the system approving its own changes? The document became the SL-LLM-R V1.2.2 specification. It is now 135 pages long and contains the architecture, mathematics, safety rules, algorithms, experiments, and failure conditions. The PDF does not prove that the system works. It defines what I need to build and what would count as failure. Completed Changes Defined the project idea. Created the VGCP concept. Wrote the V1.2.2 specification. Started the initial implementation. Next Steps Continue the deterministic foundation. Implement snapshots and rollback. Build the proposal system. Compare it against simple baselines. Summary I started with a few random project ideas, got annoyed by how intelligent and stupid AI can be at the same time, and ended up designing a system that should learn from verified mistakes. It might become something important. It might also be another stupid idea that takes over my entire summer holiday. Right now, I do not know. That is why I am building it. Summary (AI) SL-LLM-R is a pre-experimental project about controlled, verifier-grounded continual learning. No validated self-improvement result is currently claimed. Note I spent way too long writing this devlog and the PDF. I also started coding parts of the project, and it was… different from what I expected. More soon.
DEVLOG #02 - What should count as real learning? SL-LLM-R is supposed to make a model learn from mistakes, so I first had to decide what actually counts as learning. A better second answer is not enough. I only count it if the improvement still helps later, does not break other things, and can be undone if the change was bad.
DEVLOG #03 - A crash cannot leave the model half changed SL-LLM-R compares a model before and after a possible learning update. If that update crashes halfway through, a half-changed model would make every later result impossible to trust. So each update is all or nothing: the system keeps either the old state or the complete new state.
DEVLOG #04 - The repair search was wasting attempts When SL-LLM-R sees a mistake, it searches for possible repairs to try. My first version kept spending attempts on duplicate fixes and repairs that were not valid in the first place. I changed the budget so every attempt counts, including the useless ones, because otherwise the search would look better than it really is.
DEVLOG #05 - My first benchmark could not tell the searches apart I need a benchmark to tell whether SL-LLM-R’s repair search is actually better than simple alternatives. The first one made structured search and random search look almost identical. Most tasks were either very easy or almost impossible, so I threw that benchmark away and rebuilt it with more tasks in the middle.
DEVLOG #06 - Different searches kept finding the same repairs SL-LLM-R can try different ways of searching for a repair after a model mistake. I expected those methods to explore different ideas, but many of them kept finding the same repairs. I started tracking duplicates directly because a large attempt budget is not useful if most attempts repeat the same idea.
DEVLOG #07 - The new benchmark can finally separate methods I rebuilt the SL-LLM-R repair benchmark so it has more tasks that are difficult but still solvable. Different search methods finally started producing different results instead of all looking the same. That does not prove my search is good, but at least the benchmark can now show when one method is worse.
I lost track of posting while I was building the first search loop, so this entry covers more than one session. I tried five simple ways of generating possible fixes under the same fixed budget and gave every candidate a reproducible identity and lineage. The annoying part was budget accounting: duplicates and rejected candidates still consume real search effort, which matters when I compare the method against a baseline. At this point the engine was implemented, but I still did not know whether the extra structure was actually better than random search. The next experiment was to test exactly that instead of assuming the machinery was useful.
DEVLOG #08 - I needed an A/B test for model mistakes The main idea in SL-LLM-R is to test a possible repair from the exact state before a model mistake happened. I replay the situation once normally and once with only one repair changed. Comparing those two runs is much more useful than seeing a better answer later and guessing that the repair caused it.
DEVLOG #09 - A working repair still does not tell me what broke SL-LLM-R can replay a model mistake with a repair and see whether the result gets better. The problem is that a better replay still does not tell me which part of the model caused the mistake. I split those jobs apart so the system first estimates the likely cause and only then decides what small part could be changed.
DEVLOG #10 - Sometimes the best update is no update SL-LLM-R is meant to learn from verified mistakes, but changing the model after every interesting result would probably teach it a lot of bad lessons. The system needs to be allowed to say there is not enough information and leave the model unchanged. One bad permanent update can be worse than learning nothing from that case.
DEVLOG #11 - The model cannot grade its own repair In SL-LLM-R the model can suggest a repair after it makes a mistake. I do not want the same model to also decide whether its own repair was successful, because that could turn into self-approval. The repair is checked separately from the model that proposed it.
DEVLOG #12 - One mistake should only allow a small change SL-LLM-R should not get permission to change the whole model because of one mistake. I want each repair to affect the smallest useful place, starting with temporary memory when possible and only touching learnable parameters when there is enough reason. A small amount of evidence should only allow a small intervention.
This part of the project was mostly about making the final test harder to fool. I preregistered the analysis, froze the generator and sealer, and sealed the held-out split before looking at any confirmatory outcome. The important result here is a constraint rather than a score: if I can still change the test after seeing results, the result is not trustworthy. The evaluation itself was not run at this point, so this was preparation for evidence, not evidence that SL-LLM-R works. I would rather keep the experiment locked than make the final result easier to obtain.
DEVLOG #13 - Context can look like learning when it is not SL-LLM-R needs to separate temporary memory from actual model learning. A model can answer better simply because the correct information is still in its context window, even though its weights never changed. I keep those two kinds of improvement separate so short-term memory does not get reported as permanent learning.
DEVLOG #14 - I made the first real weight change in a test copy Most early SL-LLM-R tests only simulated what a learning update would do. This was the first time I changed actual model parameters with one tiny training step on an isolated copy while the original model stayed untouched. It does not prove self-learning works yet, but the real weight-update path itself did run.
DEVLOG #15 - Which experiences should the model learn from? SL-LLM-R eventually needs to choose which experiences are worth using for learning instead of treating every case equally. I tested selecting problems near the model’s current ability limit rather than choosing practice cases randomly. In development tests that found useful cases more often, so task selection became part of the learning design too.
DEVLOG #16 - I wanted rollback before trusting any update SL-LLM-R should be able to undo a model change if the new version turns out worse. Every update starts from a saved parent model and happens in a temporary child copy. If the child fails the checks, it can be deleted and the original parent stays untouched.
DEVLOG #17 - A changed model has to beat the unchanged one SL-LLM-R creates a temporary child model when it tests a learning update. The child is not kept just because it is newer. It has to perform better than the unchanged parent under the same checks, otherwise the update is discarded.
DEVLOG #18 - Fixing one mistake can break something else SL-LLM-R cannot judge a learning update only on the mistake it was meant to fix. A model can improve on that one case and quietly get worse at older abilities. I therefore check for forgetting too, so an update is rejected if the local gain hides a larger loss elsewhere.
DEVLOG #19 - New lessons can overwrite old ones A continual-learning system like SL-LLM-R can forget older knowledge if it trains only on the newest mistake. I use replay, which means mixing some older verified examples back in while a new lesson is learned. The goal is to make new learning fit alongside old knowledge instead of pushing it out.
DEVLOG #20 - Memory can change fast, weights should change slowly SL-LLM-R uses two different kinds of adaptation. Temporary memory can change quickly because it can be thrown away, while real model weights should change much more slowly and only after stronger checks. This keeps a random observation from becoming permanent too easily.
DEVLOG #21 - The learning controller mostly blocks updates SL-LLM-R has a controller that decides whether a possible model update is safe enough to try or keep. I originally imagined it mostly choosing how to learn, but most of its job is actually refusing weak updates. If the signal is weak, the change is too large, or forgetting risk is too high, the model stays unchanged.
DEVLOG #22 - More attempts can make a weak search look better I compare SL-LLM-R’s repair search against simpler search methods. If one method gets more attempts or more compute, it can look better just because it had more chances to get lucky. I now keep the search budget equal across methods so the comparison is about the method rather than the amount of compute.
DEVLOG #23 - Random search was harder to beat than I expected SL-LLM-R uses a structured search to find possible repairs after model mistakes, and I compare it against random repair ideas. I expected random search to be an easy baseline to beat, but it was surprisingly competitive under the same budget. The structured search still has to prove that its extra complexity is actually worth using.
DEVLOG #24 - I had to keep the final test separate I need to improve SL-LLM-R without slowly tuning it to the exact tasks used to judge it at the end. If I keep looking at those final tasks while changing the repair search, I can accidentally learn the test itself. Development tasks and final test tasks therefore stay separate.
DEVLOG #25 - I need to know what caused a mistake before changing weights SL-LLM-R is supposed to learn from a model mistake without changing more of the model than necessary. A single bad result only tells me that something went wrong, not what caused it. The system first needs a likely cause before it can choose a small place where a repair might make sense.
DEVLOG #26 - Every model change needs a history If SL-LLM-R keeps a model update, I want to be able to trace exactly why that change exists later. Each kept update should point back to the original mistake, the proposed repair, the parent model, and the checks that approved it. Otherwise a future model problem could turn into a mystery with no clear way to undo the right change.
DEVLOG #27 - Failed repairs still tell me something SL-LLM-R generates repair ideas after model mistakes, and many of those ideas get rejected. I started keeping track of why they fail instead of treating every rejected repair as the same kind of failure. Duplicates, impossible repairs, multi-step repairs, and bad ideas reveal different weaknesses in the search even when the model learns nothing from them.
DEVLOG #28 - Loading a model should not enable training SL-LLM-R needs access to a real base model before I can run realistic experiments. I made that access read-only so loading and checking the model does not automatically give the system permission to change its weights. Training can stay completely off while I verify exactly which model and data the project is using.
DEVLOG #29 - The cause finder is allowed to say it does not know Before SL-LLM-R changes a model, it tries to estimate what caused the original failure. I tested that part on simple cases where the cause was already known, especially to see what happens when the signal becomes weak. It can stop instead of inventing a confident answer, which is the behavior I want before any model update depends on that guess.
DEVLOG #30 - I can now undo a model update through the full practice loop SL-LLM-R needs a complete way to undo a model change before real learning updates can be trusted. I can now save the original model, make a changed copy, test it, switch to it, and return to the original in one practice run. I have not yet used that path to undo a genuinely learned LLM update, so the mechanism works but the real learning case is still untested.
DEVLOG #31 - A real base model is now part of the setup SL-LLM-R started with placeholder model inputs while I built the safety and comparison logic around them. I replaced that placeholder with a real open model that the system can identify and verify exactly. Training is still off, but future experiments can now start from a real model rather than a fake name.
DEVLOG #32 - The first real update has one clear path I wanted the first real SL-LLM-R model update to follow one understandable sequence. The system loads a parent model, copies it, changes only the child, tests the parent and child, then either keeps the child or deletes it. Training is still disabled, but the update path itself is now connected instead of being spread across separate pieces.
DEVLOG #33 - Brain wiring gave me one idea to test I looked at connectomics, which is research on how brain cells are connected, because SL-LLM-R needs a way to keep model changes local. One idea is that connection structure might help choose which parts are safe to change together. It is only inspiration for an experiment, not a claim that transformers work like brains.
DEVLOG #34 - Replay and consolidation fit the project together I realized two ideas from continual-learning research fit SL-LLM-R quite well. Replay means keeping older knowledge present while learning something new, while consolidation is about deciding which new experiences deserve to last longer. Together they match the goal of turning some verified experiences into lessons without making every observation permanent.
DEVLOG #35 - A better retry is still not model learning SL-LLM-R is meant to change future model behavior, not just get a better answer on the second attempt. Many AI systems can retry with more context and look like they learned even when the model itself stayed the same. I only care about a correction as learning if it affects later behavior, does not break other abilities, and can still be undone.
DEVLOG #36 - The learning loop is connected, but training is still off The main SL-LLM-R learning path is now connected. It starts with the original model, makes a temporary changed copy, checks whether the change helped and whether older abilities got worse, then either keeps the copy or throws it away. Real training is still disabled, so this is not yet a finished self-learning model.
DEVLOG #37 - All 1,530 comparison runs crashed I ran a large SL-LLM-R comparison to measure the repair search, but all 1,530 runs crashed before producing a useful score. That means the run tells me nothing about whether the repair method was good or bad. The test setup failed, so I kept the result as a failed experiment instead of treating the crashes as model evidence.
DEVLOG #38 - The retry produced 1,530 completed results After the first SL-LLM-R comparison crashed, I fixed only the problems that prevented the test from running and repeated the same comparison. This time all 1,530 runs completed and produced scores. I could finally inspect failures in the repair search itself instead of only debugging the test setup.
DEVLOG #39 - The repair-search failures are finally visible With a completed comparison, I can now inspect why SL-LLM-R’s repair search misses targets. Some misses come from repeated ideas, some repairs need more steps, and some targets are never reached by the current search. Separating those cases is more useful than treating every miss as one generic failure.
DEVLOG #40 - What happens if the model runs out of room? SL-LLM-R is meant to keep learning over time, which creates a long-term problem if a fixed-size model eventually runs out of useful capacity. My current idea is a stable core, fast memory, small learnable parts, and possibly extra specialist modules only when the existing capacity is not enough. The project cannot do that yet, so this is still future research.
DEVLOG #41 - If the model grows, the extra capacity has to help I do not want SL-LLM-R to add parameters just because a larger model sounds better. If the system ever needs more capacity, my current idea is to add a small module in a copy and test whether that addition actually improves the model. If it does not help, the extra module should be deleted just like any other failed update.
DEVLOG #42 - The first real learning run is still blocked The repaired SL-LLM-R comparison produced 1,530 completed results, but I still did not understand the repair-search failures well enough to start changing real model weights. Training therefore stayed off while I investigated why targets were being missed. I would rather delay the first learning update than call an unclear result progress.
DEVLOG #43 - I built one failure where I already knew the cause SL-LLM-R’s repair search was missing many fixes that I expected it to find, but I did not know why. I built one small synthetic failure where the component reading the source signal gets the wrong input, so I can reproduce that miss on purpose. At least one failure now has a known cause, which I can compare with the unexplained failures without assuming they are all the same problem.
DEVLOG #44 - I can explain 306 misses, but 1,224 still look the same I am trying to understand why SL-LLM-R’s repair search fails to find fixes that should exist. Right now I can explain 306 misses, while another 1,224 look identical in every field I am allowed to compare. Two different explanations for the source-signal problem also match the same 306 cases, so the available data still cannot separate those explanations for the larger group.
DEVLOG #45 - Fixing one broken link still gave zero hits When SL-LLM-R fails to find a repair that I know should be reachable, I need to know whether the search is bad or the test case is broken. One case had a broken link between the original proposal and the repair I expected the search to find, so I fixed only that link and ran the case again with the same number of attempts. The search still found the target zero times, so that broken link was not the whole problem.
DEVLOG #46 - Some repair scores could not be trusted Every possible repair SL-LLM-R produces should be linked back to the original proposal it came from so the search can be scored correctly. I found cases where that link was ambiguous, which can make the score describe the wrong search. I changed the scoring path so ambiguous pairs are rejected instead of guessed, and the earlier zero-hit result stays zero.
Ships:
Most LLMs can recognize that they made a mistake, but they usually don’t actually learn from it. I’m building SL-LLM-R to explore whether that can be changed. The idea is to let a pretrained model learn from its own verified experience. When something goes wrong, the system saves where the decision came from, tries alternative decisions from the same state and checks what actually changes the outcome. If a possible improvement is supported by enough evidence, it can eventually be turned into a small, controlled update. If it makes things worse, the system must be able to reject it or roll it back. The research mechanism behind this is called Verifier-Grounded Counterfactual Plasticity, or VGCP. What matters to me is that the project does not just produce results that look good. The experiments are designed around reproducibility, fixed evaluation rules, independent verification, held-out tests and preserving failed experiments instead of quietly replacing them. The deterministic foundation is working and verified. The proposal system is implemented and tested, and the latest development benchmark was able to distinguish between different proposal strategies. The confirmatory experiment has now been preregistered and sealed. It has not been run yet. So I am not claiming that SL-LLM-R has solved continual learning or that it can already improve itself. That is exactly what the next experiments are meant to test. I have published the research, architecture, mathematics, experiment history, negative results and current evidence at: research.samuelm.de...
|
1792875253.8490605
|
1793739253.8490605
|