|
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
|
|
135
|
blahajnite by @lukas | Stardance
|
lukas
|
0
|
1.77
|
0
|
[]
|
[{"post_id": 53667, "ts": "202 [{"post_id": 53667, "ts": "2026-08-24T10:33:21Z", "hours": 1.7711, "text": "Made the base of everything its just a simple third person character with spring arms so you dont clip thru walls and the character is already slighly in the side its just really simple"}]...
|
Title: blahajnite by @lukas | Stardance
Devlogs:
Title: blahajnite by @lukas | Stardance
Devlogs:
Made the base of everything its just a simple third person character with spring arms so you dont clip thru walls and the character is already slighly in the side its just really simple...
|
1792644697.2112076
|
1793249497.2112076
|
|
134
|
Untitled project by @Blackout180 | Stardance
|
Blackout180
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Blackout180 | Stardanc Title: Untitled project by @Blackout180 | Stardance...
|
1792759875.984653
|
1793364675.984653
|
|
133
|
3D engine for the ds by @soukie | Stardance
|
soukie
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: 3D engine for the ds by @soukie | Stardance
|
1792792240.3939905
|
1793397040.3939905
|
|
132
|
GLaDOS by @Ruben | Stardance
|
Ruben
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: GLaDOS by @Ruben | Stardance
|
1792568869.041064
|
1793173669.041064
|
|
131
|
WasFlash - A Flashplayer Implimentation in C++/Web WasFlash - A Flashplayer Implimentation in C++/Web by @Silverhoft | Stardance...
|
Silverhoft
|
0
|
61.13
|
0
|
[]
|
[{"post_id": 80252, "ts": "202 [{"post_id": 80252, "ts": "2026-10-16T22:41:11Z", "hours": 9.8989, "text": "WasFlash Devlog # 11.5 Alpha 3.1- Pre Release 4.5 Progress Update: ~ Sprite Parsing and preprocessing done for rendering functionality ~ Currently working on the implementation and actual rendering now… Notes: This serves as a midway point in a more extensive development stage - A real devlog will be posted soon, at a better stopping point."}, {"post_id": 76182, "ts": "2026-10-02T16:45:00Z", "hours": 6.0339, "text": "WasFlash Devlog # 11 Alpha 3.1- Pre Release 4 What I worked on today: ~ Started Work on sprite implementation. Notes: Hello everyone, it’s been quite a while, sorry about that. I am currently working on implementing sprites; it’s a lot of work and more difficult than anything else I’ve done for this project. I’m not sure if they will be done by the end of this, so I plan to ship this now, and possibly release another ship if I can finish it. I am very busy with my school’s performance of Les Mis; that is why this is a bit sparse. I appreciate your patience and hopefully we will have fully working sprites by the end of october. Agenda: - Work on sprite implimentation Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 36721, "ts": "2026-07-28T23:21:34Z", "hours": 1.88, "text": "WasFlash Devlog # 11 Alpha 3.1- Pre Release 3 What I worked on today: ~ DefineBitsLossless2 32Bit + 8Bit ARGB Support ~ Implimented Actual Alpha Pixel Rasterization Notes: Hello friends! I finally finished implementing Bitmaps, and I am very excited to port to WASM, and release the bitmaps release. I am planning on working on fonts and text next, and doing whatever else sprites will require. After which I will work on sprite animation, and a far more polished UI, as well as an official linux release. I have decided to name the first official release(And ship), Alpha 4.0 Anim. I feel that this represents the fact that adding sprites will make this a fully funtional flash animation player. After this, I plan to finish tag support, and try to work on some simple ActionScript, to get buttons and other simple functions working. And the end goal would involve a fully functional ActionScript Engine, and a fully implimented Flash Player replacement. Anyways, I hope you all have a good day, see you all next time! Agenda: - Impliment DefineBitsLossless2 Whats Next: - Create actual autobuild script for both WASM and Native Linux - Font Support + Other small sprite prerequisites - Sprite Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More Note: Image with brighter colors is 8Bit, and the one with the more nuanced colors is 32Bit"}, {"post_id": 34999, "ts": "2026-07-26T04:38:40Z", "hours": 9.8161, "text": "WasFlash Devlog # 10 Alpha 3.1- Pre Release 2 What I worked on today: - Implimented the following: ~ DefineBits2 + Corresponding Bug testing Files ~ DefineBits 3+4 + Corresponding Bug testing Files ~ DefineBitsLossless + Corresponding Bug testing Files, and custom image assemblers for speed. ~ Changed Zlib to Wuffs for much faster decomp times. Notes: Hello Friends, it’s been a while, and I really try to avoid 10 hour devlogs, but I really wanted a good real world testable result for bitmaps before I made one. The main reason being that next on the list is sprites, which will complete the animation stage of this project. Leading us to Alpha 4.0. Now I wanted to take the time to name each coming stage, as each one will be long, yet monumental. I am nearly done with bitmaps, and soon enough, I will be working on the grueling task of implementing the sprites. I think so far the most difficult task was shapes, because it required a very deep understanding of the SWF shape system, but sprites might be a close second. I really appreciate you guys’ support, even though there aren’t too many of you. I love this project, and I am so happy I get to express it here. Agenda: - Impliment DefineBitsLossless2 Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - In Progress - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 11762, "ts": "2026-06-19T04:34:27Z", "hours": 6.3311, "text": "WasFlash Devlog # 9 Alpha 3.1- Pre Release 1 What I worked on today: - Implimented DefineBits - Parsing and rendering ~ Updated Dependency Script to include libJPEGTurbo ~ Created 2 test SWF files using jpexs ~ Fixed major shape disappearing issue Notes: Hello Friends! I spent quite a bit of time on this, both parsing and processing bitmaps. So far we only have one working bitmap parser of 6, and that is the most bare bones one. There are some weird errors that can occur with the JPEG headers, but it is impossible to find SWF files with DefineBits, so I made my own, one without the error, and one with it. It currently works for both, which is great, and I am excited to see where I can take this project. I am so close to being ready for Sprite support. I just need to keep pushing through these tags. Thank you to anyone who’s been keeping up with this, for others, feel free to follow if you think this is cool. See you guys next time! Agenda: - Implement the other 5 DefineBits Types - Get EMScripten libJPEGTurbo Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - In Progress - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 9165, "ts": "2026-06-15T11:00:10Z", "hours": 0.8281, "text": "WasFlash Devlog # 8 Alpha 3.0 What I accomplished today: - MAJOR UPDATE! – NEW RELEASE – MAJOR UPDATE! - Fixed Morph Shape issues - Fixed wrong MorphShape Order - Fixed the Matrix Signing Error - This has been causing the shape warping - Optimized Rendering Packets - Updated Web Implementation Notes: Hello friends, My most recent Devlog may have reflected some distress, but I finally figured it out! The weird warping of shapes was caused by a bug in a script I wrote about 5 months ago, that I thought was solid. There was a signing error, so all numbers ended up unproportionately large if they were negative, because the first bit was being counted towards the value. With a quick change of 2 lines, it completely changed the look of animations. As for the color bug with morph shapes, there is no bug at all, in fact the morph shapes typically are used as templates for sprites. So if you see any odd colored shapes, that’s why :D. Lastly, for some reason morph shapes are interpolated in reverse when using Skia, so I simply reversed the inputs, and the morph shapes are working as intended. The final thing was updating the main tag processor to send render instructions in batches, not one at a time, as to reduce overhead. This is a tough project, and I have poured my soul into it, if you think it’s cool, please feel free to follow it! Anyways, see you guys next time! Whats Next: - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 9093, "ts": "2026-06-15T06:09:44Z", "hours": 6.4083, "text": "WasFlash Devlog # 7 Alpha 3.0 - Pre Release 3 What I worked on today: - Implimented DefineMorphShape’s - Still not fully working ~ Implemented MorphFillStyle Translator ~ Implemented MorphLineStyle Translator - 1 and 2 ~ Implemented MorphGradient Translator ~ Implemented DefineMorphShape to Shape Builder * ~ Fixed parsers to work with builders Notes: Hello friends, I did a lot of work in this long extended session! I decided that it would make sense to just convert the morph variants to the normal variants, and use my current framework to just build 2 shapes, and interpolate them. There were a lot of issues, because there are some odd SWF bugs that happen sometimes, and I thought they were my own errors, so I spent like 2 hours trying to get things working, and I just ended up putting in some fall back code, and got things working, but now there are some weird color bugs, so I need to work those out, but overall it seems to be working ok. It’s been a rough week, so I hope it gets a little easier(It’s not gonna be with sprites, but it is what it is). Anyways, thank you guys for following along, for anyone else coming across this, feel free to like this comment, and follow the project if you think it’s cool. See you guys next time! Agenda: - Fix odd color issues with morph shapes - Clean up parsing output - Update the website to use new update Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 6741, "ts": "2026-06-11T09:07:58Z", "hours": 5.9478, "text": "WasFlash Devlog # 6 Alpha 3.0 - Pre Release 2 What I worked on today: - Implemented Full DefineMorphShape Parsing - Currently not fully working ~ Implemented MorphFillStyle Parsing ~ Implemented MorphLineStyle Parsing - 1 and 2 ~ Implemented MorphGradient Parsing ~ Implemented SHAPE Struct Parsing ~ Implemented DefineMorphShape Parsing ~ Implemented DefineMorphShape2 Parsing Notes: Hello friends, as you can see, this Devlog is pretty long. This took around twice as long as ordinary Shape Styles, seen in DefineShape tags. This is because each DefineMorphShape tag contains a pair of each type of data for interpolation, rather than one set. For the most part this was just pretty tedious low level Bitmath operations, and a lot of nested structures. It wasn’t too bad, because I had a good reference from the original DefineShape structures, and just general experience, but yes, it was very tedious, and likely the least fun part of this process. Hopefully my next Devlog has a better timeframe, and parsing is working! Thank you all for stopping by, as always, please feel free to leave a comment with any questions you might have, or just feedback in general, as well as following and liking this post! See you all later! Agenda: - Get Parsing to a Functional State - Create a processor for Morph Shapes - Add rendering case for Morph Shapes Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 4777, "ts": "2026-06-08T08:29:50Z", "hours": 2.455, "text": "WasFlash Devlog # 5 Alpha 3.0 - Pre Release 1 What I worked on today: - Started Development Of DefineMorphShape tags ~ Created new SHAPE base structure ~ Set up all required structures for DefineMorphShape ~ Added DefineMorphShape to tags.h Notes: Hello friends, you may have noticed a different version type, “Pre Release”. This is simply an indication that this is not an official change, and is not implemented into the project. Pre Release Devlogs should tend to reflect 1-2 big changes, with a large majority of the content nested inside, as shown above. This Devlog serves to both announce the beginning of Morph Shape Development, and represent what to expect from Pre Releases. As a quick note to the fact that Morph Shapes were not even on the To Do list, I recently discovered that Morph Shapes were just as important as Sprites, when properly rendering animations. Anyways, though this one was short, thank you for stopping by, and feel free to check out my project, follow it, and like this post if you think it’s cool! See you all next time! Agenda: - Work on parsing for Morph Shapes - Create a processor for Morph Shapes - Add rendering case for Morph Shapes Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 2111, "ts": "2026-06-04T13:16:26Z", "hours": 1.9697, "text": "WasFlash Devlog # 4 Alpha 2.2.1 What I accomplished today: - Added even more optimizations to the shape processing - Implemented DefineShape4 support - Pushed Updates to Web - Updated Skia Git Clone - To prevent the deadly stack trace issue Notes: Hello friends, this session was very exciting! I was able to get DefineShape4 Shapes to render properly, and although it was a pain it looks really good! I had to kinda rework the processor a little bit, because DefineShape4 adds a few flags, but I already added LineStyles2 support, so it implemented well. I also got rid of the redundant line/fill storage, which was a small optimization, but still mostly noticeable. To end off the session, I changed the Skia commit hash, so we won’t need to deal with outdated headers. Whats Next: - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 1022, "ts": "2026-06-02T20:18:24Z", "hours": 1.4325, "text": "WasFlash Devlog # 3 Alpha 2.1.4 What I accomplished today: - Fixed scaling of canvas on website - Added anti-aliasing to smooth out animations on both web and native builds - Pushed web compiler flags to main build - Made Cinnamon Rolls Notes: Hello friends! I spent a lot of time trying to figure this one out, many hours were spent debugging this session. Originally the website was just plugging the file into the WASM binary, and re-scaling to output to make the output match the canvas size, but this would cause blurriness and distorted quality. The good thing about this is, because we actually have to build each shape, we can just tell Skia to draw the shapes bigger, so the scaling still produces a native shape, just with different dimensions. So I had to rework the way the scaling worked. I also added back anti-aliasing, because the optimizations worked so well, that we can run anti-aliased’ output at full speed! There wasn’t too much going on this time around. but it really made a big difference! Thank you all for being here, I really appreciate it! Please feel free to leave a comment, with any questions or feedback, and like this post if you think it’s cool, and follow the project, if you think it’s cool! Have a good day everyone! PS. The cinnamon rolls were yummy! Whats Next: - Adding DefineShape4 support + Port DefineShape4 to WebAssembly - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 400, "ts": "2026-06-01T19:45:39Z", "hours": 2.1522, "text": "WasFlash Devlog # 2 Alpha 2.1.3 What I accomplished today: - Added major optimizations to WebAssembly compilation - Revamped WasFlash official color scheme - Using the Catppuccin color scheme - Fixed some bugs with buttons + Added functionality to a few buttons - Updated logo with new color scheme Notes: Hello friends! I made some big differences to the look of the website, with a new logo, completely different color palette, and the general feel of the website. My original idea for WasFlash was a kind of cyberpunk theme, I spent countless hours adding little glowing effects, and these moving gradients, but I couldn’t shake the awkward feeling of it all. A flash emulator is old software, but it is by no means is it retro. I decided it was time to finally change it up, and I am so happy I did, because the website feels much cleaner, and well implemented. While pink and blue are my favorite gradient palette, cyan and green are a close second, and worked perfectly for this. Overall the website is much nicer on the eyes, and generally better to use! Finally I updated the popup to mention Stardance instead of Flavortown. Thank you for joining me today! Please feel free to leave a comment with what you think below, and like the project if you think it’s cool! Anyways, that’s all from me today, see you guys around! Whats Next: - Adding DefineShape4 support + Port DefineShape4 to WebAssembly - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More Images"}, {"post_id": 191, "ts": "2026-06-01T07:02:35Z", "hours": 5.6261, "text": "WasFlash Devlog # 1 What I accomplished today: Debugging deadly stack trace error - Ended up being outdated headers from Skia Updating Skia headers to modern version Re-Added gradient shape fill support Added heavy optimizations for all locally built dependencies, for native Linux builds - Removes latency entirely Cleaned up loose files Notes: Hello friends, today was a little bit of a drag, given the fact that I just could not figure out what was causing this nonstop stack trace. I finally looked into Skia, and realized my headers were out of date with the actual program, so I had to update those, ultimately fixing the program entirely. I also took some time to add optimization, so much so, that there is now zero latency in both audible, and visual playback. Overall, this was a productive session, even though it took ages. Whats Next: Porting current version to WebAssembly - With similar optimizations Adding DefineShape4 support + Port DefineShape4 to WebAssembly Update Wasflash Website with new Catppuccin color palette Create actual autobuild script for both WASM and Native Linux - Some time in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 7, "ts": "2026-05-31T07:11:48Z", "hours": 0.3519, "text": "WasFlash has Officially Re-Started Development!"}]...
|
Title: WasFlash - A Flashplayer Implimentation in Title: WasFlash - A Flashplayer Implimentation in C++/Web by @Silverhoft | Stardance
Devlogs:
WasFlash has Officially Re-Started Development!
WasFlash Devlog # 1 What I accomplished today: Debugging deadly stack trace error - Ended up being outdated headers from Skia Updating Skia headers to modern version Re-Added gradient shape fill support Added heavy optimizations for all locally built dependencies, for native Linux builds - Removes latency entirely Cleaned up loose files Notes: Hello friends, today was a little bit of a drag, given the fact that I just could not figure out what was causing this nonstop stack trace. I finally looked into Skia, and realized my headers were out of date with the actual program, so I had to update those, ultimately fixing the program entirely. I also took some time to add optimization, so much so, that there is now zero latency in both audible, and visual playback. Overall, this was a productive session, even though it took ages. Whats Next: Porting current version to WebAssembly - With similar optimizations Adding DefineShape4 support + Port DefineShape4 to WebAssembly Update Wasflash Website with new Catppuccin color palette Create actual autobuild script for both WASM and Native Linux - Some time in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 2 Alpha 2.1.3 What I accomplished today: - Added major optimizations to WebAssembly compilation - Revamped WasFlash official color scheme - Using the Catppuccin color scheme - Fixed some bugs with buttons + Added functionality to a few buttons - Updated logo with new color scheme Notes: Hello friends! I made some big differences to the look of the website, with a new logo, completely different color palette, and the general feel of the website. My original idea for WasFlash was a kind of cyberpunk theme, I spent countless hours adding little glowing effects, and these moving gradients, but I couldn’t shake the awkward feeling of it all. A flash emulator is old software, but it is by no means is it retro. I decided it was time to finally change it up, and I am so happy I did, because the website feels much cleaner, and well implemented. While pink and blue are my favorite gradient palette, cyan and green are a close second, and worked perfectly for this. Overall the website is much nicer on the eyes, and generally better to use! Finally I updated the popup to mention Stardance instead of Flavortown. Thank you for joining me today! Please feel free to leave a comment with what you think below, and like the project if you think it’s cool! Anyways, that’s all from me today, see you guys around! Whats Next: - Adding DefineShape4 support + Port DefineShape4 to WebAssembly - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More Images
WasFlash Devlog # 3 Alpha 2.1.4 What I accomplished today: - Fixed scaling of canvas on website - Added anti-aliasing to smooth out animations on both web and native builds - Pushed web compiler flags to main build - Made Cinnamon Rolls Notes: Hello friends! I spent a lot of time trying to figure this one out, many hours were spent debugging this session. Originally the website was just plugging the file into the WASM binary, and re-scaling to output to make the output match the canvas size, but this would cause blurriness and distorted quality. The good thing about this is, because we actually have to build each shape, we can just tell Skia to draw the shapes bigger, so the scaling still produces a native shape, just with different dimensions. So I had to rework the way the scaling worked. I also added back anti-aliasing, because the optimizations worked so well, that we can run anti-aliased’ output at full speed! There wasn’t too much going on this time around. but it really made a big difference! Thank you all for being here, I really appreciate it! Please feel free to leave a comment, with any questions or feedback, and like this post if you think it’s cool, and follow the project, if you think it’s cool! Have a good day everyone! PS. The cinnamon rolls were yummy! Whats Next: - Adding DefineShape4 support + Port DefineShape4 to WebAssembly - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 4 Alpha 2.2.1 What I accomplished today: - Added even more optimizations to the shape processing - Implemented DefineShape4 support - Pushed Updates to Web - Updated Skia Git Clone - To prevent the deadly stack trace issue Notes: Hello friends, this session was very exciting! I was able to get DefineShape4 Shapes to render properly, and although it was a pain it looks really good! I had to kinda rework the processor a little bit, because DefineShape4 adds a few flags, but I already added LineStyles2 support, so it implemented well. I also got rid of the redundant line/fill storage, which was a small optimization, but still mostly noticeable. To end off the session, I changed the Skia commit hash, so we won’t need to deal with outdated headers. Whats Next: - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 5 Alpha 3.0 - Pre Release 1 What I worked on today: - Started Development Of DefineMorphShape tags ~ Created new SHAPE base structure ~ Set up all required structures for DefineMorphShape ~ Added DefineMorphShape to tags.h Notes: Hello friends, you may have noticed a different version type, “Pre Release”. This is simply an indication that this is not an official change, and is not implemented into the project. Pre Release Devlogs should tend to reflect 1-2 big changes, with a large majority of the content nested inside, as shown above. This Devlog serves to both announce the beginning of Morph Shape Development, and represent what to expect from Pre Releases. As a quick note to the fact that Morph Shapes were not even on the To Do list, I recently discovered that Morph Shapes were just as important as Sprites, when properly rendering animations. Anyways, though this one was short, thank you for stopping by, and feel free to check out my project, follow it, and like this post if you think it’s cool! See you all next time! Agenda: - Work on parsing for Morph Shapes - Create a processor for Morph Shapes - Add rendering case for Morph Shapes Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 6 Alpha 3.0 - Pre Release 2 What I worked on today: - Implemented Full DefineMorphShape Parsing - Currently not fully working ~ Implemented MorphFillStyle Parsing ~ Implemented MorphLineStyle Parsing - 1 and 2 ~ Implemented MorphGradient Parsing ~ Implemented SHAPE Struct Parsing ~ Implemented DefineMorphShape Parsing ~ Implemented DefineMorphShape2 Parsing Notes: Hello friends, as you can see, this Devlog is pretty long. This took around twice as long as ordinary Shape Styles, seen in DefineShape tags. This is because each DefineMorphShape tag contains a pair of each type of data for interpolation, rather than one set. For the most part this was just pretty tedious low level Bitmath operations, and a lot of nested structures. It wasn’t too bad, because I had a good reference from the original DefineShape structures, and just general experience, but yes, it was very tedious, and likely the least fun part of this process. Hopefully my next Devlog has a better timeframe, and parsing is working! Thank you all for stopping by, as always, please feel free to leave a comment with any questions you might have, or just feedback in general, as well as following and liking this post! See you all later! Agenda: - Get Parsing to a Functional State - Create a processor for Morph Shapes - Add rendering case for Morph Shapes Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 7 Alpha 3.0 - Pre Release 3 What I worked on today: - Implimented DefineMorphShape’s - Still not fully working ~ Implemented MorphFillStyle Translator ~ Implemented MorphLineStyle Translator - 1 and 2 ~ Implemented MorphGradient Translator ~ Implemented DefineMorphShape to Shape Builder * ~ Fixed parsers to work with builders Notes: Hello friends, I did a lot of work in this long extended session! I decided that it would make sense to just convert the morph variants to the normal variants, and use my current framework to just build 2 shapes, and interpolate them. There were a lot of issues, because there are some odd SWF bugs that happen sometimes, and I thought they were my own errors, so I spent like 2 hours trying to get things working, and I just ended up putting in some fall back code, and got things working, but now there are some weird color bugs, so I need to work those out, but overall it seems to be working ok. It’s been a rough week, so I hope it gets a little easier(It’s not gonna be with sprites, but it is what it is). Anyways, thank you guys for following along, for anyone else coming across this, feel free to like this comment, and follow the project if you think it’s cool. See you guys next time! Agenda: - Fix odd color issues with morph shapes - Clean up parsing output - Update the website to use new update Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 8 Alpha 3.0 What I accomplished today: - MAJOR UPDATE! – NEW RELEASE – MAJOR UPDATE! - Fixed Morph Shape issues - Fixed wrong MorphShape Order - Fixed the Matrix Signing Error - This has been causing the shape warping - Optimized Rendering Packets - Updated Web Implementation Notes: Hello friends, My most recent Devlog may have reflected some distress, but I finally figured it out! The weird warping of shapes was caused by a bug in a script I wrote about 5 months ago, that I thought was solid. There was a signing error, so all numbers ended up unproportionately large if they were negative, because the first bit was being counted towards the value. With a quick change of 2 lines, it completely changed the look of animations. As for the color bug with morph shapes, there is no bug at all, in fact the morph shapes typically are used as templates for sprites. So if you see any odd colored shapes, that’s why :D. Lastly, for some reason morph shapes are interpolated in reverse when using Skia, so I simply reversed the inputs, and the morph shapes are working as intended. The final thing was updating the main tag processor to send render instructions in batches, not one at a time, as to reduce overhead. This is a tough project, and I have poured my soul into it, if you think it’s cool, please feel free to follow it! Anyways, see you guys next time! Whats Next: - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 9 Alpha 3.1- Pre Release 1 What I worked on today: - Implimented DefineBits - Parsing and rendering ~ Updated Dependency Script to include libJPEGTurbo ~ Created 2 test SWF files using jpexs ~ Fixed major shape disappearing issue Notes: Hello Friends! I spent quite a bit of time on this, both parsing and processing bitmaps. So far we only have one working bitmap parser of 6, and that is the most bare bones one. There are some weird errors that can occur with the JPEG headers, but it is impossible to find SWF files with DefineBits, so I made my own, one without the error, and one with it. It currently works for both, which is great, and I am excited to see where I can take this project. I am so close to being ready for Sprite support. I just need to keep pushing through these tags. Thank you to anyone who’s been keeping up with this, for others, feel free to follow if you think this is cool. See you guys next time! Agenda: - Implement the other 5 DefineBits Types - Get EMScripten libJPEGTurbo Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - In Progress - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 10 Alpha 3.1- Pre Release 2 What I worked on today: - Implimented the following: ~ DefineBits2 + Corresponding Bug testing Files ~ DefineBits 3+4 + Corresponding Bug testing Files ~ DefineBitsLossless + Corresponding Bug testing Files, and custom image assemblers for speed. ~ Changed Zlib to Wuffs for much faster decomp times. Notes: Hello Friends, it’s been a while, and I really try to avoid 10 hour devlogs, but I really wanted a good real world testable result for bitmaps before I made one. The main reason being that next on the list is sprites, which will complete the animation stage of this project. Leading us to Alpha 4.0. Now I wanted to take the time to name each coming stage, as each one will be long, yet monumental. I am nearly done with bitmaps, and soon enough, I will be working on the grueling task of implementing the sprites. I think so far the most difficult task was shapes, because it required a very deep understanding of the SWF shape system, but sprites might be a close second. I really appreciate you guys’ support, even though there aren’t too many of you. I love this project, and I am so happy I get to express it here. Agenda: - Impliment DefineBitsLossless2 Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - In Progress - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 11 Alpha 3.1- Pre Release 3 What I worked on today: ~ DefineBitsLossless2 32Bit + 8Bit ARGB Support ~ Implimented Actual Alpha Pixel Rasterization Notes: Hello friends! I finally finished implementing Bitmaps, and I am very excited to port to WASM, and release the bitmaps release. I am planning on working on fonts and text next, and doing whatever else sprites will require. After which I will work on sprite animation, and a far more polished UI, as well as an official linux release. I have decided to name the first official release(And ship), Alpha 4.0 Anim. I feel that this represents the fact that adding sprites will make this a fully funtional flash animation player. After this, I plan to finish tag support, and try to work on some simple ActionScript, to get buttons and other simple functions working. And the end goal would involve a fully functional ActionScript Engine, and a fully implimented Flash Player replacement. Anyways, I hope you all have a good day, see you all next time! Agenda: - Impliment DefineBitsLossless2 Whats Next: - Create actual autobuild script for both WASM and Native Linux - Font Support + Other small sprite prerequisites - Sprite Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More Note: Image with brighter colors is 8Bit, and the one with the more nuanced colors is 32Bit
WasFlash Devlog # 11 Alpha 3.1- Pre Release 4 What I worked on today: ~ Started Work on sprite implementation. Notes: Hello everyone, it’s been quite a while, sorry about that. I am currently working on implementing sprites; it’s a lot of work and more difficult than anything else I’ve done for this project. I’m not sure if they will be done by the end of this, so I plan to ship this now, and possibly release another ship if I can finish it. I am very busy with my school’s performance of Les Mis; that is why this is a bit sparse. I appreciate your patience and hopefully we will have fully working sprites by the end of october. Agenda: - Work on sprite implimentation Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 11.5 Alpha 3.1- Pre Release 4.5 Progress Update: ~ Sprite Parsing and preprocessing done for rendering functionality ~ Currently working on the implementation and actual rendering now… Notes: This serves as a midway point in a more extensive development stage - A real devlog will be posted soon, at a better stopping point....
|
1792511316.1022744
|
1793116116.1022744
|
|
130
|
Frictionless by @shiekhuu | Stardance
|
shiekhuu
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @shiekhuu | Stardance
|
1792633645.148014
|
1793238445.148014
|
|
129
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792893000.0381749
|
1793757000.0381749
|
|
128
|
My first slack bot! by @sammy | Stardance
|
sammy
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @sammy | Stardance
|
1792568857.348386
|
1793173657.348386
|
|
127
|
Lanis by @Bennet | Stardance
|
Bennet
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Lanis by @Bennet | Stardance
|
1792795684.1046987
|
1793400484.1046987
|
|
126
|
Exterstellar by @Sabio | Stardance
|
Sabio
|
0
|
22.3
|
0
|
[]
|
[{"post_id": 7719, "ts": "2026 [{"post_id": 7719, "ts": "2026-06-12T21:38:27Z", "hours": 4.2303, "text": "Exterstellar indev-8 The Onboarding update (so peak) New Feature(s) Onboarding Bug Fix(es) Fix the Firefox configuration import button unfocusing the popup and causing it to not register by creating a separate page dedicated to importing configuration. Changelog fix(importer): fix firefox config import by making a new page for importing configs ( 7ee1b2a ) feat: onboarding ( 3faa741 )"}, {"post_id": 5650, "ts": "2026-06-09T15:03:49Z", "hours": 3.9678, "text": "Exterstellar indev-7 The TypeScript Migration update. Refactors All plugins and core JavaScript files are now using TypeScript. New Features Import / Export configuration system. Changelog feat: import/export system! ( be9ea28 ) refactor: Change everything into typescript + update readme + update workflows ( f5c5980 )"}, {"post_id": 3520, "ts": "2026-06-06T14:29:58Z", "hours": 0.7978, "text": "Exterstellar indev-6 Smallest update (yet)! New Features Add Plugin Manager Settings, where you can customize font size and the width of the manager! New Bug Fix(es) Fix comment text in the textarea not rendering due to conflicts with the native comment markdown system. Removed Plugin(s) Comment Markdown (now natively available!) Changelog fix(comments): remove comment md as its natively implemented ( f9389b2 ) feat: add plugin manager settings ( e8c4b99 )"}, {"post_id": 2977, "ts": "2026-06-05T22:01:42Z", "hours": 5.7128, "text": "Exterstellar indev-5 ΩΜΞGΛ SiGMΛ+++++++++++ DΞLUXΞ update for Exterstellar! New Plugin(s) Shop Goal Enhanced Completely revamps the shop goal system! (This took so long…) New Dev Stuff Plugin Exports API something something something plugins can now export functions for other plugins to use (PΞΛK) Changelog feat: add plugin exports API + comment markdown now uses devlog formatter and md preview ( 78e369c ) added Sidebar Reorder ( 0d6c2d2 ) added Sidebar Hotkeys ( ee3926e ) added Devlog Formatter ( 85b8d4d ) added Comment Markdown ( acef3ac ) added Oneko ( aa59ccd ) Shop Goals Enhanced plugin! ( e493f54 ) Merge branch ‘main’ of https://github.com/Team-Exterstellar/Exterstellar ( 82688a4 )"}, {"post_id": 1610, "ts": "2026-06-03T19:02:49Z", "hours": 1.2808, "text": "Exterstellar indev-4 Introducing that one update where its larger than usual! (only slightly larger :3) New Plugin(s) Comment Markdown Adds markdown to comments (exclusive to Exterstellar users) . You can also select a config that allows you to help advertise and support Exterstellar! Updated Plugin(s) Markdown Preview Added Line Break. Devlog Formatter Bar Added Line Break. Changelog devlog formatter: “remove image formatting”, devlog changelog: “default to using commit-rang selector” ( 156c09e ) initialize NPM + comment markdown plugin ( b3b14cb ) comment markdown: “advertise config” ( 79f5923 ) Add line break to markdown preview & devlog formatter bar ( 6fb254f ) md preview: “fix break line offsetting textarea” ( 47e0c67 )"}, {"post_id": 1076, "ts": "2026-06-02T21:50:11Z", "hours": 2.5008, "text": "Exterstellar indev-3 Introducing your 600+ LoC plugin (help my sanity) for this week! New Plugin(s) Add changelog plugin (Adds your GitHub OR GitLab commits to your devlog!) Changelog feat: add oneko plugin ( a5f7542 ) Merge pull request #1 from GizzyUwU/main ( aa0bb71 ) fix(oneko): work over page change ( c6e7452 ) Merge pull request #2 from GizzyUwU/main ( fd83d40 ) Devlog changelog plugin! ( 02bcf5c )"}, {"post_id": 445, "ts": "2026-06-01T21:22:07Z", "hours": 1.1653, "text": "Exterstellar indev-2h introducing your 1 hour bug fix for the day (tm) p.s. next time i discover a bug i’m going to eat myself smh Bug Fix(es) The Live Markdown Preview plugin now supports the devlog composer menu overflowing! (a.k.a. scrolling [this took way too long]) yes that’s it because the Stardance website hates me smh"}, {"post_id": 329, "ts": "2026-06-01T17:03:31Z", "hours": 1.2644, "text": "Exterstellar indev-2 Introducing a new feature and significant improvement to the plugin system! New Feature(s) Live Markdown Rendering Plugin (not a new panel, or tab, just straight up displayed!) Plugin Live Changes (no refresh needed!)"}, {"post_id": 89, "ts": "2026-05-31T17:44:35Z", "hours": 1.3811, "text": "Exterstellar indev-1 Introducing your underrated browser extension for Stardance : Exterstellar by Sabio (that’s me!) & @Flux3tor (pretty much a major contributor-) . Features Toggleable Plugins (which are basically features the extension adds!) A lot (and I mean a LOT… ) of configurations available for all plugins (plugin configs!) Can be used to support MANY mini-extensions with our easy-to-use plugin development tool and documentation¹. Plugins Better Sidebar Custom Font Custom Scrollbar Devlog Formatter Sidebar Hotkeys Sidebar Reordering Themes ( @Gizzy certified btw :3) +more already in the works! (please comment plugin ideas if you have suggestions!) Join #exterstellar now! ¹ The documentation is in the works."}]...
|
Title: Exterstellar by @Sabio | Stardance
Devlogs Title: Exterstellar by @Sabio | Stardance
Devlogs:
Exterstellar indev-1 Introducing your underrated browser extension for Stardance : Exterstellar by Sabio (that’s me!) & @Flux3tor (pretty much a major contributor-) . Features Toggleable Plugins (which are basically features the extension adds!) A lot (and I mean a LOT… ) of configurations available for all plugins (plugin configs!) Can be used to support MANY mini-extensions with our easy-to-use plugin development tool and documentation¹. Plugins Better Sidebar Custom Font Custom Scrollbar Devlog Formatter Sidebar Hotkeys Sidebar Reordering Themes ( @Gizzy certified btw :3) +more already in the works! (please comment plugin ideas if you have suggestions!) Join #exterstellar now! ¹ The documentation is in the works.
Exterstellar indev-2 Introducing a new feature and significant improvement to the plugin system! New Feature(s) Live Markdown Rendering Plugin (not a new panel, or tab, just straight up displayed!) Plugin Live Changes (no refresh needed!)
Exterstellar indev-2h introducing your 1 hour bug fix for the day (tm) p.s. next time i discover a bug i’m going to eat myself smh Bug Fix(es) The Live Markdown Preview plugin now supports the devlog composer menu overflowing! (a.k.a. scrolling [this took way too long]) yes that’s it because the Stardance website hates me smh
Exterstellar indev-3 Introducing your 600+ LoC plugin (help my sanity) for this week! New Plugin(s) Add changelog plugin (Adds your GitHub OR GitLab commits to your devlog!) Changelog feat: add oneko plugin ( a5f7542 ) Merge pull request #1 from GizzyUwU/main ( aa0bb71 ) fix(oneko): work over page change ( c6e7452 ) Merge pull request #2 from GizzyUwU/main ( fd83d40 ) Devlog changelog plugin! ( 02bcf5c )
Exterstellar indev-4 Introducing that one update where its larger than usual! (only slightly larger :3) New Plugin(s) Comment Markdown Adds markdown to comments (exclusive to Exterstellar users) . You can also select a config that allows you to help advertise and support Exterstellar! Updated Plugin(s) Markdown Preview Added Line Break. Devlog Formatter Bar Added Line Break. Changelog devlog formatter: “remove image formatting”, devlog changelog: “default to using commit-rang selector” ( 156c09e ) initialize NPM + comment markdown plugin ( b3b14cb ) comment markdown: “advertise config” ( 79f5923 ) Add line break to markdown preview & devlog formatter bar ( 6fb254f ) md preview: “fix break line offsetting textarea” ( 47e0c67 )
Exterstellar indev-5 ΩΜΞGΛ SiGMΛ+++++++++++ DΞLUXΞ update for Exterstellar! New Plugin(s) Shop Goal Enhanced Completely revamps the shop goal system! (This took so long…) New Dev Stuff Plugin Exports API something something something plugins can now export functions for other plugins to use (PΞΛK) Changelog feat: add plugin exports API + comment markdown now uses devlog formatter and md preview ( 78e369c ) added Sidebar Reorder ( 0d6c2d2 ) added Sidebar Hotkeys ( ee3926e ) added Devlog Formatter ( 85b8d4d ) added Comment Markdown ( acef3ac ) added Oneko ( aa59ccd ) Shop Goals Enhanced plugin! ( e493f54 ) Merge branch ‘main’ of https://github.com/Team-Exterstellar/Exterstellar ( 82688a4 )
Exterstellar indev-6 Smallest update (yet)! New Features Add Plugin Manager Settings, where you can customize font size and the width of the manager! New Bug Fix(es) Fix comment text in the textarea not rendering due to conflicts with the native comment markdown system. Removed Plugin(s) Comment Markdown (now natively available!) Changelog fix(comments): remove comment md as its natively implemented ( f9389b2 ) feat: add plugin manager settings ( e8c4b99 )
Exterstellar indev-7 The TypeScript Migration update. Refactors All plugins and core JavaScript files are now using TypeScript. New Features Import / Export configuration system. Changelog feat: import/export system! ( be9ea28 ) refactor: Change everything into typescript + update readme + update workflows ( f5c5980 )
Exterstellar indev-8 The Onboarding update (so peak) New Feature(s) Onboarding Bug Fix(es) Fix the Firefox configuration import button unfocusing the popup and causing it to not register by creating a separate page dedicated to importing configuration. Changelog fix(importer): fix firefox config import by making a new page for importing configs ( 7ee1b2a ) feat: onboarding ( 3faa741 )...
|
1792745510.9977374
|
1793350310.9977374
|
|
125
|
Untitled by @RR | Stardance
|
RR
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @RR | Stardance
|
1792745409.3478167
|
1793350209.3478167
|
|
124
|
Nasa theme MicroPad by @sauravrajki67 | Stardance
|
sauravrajki67
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Nasa theme MicroPad by @sauravrajki67 | Sta Title: Nasa theme MicroPad by @sauravrajki67 | Stardance...
|
1792957763.1103747
|
1793821763.1103747
|
|
123
|
Pime by @kanavv | Stardance
|
kanavv
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Pime by @kanavv | Stardance
|
1792806736.877385
|
1793411536.877385
|
|
122
|
Untitled by @maya | Stardance
|
maya
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @maya | Stardance
|
1792713281.111912
|
1793318081.111912
|
|
121
|
Image to Equation converter by @cziwu2010 | Starda Image to Equation converter by @cziwu2010 | Stardance...
|
cziwu2010
|
2
|
36.0
|
581
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-07T05:37:27Z", "hours": 27.0, "multiplier": 18.45, "payout": 445, "blessing": "neutral", "text": "A program that converts an image into a graph. Improved: Reduced equation output amount by almost half, allowing more detailed graphs without crashing desmos New architecture debug option What’s next: color", "repo": "https://github.com/cziwu12/Raster-Image-to-Graph-Converter-2", "demo": "https://github.com/cziwu12/Raster-Image-to-Graph-Converter-2/releases/tag/v1.1"}, {"ship_num": 2, "ts": "2026-06-04T17:39:26Z", "hours": 9.0, "multiplier": 15.16, "payout": 136, "blessing": "neutral", "text": "My first major project: a raster image to equation converter. It converts the upload image into a set of equations that when plotted shows the edges of the image. There’s still limitations from the programme but I continue on iterating and improving on it.", "repo": "https://github.com/cziwu12/Raster-Image-to-Graph-Converter-2", "demo": "https://github.com/cziwu12/Raster-Image-to-Graph-Converter-2/releases/tag/v1.1"}]...
|
[{"post_id": 77483, "ts": "202 [{"post_id": 77483, "ts": "2026-10-07T05:30:07Z", "hours": 3.6806, "text": "v1.1 is complete: https://github.com/cziwu12/Raster-Image-to-Graph-Converter-2/releases/tag/v1.1"}, {"post_id": 75474, "ts": "2026-09-30T06:00:02Z", "hours": 11.6989, "text": "ok so i just relogged into stardance and i forgot to devlog it so now i have 11hours and 34minutes unlogged. So basically i tested multiple methods to reduce the equation count and also trying to get rid of the potrace double line and I finally did it. The previous version using potrace outputed 1398 equations while the new one outputed only 649. Almost halfed the previous amount. And now it’s just a single line compared to the double lines that potrace outputed. I’m planning to put this on browser so it’s easily accessable. (first image: previous ver, second image: new reduced ver third image: potrace double line output fourth image: reduced ver) to see the code: skanny.py https://github.com/cziwu12/Raster-Image-to-Graph-Converter-2"}, {"post_id": 57379, "ts": "2026-08-29T14:42:40Z", "hours": 10.7344, "text": "update: Improved the converter to output wayyyyyy fewer equations while maintaining graph quality and improved performance"}, {"post_id": 4138, "ts": "2026-06-07T10:34:49Z", "hours": 0.4356, "text": "turned this into an executable"}, {"post_id": 2255, "ts": "2026-06-04T17:23:28Z", "hours": 1.5056, "text": "okay"}, {"post_id": 1314, "ts": "2026-06-03T07:17:24Z", "hours": 3.1794, "text": "Will prob release this week. Almost done"}, {"post_id": 238, "ts": "2026-06-01T11:18:07Z", "hours": 4.5825, "text": "in progress"}]...
|
Title: Image to Equation converter by @cziwu2010 | Title: Image to Equation converter by @cziwu2010 | Stardance
Devlogs:
in progress
Will prob release this week. Almost done
okay
turned this into an executable
update: Improved the converter to output wayyyyyy fewer equations while maintaining graph quality and improved performance
ok so i just relogged into stardance and i forgot to devlog it so now i have 11hours and 34minutes unlogged. So basically i tested multiple methods to reduce the equation count and also trying to get rid of the potrace double line and I finally did it. The previous version using potrace outputed 1398 equations while the new one outputed only 649. Almost halfed the previous amount. And now it’s just a single line compared to the double lines that potrace outputed. I’m planning to put this on browser so it’s easily accessable. (first image: previous ver, second image: new reduced ver third image: potrace double line output fourth image: reduced ver) to see the code: skanny.py https://github.com/cziwu12/Raster-Image-to-Graph-Converter-2
v1.1 is complete: https://github.com/cziwu12/Raster-Image-to-Graph-Converter-2/releases/tag/v1.1
Ships:
My first major project: a raster image to equation converter. It converts the upload image into a set of equations that when plotted shows the edges of the image. There’s still limitations from the programme but I continue on iterating and improving on it.
A program that converts an image into a graph. Improved: Reduced equation output amount by almost half, allowing more detailed graphs without crashing desmos New architecture debug option What’s next: color...
|
1792986985.823659
|
1793073385.823659
|
|
120
|
120 by @Rupnil | Stardance
|
Rupnil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: 120 by @Rupnil | Stardance
|
1792741936.0865355
|
1793346736.0865355
|
|
119
|
testy mc test face by @RR | Stardance
|
RR
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: testy mc test face by @RR | Stardance
|
1792637493.027676
|
1793242293.027676
|
|
118
|
118 by @Rupnil | Stardance
|
Rupnil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: 118 by @Rupnil | Stardance
|
1792616092.8196585
|
1793220892.8196585
|
|
117
|
Automatic garden watering system by @Bennet | Star Automatic garden watering system by @Bennet | Stardance...
|
Bennet
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Automatic garden watering system by @Bennet Title: Automatic garden watering system by @Bennet | Stardance...
|
1792777906.2990026
|
1793382706.2990026
|
|
116
|
My first slack bot! by @remymoreau12 | Stardance
|
remymoreau12
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-01T22:38:33Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a slack bot! Thats so cool", "repo": "https://github.com/squeakycleanfreshie-cloud/Totoro-Slack-Bot", "demo": "https://hackclub.slack.com/archives/C0B9GUMA326"}]...
|
[{"post_id": 187, "ts": "2026- [{"post_id": 187, "ts": "2026-06-01T06:43:42Z", "hours": 0.4228, "text": "I setup my slack bot! I’m working on adding more functions soon"}]...
|
Title: My first slack bot! by @remymoreau12 | Star Title: My first slack bot! by @remymoreau12 | Stardance
Devlogs:
I setup my slack bot! I’m working on adding more functions soon
Ships:
I made a slack bot! Thats so cool...
|
1792982974.6290238
|
1793069374.6290238
|
|
115
|
115 by @Rupnil | Stardance
|
Rupnil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: 115 by @Rupnil | Stardance
|
1792723865.0535407
|
1793328665.0535407
|
|
114
|
114 by @Rupnil | Stardance
|
Rupnil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: 114 by @Rupnil | Stardance
|
1792511527.5951633
|
1793116327.5951633
|
|
113
|
HK WanZaap Station by @isaaclau888 | Stardance
|
isaaclau888
|
0
|
0.68
|
0
|
[]
|
[{"post_id": 13577, "ts": "202 [{"post_id": 13577, "ts": "2026-06-22T07:23:53Z", "hours": 0.6783, "text": "I have finished coding for the Chinese Paper 2 page."}]...
|
Title: HK WanZaap Station by @isaaclau888 | Starda Title: HK WanZaap Station by @isaaclau888 | Stardance
Devlogs:
I have finished coding for the Chinese Paper 2 page....
|
1792526038.76702
|
1793130838.76702
|
|
112
|
VERT.sh by @maya | Stardance
|
maya
|
0
|
7.16
|
0
|
[]
|
[{"post_id": 5034, "ts": "2026 [{"post_id": 5034, "ts": "2026-06-08T18:10:19Z", "hours": 1.3344, "text": "obscure ahh formats shorter devlog for now. i finally fixed the 4 formats that were not working from the previous devlog: .amv , .mpeg , .mpg , and .vob. .mpeg , .mpg , and .vob were very easy and simply needed me to ensure that the audio bitrate was always to the power of 2 (e.g. 128kbps, 256kbps, etc). .amv however.. was a bit more interesting. audio bitrate had to be 32kbps, sample rate 22050Hz, and extra arguments were needed. i needed to add the -block_size argument and then calculate the right size by dividing the sample rate (22050) with the FPS. this should be easy - audio to video conversions (using the album art / solid colour as the bg) always use 1 FPS to convert as quick as possible, but I actually had to force 3 FPS because AMV block sizes can only be between 32 and 8192. as such, the lowest FPS I could go was 3 since 22050 / 3 = 7350."}, {"post_id": 3773, "ts": "2026-06-06T20:28:44Z", "hours": 2.5539, "text": "i want to crash out well.. that was the most annoying 2 hours of my life spent there a few days ago. turns out, over 9 months ago a regression was introduced to VERT that was not noticed until now - audio thumbnails wouldn’t display properly. okay, not that big of an issue. should be a simple fix.. but i spent 2 hours on ts. it was mostly because i had to test a bunch of commits to see when the issue was introduced which took SO long not only for being so long ago.. which was only made worse because: HELPPPP basically, i had caching issues relating to Vite’s development server so the commit that i thought was the issue was NOT the issue. i had to restart my little binary searching of commits to find the actual commit that fixed it, all while running bun i && bun run build && bun run preview to install the right dependencies, build VERT for production, run a preview production build, and manually test the build for the issue which added SO much time. fixing ts so after finally finding the commit that caused the issue, i saw that it was an update to the package we use for reading audio file metadata, music-metadata , when we updated it to 1.9.0 . i initially reported the regression to the developer who was in our discord after not seeing any issues on the GitHub, but when i actually took a look at the code that was reading the data.. what the hell for some reason, the way the data was being processed was super duper cursed 💔. we were basically initializing a new Uint8Array with the cover image and getting it as an ArrayBuffer , and when generating the Blob we.. generate ANOTHER Uint8array of the same data?? i don’t even know how this worked in the first place, no wonder it broke when we updated. literally we just needed to generate one Uint8array , and pass its buffer to the Blob constructor lmfao (see third image). imagine you upload a zip file to a program expecting a bunch of images inside, but you accidentally uploaded created a zip archive of the zip archive you just made which contains those images. zip containing a (zip containing many images)–unexpected contents!"}, {"post_id": 2073, "ts": "2026-06-04T12:01:07Z", "hours": 3.2711, "text": "welcome back, VERT.sh after submitting VERT.sh during Summer of Making (and skipping Flavortown), i’ve decided to submit it again for Stardance. sadly, i did most of the very interesting features before the event so there won’t be too many interesting things made during the event. to summarize: i plan for a huge update drop adding local video conversion, per-file/more conversion settings, new formats, and many many QOL/fixes. the actual stuff here for the time i spent on this devlog, i mainly focused on fixes for conversion failures i noticed during testing. i added auto-adjustments to settings to ensure that conversions are completed successfully (a warning message pops up with what was changed when necessary), removed some now-incompatible formats, and just made sure conversions all pass again. most of the failures were regressions due to the conversion settings addition, the main thing fixing it was making sure i didn’t pass the “auto” string to the bit depth setting (instead of a number) 😭 all of the audio-audio conversions pass, while all but 4 audio -> video conversions pass. the last 4 are more obscure formats and i didn’t bother to fix them yet rn. i also prevented some video formats (like .gif) from being shown since they don’t like audio tracks lol"}]...
|
Title: VERT.sh by @maya | Stardance
Devlogs:
welc Title: VERT.sh by @maya | Stardance
Devlogs:
welcome back, VERT.sh after submitting VERT.sh during Summer of Making (and skipping Flavortown), i’ve decided to submit it again for Stardance. sadly, i did most of the very interesting features before the event so there won’t be too many interesting things made during the event. to summarize: i plan for a huge update drop adding local video conversion, per-file/more conversion settings, new formats, and many many QOL/fixes. the actual stuff here for the time i spent on this devlog, i mainly focused on fixes for conversion failures i noticed during testing. i added auto-adjustments to settings to ensure that conversions are completed successfully (a warning message pops up with what was changed when necessary), removed some now-incompatible formats, and just made sure conversions all pass again. most of the failures were regressions due to the conversion settings addition, the main thing fixing it was making sure i didn’t pass the “auto” string to the bit depth setting (instead of a number) 😭 all of the audio-audio conversions pass, while all but 4 audio -> video conversions pass. the last 4 are more obscure formats and i didn’t bother to fix them yet rn. i also prevented some video formats (like .gif) from being shown since they don’t like audio tracks lol
i want to crash out well.. that was the most annoying 2 hours of my life spent there a few days ago. turns out, over 9 months ago a regression was introduced to VERT that was not noticed until now - audio thumbnails wouldn’t display properly. okay, not that big of an issue. should be a simple fix.. but i spent 2 hours on ts. it was mostly because i had to test a bunch of commits to see when the issue was introduced which took SO long not only for being so long ago.. which was only made worse because: HELPPPP basically, i had caching issues relating to Vite’s development server so the commit that i thought was the issue was NOT the issue. i had to restart my little binary searching of commits to find the actual commit that fixed it, all while running bun i && bun run build && bun run preview to install the right dependencies, build VERT for production, run a preview production build, and manually test the build for the issue which added SO much time. fixing ts so after finally finding the commit that caused the issue, i saw that it was an update to the package we use for reading audio file metadata, music-metadata , when we updated it to 1.9.0 . i initially reported the regression to the developer who was in our discord after not seeing any issues on the GitHub, but when i actually took a look at the code that was reading the data.. what the hell for some reason, the way the data was being processed was super duper cursed 💔. we were basically initializing a new Uint8Array with the cover image and getting it as an ArrayBuffer , and when generating the Blob we.. generate ANOTHER Uint8array of the same data?? i don’t even know how this worked in the first place, no wonder it broke when we updated. literally we just needed to generate one Uint8array , and pass its buffer to the Blob constructor lmfao (see third image). imagine you upload a zip file to a program expecting a bunch of images inside, but you accidentally uploaded created a zip archive of the zip archive you just made which contains those images. zip containing a (zip containing many images)–unexpected contents!
obscure ahh formats shorter devlog for now. i finally fixed the 4 formats that were not working from the previous devlog: .amv , .mpeg , .mpg , and .vob. .mpeg , .mpg , and .vob were very easy and simply needed me to ensure that the audio bitrate was always to the power of 2 (e.g. 128kbps, 256kbps, etc). .amv however.. was a bit more interesting. audio bitrate had to be 32kbps, sample rate 22050Hz, and extra arguments were needed. i needed to add the -block_size argument and then calculate the right size by dividing the sample rate (22050) with the FPS. this should be easy - audio to video conversions (using the album art / solid colour as the bg) always use 1 FPS to convert as quick as possible, but I actually had to force 3 FPS because AMV block sizes can only be between 32 and 8192. as such, the lowest FPS I could go was 3 since 22050 / 3 = 7350....
|
1792684107.6900206
|
1793288907.6900206
|
|
111
|
Lunar V2 by @codedbymohit | Stardance
|
codedbymohit
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Lunar V2 by @codedbymohit | Stardance
|
1792943292.7608185
|
1793807292.7608185
|
|
110
|
Stardance companion app & API by @adamd | Star Stardance companion app & API by @adamd | Stardance...
|
adamd
|
0
|
23.84
|
0
|
[]
|
[{"post_id": 12460, "ts": "202 [{"post_id": 12460, "ts": "2026-06-20T10:47:34Z", "hours": 1.4392, "text": "Added achievements and leaderboard to the api"}, {"post_id": 8807, "ts": "2026-06-14T17:11:29Z", "hours": 4.2175, "text": "Hola! Today learned how to make http/api requests through flutter! It’s suspiciously easy…"}, {"post_id": 2913, "ts": "2026-06-05T20:21:21Z", "hours": 1.8619, "text": "Mornin Today I started coding the app. Nothing much yet. I found a tutorial on youtube im going to learn the basics from and made this themes file. The colors and fonts are taken from the site (Inspect element -> css -> variables, i couldnt add a screenshot after posting :()"}, {"post_id": 2383, "ts": "2026-06-04T20:44:59Z", "hours": 2.2306, "text": "Woah, quick update! The API is almost finished!! I added endpoints for missions (list, info, and projects attached) and guides, some generated tests and the pr is ready… I think! The list in the doc is so large I would have to zoom out even further to show you the full (sidebar on the left)."}, {"post_id": 2261, "ts": "2026-06-04T17:35:46Z", "hours": 3.7636, "text": "Helllo there! I am still working on the api and added a few things: followed?, liked? for projects, users and posts endpoints to follow, like and repost (quotes maybe coming soon or maybe not because i cant find the code for it?? loll) shop items, item, orders and order a guard, so guest accounts (without hca connected) cant generate a key (bacause it would bypass the website rules) and i dont remember exactly what else since the last devlog… I have set up a dev end for you to test the api on and it will (hopefully) update with every commit I push. Its available on https://6767.67.pl.eu.org . Test it using /dev_login/[id from 2 to 50] (it can be a little slow, but please dont blow up my server) (also, rate domain). Also the pr # is 224!!!!!!!"}, {"post_id": 1661, "ts": "2026-06-03T19:57:19Z", "hours": 4.1589, "text": "Hellllllo! Today I was rethinking the structure and while at it, I was getting more and more ideas on what to add to the API. I am planning search with filters, shop (i mean it kind of already is there), actions like like/follow/repost, comments, and many more and thought…. it is quite a big api if i want to all of that. and with the current structure (i mean /me/projects separate from /user/:id/projects and stuff) it would probably get even more messy in the future. So i decided to switch to a standard REST api structure!!! More on that later, and while you wait, feel free to watch a timelapse of me designing the draft of the app’s home page (it will be completely different probably anyway)! See ya!"}, {"post_id": 253, "ts": "2026-06-01T13:06:01Z", "hours": 3.0819, "text": "Helllllo again yall :hyper-blahaj-spinning:! (im patiently waiting for that feature btw) Since the last devlog, I worked a bit on two more endpoints in the /me resource. Now you can also get and edit user profile info from the api! I also copied the docs_controller.rb from flavortown and wrote some basic info about how the api functions in the openapi docs page and I found this cool space-y theme! Now im going to continue working on more endpoints and hopefully get /user(s) or /project(s) working! I hope I will not have to rewrite everything because of some change in the repo because the commits are coming very very fast and im not even keeping up with rebasing them into my branch… Also, I saw that @zrl followed the project, and Im curious if its the real Zach or if someone stole his username, so if The real Zach Latta please stand up , i mean please write a comment or something idk :)) see ya in the next devlog"}, {"post_id": 55, "ts": "2026-05-31T15:03:59Z", "hours": 3.0892, "text": "I started working on the api. Everything is a lil broken now, so is my api field in settings :)) (also dont try to steal the kay cuz its from localhost)"}]...
|
Title: Stardance companion app & API by @adamd Title: Stardance companion app & API by @adamd | Stardance
Devlogs:
I started working on the api. Everything is a lil broken now, so is my api field in settings :)) (also dont try to steal the kay cuz its from localhost)
Helllllo again yall :hyper-blahaj-spinning:! (im patiently waiting for that feature btw) Since the last devlog, I worked a bit on two more endpoints in the /me resource. Now you can also get and edit user profile info from the api! I also copied the docs_controller.rb from flavortown and wrote some basic info about how the api functions in the openapi docs page and I found this cool space-y theme! Now im going to continue working on more endpoints and hopefully get /user(s) or /project(s) working! I hope I will not have to rewrite everything because of some change in the repo because the commits are coming very very fast and im not even keeping up with rebasing them into my branch… Also, I saw that @zrl followed the project, and Im curious if its the real Zach or if someone stole his username, so if The real Zach Latta please stand up , i mean please write a comment or something idk :)) see ya in the next devlog
Hellllllo! Today I was rethinking the structure and while at it, I was getting more and more ideas on what to add to the API. I am planning search with filters, shop (i mean it kind of already is there), actions like like/follow/repost, comments, and many more and thought…. it is quite a big api if i want to all of that. and with the current structure (i mean /me/projects separate from /user/:id/projects and stuff) it would probably get even more messy in the future. So i decided to switch to a standard REST api structure!!! More on that later, and while you wait, feel free to watch a timelapse of me designing the draft of the app’s home page (it will be completely different probably anyway)! See ya!
Helllo there! I am still working on the api and added a few things: followed?, liked? for projects, users and posts endpoints to follow, like and repost (quotes maybe coming soon or maybe not because i cant find the code for it?? loll) shop items, item, orders and order a guard, so guest accounts (without hca connected) cant generate a key (bacause it would bypass the website rules) and i dont remember exactly what else since the last devlog… I have set up a dev end for you to test the api on and it will (hopefully) update with every commit I push. Its available on https://6767.67.pl.eu.org . Test it using /dev_login/[id from 2 to 50] (it can be a little slow, but please dont blow up my server) (also, rate domain). Also the pr # is 224!!!!!!!
Woah, quick update! The API is almost finished!! I added endpoints for missions (list, info, and projects attached) and guides, some generated tests and the pr is ready… I think! The list in the doc is so large I would have to zoom out even further to show you the full (sidebar on the left).
Mornin Today I started coding the app. Nothing much yet. I found a tutorial on youtube im going to learn the basics from and made this themes file. The colors and fonts are taken from the site (Inspect element -> css -> variables, i couldnt add a screenshot after posting :()
Hola! Today learned how to make http/api requests through flutter! It’s suspiciously easy…
Added achievements and leaderboard to the api...
|
1792572739.239072
|
1793177539.239072
|
|
109
|
c by @variidian | Stardance
|
variidian
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: c by @variidian | Stardance
|
1792669745.335281
|
1793274545.335281
|
|
108
|
TempestDB by @Vimthusiast | Stardance
|
Vimthusiast
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: TempestDB by @Vimthusiast | Stardance
|
1792759948.5286098
|
1793364748.5286098
|
|
107
|
Tube by @deltea | Stardance
|
deltea
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Tube by @deltea | Stardance
|
1792561772.491266
|
1793166572.491266
|
|
106
|
Untitled by @BookCatKid | Stardance
|
BookCatKid
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @BookCatKid | Stardance
|
1792579698.6236825
|
1793184498.6236825
|
|
105
|
Keons v2 by @Josh | Stardance
|
Josh
|
0
|
0.46
|
0
|
[]
|
[{"post_id": 32, "ts": "2026-0 [{"post_id": 32, "ts": "2026-05-31T10:15:42Z", "hours": 0.4608, "text": "I added 4 slash commands (two that use apis) and a rather nice readme (compared to my other projects) Ive also hosted the bot on my server, as I have other things on nest already. So far, the 4 commands are /keons-ping - to ping the bot /keons-catfact - api command, tells you a cat fact /keons-help - tells you the slash commands /keons-bitcoin - which tells you the price of bitcoin, because I thought it would be funny. I’ve decided to use javascript, as thats what the tutorial suggested and python slack bots are a bit of a mess."}]...
|
Title: Keons v2 by @Josh | Stardance
Devlogs:
I a Title: Keons v2 by @Josh | Stardance
Devlogs:
I added 4 slash commands (two that use apis) and a rather nice readme (compared to my other projects) Ive also hosted the bot on my server, as I have other things on nest already. So far, the 4 commands are /keons-ping - to ping the bot /keons-catfact - api command, tells you a cat fact /keons-help - tells you the slash commands /keons-bitcoin - which tells you the price of bitcoin, because I thought it would be funny. I’ve decided to use javascript, as thats what the tutorial suggested and python slack bots are a bit of a mess....
|
1792666096.0063696
|
1793270896.0063696
|
|
104
|
A Compiler by @Scarlet | Stardance
|
Scarlet
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: A Compiler by @Scarlet | Stardance
|
1792659343.6534693
|
1793264143.6534693
|
|
103
|
cosmis! by @uy3yud | Stardance
|
uy3yud
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: cosmis! by @uy3yud | Stardance
|
1792687778.0770307
|
1793292578.0770307
|
|
102
|
Frictionless by @Josh | Stardance
|
Josh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @Josh | Stardance
|
1792587227.5132341
|
1793192027.5132341
|
|
101
|
Untitled by @Fantamomo | Stardance
|
Fantamomo
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Fantamomo | Stardance
|
1792493401.9533908
|
1793098201.9533908
|
|
100
|
Untitled by @RS | Stardance
|
RS
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @RS | Stardance
|
1792547476.8790448
|
1793152276.8790448
|
|
99
|
TrigTok by @alaninnovates | Stardance
|
alaninnovates
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: TrigTok by @alaninnovates | Stardance
|
1792756295.6600814
|
1793361095.6600814
|
|
98
|
Untitled by @Fantamomo | Stardance
|
Fantamomo
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Fantamomo | Stardance
|
1792795971.7599013
|
1793400771.7599013
|
|
97
|
Slack.fm by @xvcf | Stardance
|
xvcf
|
0
|
0.48
|
0
|
[]
|
[{"post_id": 375, "ts": "2026- [{"post_id": 375, "ts": "2026-06-01T18:42:23Z", "hours": 0.4814, "text": "Hey there! This is the first devlog for Slack.fm, so I’ll give you a broad explanation first! The bot simply uses the last.fm API to fetch data about users. The goal is it to send last.fm data directly into Slack channels, so users can share what they are listening to! This project is inspired by .fmbot on Discord! What did I do in this devlog though? Well, I first setup the bot with the “Make a Slack Bot” mission from Stardance! I used this to create the ping command, but quickly decided to instead create a full command handler. I really like my projects organized, so that’s the best choice! Now, I can put my commands into different files in src/commands, such as src/commands/fm.ts! The commandManager searches for these command files and imports them. My next goal is it to set up some more stuff and request an API key from last.fm!"}]...
|
Title: Slack.fm by @xvcf | Stardance
Devlogs:
Hey Title: Slack.fm by @xvcf | Stardance
Devlogs:
Hey there! This is the first devlog for Slack.fm, so I’ll give you a broad explanation first! The bot simply uses the last.fm API to fetch data about users. The goal is it to send last.fm data directly into Slack channels, so users can share what they are listening to! This project is inspired by .fmbot on Discord! What did I do in this devlog though? Well, I first setup the bot with the “Make a Slack Bot” mission from Stardance! I used this to create the ping command, but quickly decided to instead create a full command handler. I really like my projects organized, so that’s the best choice! Now, I can put my commands into different files in src/commands, such as src/commands/fm.ts! The commandManager searches for these command files and imports them. My next goal is it to set up some more stuff and request an API key from last.fm!...
|
1792666363.1755776
|
1793271163.1755776
|
|
96
|
ESP32 powered Drone Sware by @Naytik | Stardance
|
Naytik
|
0
|
2.21
|
0
|
[]
|
[{"post_id": 12463, "ts": "202 [{"post_id": 12463, "ts": "2026-06-20T10:55:41Z", "hours": 0.8808, "text": "Today, The FCUs finally arrived, once I took them out of the box, I plugged them into my computer to make sure that they worked well and it turns out that they did. both the FCUs worked perfectly first try and sensors on there, The MPU6500 and QMC5883P sensors worked perfectly with no issue what so ever. I also received the case and I am very excited to make the drones and then make them work together to form a drone swarm!"}, {"post_id": 4032, "ts": "2026-06-07T06:35:46Z", "hours": 1.3272, "text": "I completed most of the schematics for the slave drones including the IMU and Magnetometer, the only thing remaining to wire up are the motor contacts, added and wired up the ESP32"}]...
|
Title: ESP32 powered Drone Sware by @Naytik | Star Title: ESP32 powered Drone Sware by @Naytik | Stardance
Devlogs:
I completed most of the schematics for the slave drones including the IMU and Magnetometer, the only thing remaining to wire up are the motor contacts, added and wired up the ESP32
Today, The FCUs finally arrived, once I took them out of the box, I plugged them into my computer to make sure that they worked well and it turns out that they did. both the FCUs worked perfectly first try and sensors on there, The MPU6500 and QMC5883P sensors worked perfectly with no issue what so ever. I also received the case and I am very excited to make the drones and then make them work together to form a drone swarm!...
|
1792644656.8260713
|
1793249456.8260713
|
|
95
|
My Hanger by @rabieulawal_h | Stardance
|
rabieulawal_h
|
0
|
0.84
|
0
|
[]
|
[{"post_id": 1335, "ts": "2026 [{"post_id": 1335, "ts": "2026-06-03T08:47:45Z", "hours": 0.8433, "text": "made the basic site"}]...
|
Title: My Hanger by @rabieulawal_h | Stardance
De Title: My Hanger by @rabieulawal_h | Stardance
Devlogs:
made the basic site...
|
1792562098.7475228
|
1793166898.7475228
|
|
94
|
Untitled project by @cybdo | Stardance
|
cybdo
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @cybdo | Stardance
|
1792583564.8094823
|
1793188364.8094823
|
|
93
|
FolderHarbor by @Nova | Stardance
|
Nova
|
0
|
3.3
|
0
|
[]
|
[{"post_id": 9176, "ts": "2026 [{"post_id": 9176, "ts": "2026-06-15T11:56:50Z", "hours": 1.6044, "text": "Web - Finished SDK Migration More of what I was doing in my last devlog! I updated to @folderharbor/ [email protected] , and implemented it across the rest of the panel. Specifically, in this time, I added it to: all admin routes (users, roles, acls, permissions, config, logs) user settings Web - Consolidation I also removed all of the web panel’s types that overlapped with the SDK’s ones, such as getting rid of the ClientConfig type and using FHClientConfig from the SDK instead. Notes I’m just about to merge this code into the main branch! :3"}, {"post_id": 9131, "ts": "2026-06-15T08:47:30Z", "hours": 1.6997, "text": "Web - SDK Migration I recently made an SDK for FolderHarbor (as a different project)! I’m now rewriting parts of the web panel to use it instead of direct API calls, as the SDK provides better type-safety. This isn’t done yet, but I’ve gotten the migration done in a few places. I’m doing this on a branch since it’s very breaking (most pages are broken on the branch during this rewrite, but the main branch’s version is still operational with the old code). Server - Fixes I fixed some things with the server, namely: Making a locked account return an error in checkPath() calls (this is to stop in-progress transfers on lock). Fixing the PNPM configuration, making it work properly with PNPM v11 (including on the CI/CD)."}]...
|
Title: FolderHarbor by @Nova | Stardance
Devlogs: Title: FolderHarbor by @Nova | Stardance
Devlogs:
Web - SDK Migration I recently made an SDK for FolderHarbor (as a different project)! I’m now rewriting parts of the web panel to use it instead of direct API calls, as the SDK provides better type-safety. This isn’t done yet, but I’ve gotten the migration done in a few places. I’m doing this on a branch since it’s very breaking (most pages are broken on the branch during this rewrite, but the main branch’s version is still operational with the old code). Server - Fixes I fixed some things with the server, namely: Making a locked account return an error in checkPath() calls (this is to stop in-progress transfers on lock). Fixing the PNPM configuration, making it work properly with PNPM v11 (including on the CI/CD).
Web - Finished SDK Migration More of what I was doing in my last devlog! I updated to @folderharbor/ [email protected] , and implemented it across the rest of the panel. Specifically, in this time, I added it to: all admin routes (users, roles, acls, permissions, config, logs) user settings Web - Consolidation I also removed all of the web panel’s types that overlapped with the SDK’s ones, such as getting rid of the ClientConfig type and using FHClientConfig from the SDK instead. Notes I’m just about to merge this code into the main branch! :3...
|
1792547283.113734
|
1793152083.113734
|
|
92
|
project by @flamex | Stardance
|
flamex
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: project by @flamex | Stardance
|
1792738306.395955
|
1793343106.395955
|
|
91
|
Frictionless by @fpolak14 | Stardance
|
fpolak14
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @fpolak14 | Stardance
|
1792659129.0123167
|
1793263929.0123167
|
|
90
|
My first slack bot! by @cybdo | Stardance
|
cybdo
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @cybdo | Stardance
|
1792687692.6287994
|
1793292492.6287994
|
|
89
|
Frictionless by @flamex | Stardance
|
flamex
|
0
|
1.07
|
0
|
[]
|
[{"post_id": 281, "ts": "2026- [{"post_id": 281, "ts": "2026-06-01T14:51:26Z", "hours": 1.0711, "text": "i am making a game that runs on your terminal . Im making this project to learn more about"}]...
|
Title: Frictionless by @flamex | Stardance
Devlog Title: Frictionless by @flamex | Stardance
Devlogs:
i am making a game that runs on your terminal . Im making this project to learn more about...
|
1792612258.9861045
|
1793217058.9861045
|
|
88
|
Study Flow by @paula_g_jantunen | Stardance
|
paula_g_jantunen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Study Flow by @paula_g_jantunen | Stardance
|
1792950685.9460478
|
1793814685.9460478
|
|
87
|
Pterodactyl Panel (Android App) by @stefdp | Stard Pterodactyl Panel (Android App) by @stefdp | Stardance...
|
stefdp
|
1
|
157.29
|
1608
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-07T14:34:43Z", "hours": 106.0, "multiplier": 15.23, "payout": 1608, "blessing": "neutral", "text": "For rating & testing the project, please first read all of the text in the release. I made an Android app to manage your self-hosted Pterodactyl Panel instance (Currently only the client side, later I’ll also add the admin side). For who doesn’t know, Pterodactyl Panel is a panel usually used to manage game servers, but it can run anything, each server is just a docker container. The most challenging part was prob downloading files, and it still confuses me tbh because on the Android Studio emulator it works fine, but when if I try it on my actual phone (Samsung A55 5G) it randomly stops after a few seconds and I can’t seem to understand why", "repo": "https://git.stefdp.com/Stef/Pterodactyl-Panel-Android-App", "demo": "https://git.stefdp.com/Stef/Pterodactyl-Panel-Android-App/releases/latest"}]...
|
[{"post_id": 55643, "ts": "202 [{"post_id": 55643, "ts": "2026-08-27T16:32:55Z", "hours": 2.5833, "text": "Added updated checking For F-Droid flavor it doesn’t do anything For APK flavor it checks my git repo For Play Store flavor it uses play store com.google.android.play:app-update library Updated the app site, available at https://ptero.stefdp.com Updated the changelog & app images in the fastlane folder Added an animation when switching between loading states with circular loading"}, {"post_id": 55485, "ts": "2026-08-27T11:17:55Z", "hours": 1.5147, "text": "Added optional biometric authentication so people can lock their app behind phone code or biometric verification (like fingerprint etc.)"}, {"post_id": 54826, "ts": "2026-08-25T23:53:13Z", "hours": 3.245, "text": "Created nests, nest & nest egg screens For nest egg screen, created 3 tabs: Configuration Variables Install Script it was pretty easy and quick to create those cuz they’re read-only as there’s no API endpoint to edit/delete them Added a back handler in the tabbed screens so that back button now goes to the previous tab instead of the entire previous screen In the client servers screen added a switch to see others’ server (admin only) Fixed capitalization in the getNestEgg function ( eggid -> eggId )"}, {"post_id": 54513, "ts": "2026-08-25T15:20:42Z", "hours": 2.9808, "text": "Created users & user screen Updated the AGP (Android Gradle Plugin) Table headers now properly support multi line text (previously if one text was multiline while everything else wasn’t, all the divider would have a gap on the bottom except for the multiline one) In the client server screen, settings tab the UUID is now aligned to the right Improved screen change when deleting a server/node/user/location (instead of navController.popBackStack() (which basically acts as the back button) i specifically navigate to generic screen (eg. “user” -> “users”) and remove current screen from the back history so in the case that there is no screen to back into (eg if the app is opened via a deep link or stuff like that) it will go to the generic tab anyway) Added pull to refresh in the location screen"}, {"post_id": 53949, "ts": "2026-08-24T17:33:07Z", "hours": 1.9753, "text": "Created server manage tab (only reinstall & suspend/unsuspend cuz there seem to be no API endpoint to toggle install status & transfer) Created server delete tab Added 2 new button types, SUCCESS (green) and WARNING (yellow) In the admin server screen now most tabs are hidden whent he server is installing"}, {"post_id": 53378, "ts": "2026-08-23T22:08:42Z", "hours": 1.3206, "text": "Created the admin server databases tab (it only supports resetting the password and deleting the databases because for creating a database i need the hosts IDs, which there seem to be no API endpoint to get them) Added a modifier param to the Container component In the client server screen added a param to directly switch to the databases tab (this is used when the user goes from the admin server screen to the client server screen) Fixed “Missing Server ID” notification when client server is opened with databases tab as first tab"}, {"post_id": 52489, "ts": "2026-08-22T17:05:09Z", "hours": 1.9144, "text": "Created the server startup tab Changed the way Container components are spaced in the Build Configuration tab and create server popup In the create server popup disabled the docker image select when only 1 image is available"}, {"post_id": 52173, "ts": "2026-08-22T08:15:57Z", "hours": 4.4989, "text": "Created server screen with its: About tab Details tab Build Configuration tab Fixed pull to reload, it was updating the refreshIndex variable before the main resource actually refreshed and this caused the tabs not to refresh unless the user pulled to refresh twice CodeText component now uses default text style & font weight instead of pre-defined ones (for some reasons with pre-defined ones, in the ScrollableTabRow component it adds like a margin on the bottom of the blue active indicator) Updated UpdateServerDetailsBody to mark required fields as non-nullable In the server owner select, fixed the selected user disappearing if it was not in the search results In the allocation selects: Made the UI use alias:port when an alias is available, otherwise will default to ip:port Moved the ip:port text to a variable to avoid writing the same thing twice"}, {"post_id": 50274, "ts": "2026-08-19T13:03:15Z", "hours": 2.3186, "text": "Added server creation Added a searchable property in the Select component that adds a text input to filter the options Created a regex to check node & server names"}, {"post_id": 49934, "ts": "2026-08-18T22:04:46Z", "hours": 1.0625, "text": "All *Include enums are now chainable so doing ListNodesQueryInclude.SERVERS + ListServersQueryInclude.USER returns servers.user Also now instead of <enum>.toQueryString(...) (like ListServersQueryInclude.toQueryString(...) ) i do listOf(...).toQueryString() Used the new include enum chaining in 2 places: node servers tab: it now makes way less HTTP requests since the user, nest & egg are directly returned with the server, saving me from making multiple HTTP requests to fetch all users, nests & eggs (which would’ve taken a long time on a large server that for example has thousands of users, since it was fetching at a rate of 50 users per HTTP request, and it being a mobile app, internet might not be fast too) servers screen, now it fetches the egg variable together with the nest instead of having to fetch the egg’s data Moved ApiErrorResponse in a models folder for better organization this is a code only change so ig i’ll show pics of the code"}, {"post_id": 49856, "ts": "2026-08-18T20:07:04Z", "hours": 5.0992, "text": "Created the servers screen (WIP, inputs are untested and creating servers is not implemented yet) Created node servers tab Added pagination to the list nests HTTP request response Removed useless reset of the allocations in the node allocations tab In the created node popup, switched some inputs description from \"quoted\" test to actual inline code blocks CodeText component now uses CharSequence instead of String so it also supports annotated strings Switched main components from Text to CodeText Application server status is now an enum Updated list nests query to include eggs variables too (i just found out i can do this so i’m gonna prob do in in all the other ones in the next devlog too)"}, {"post_id": 48195, "ts": "2026-08-16T14:20:45Z", "hours": 4.3858, "text": "Created the node allocations tab The servers screen now shows the server description when available The 2FA check now considers 2FA as enabled even if the status code is 400 other than checking the error message (ptero got no way of knowing if 2FA is enabled other than that ) Update the TextInput component to allow showing optional suggestions (used in the assign new allocations popup, IP Address input) The Checkbox component now is more transparent when disabled (from 0.5 to 0.2 alpha) Changed how padding works in the Pager component Updated the Table component to add a param to disable lazy loading (for some reason it was laggier) Updated the libs"}, {"post_id": 47489, "ts": "2026-08-15T13:07:23Z", "hours": 2.2333, "text": "Created the node configuration tab Renamed the CodeText component to CodeBlockText and added params to highlight the content with a specific language Created the CodeText component to have both normal text and inline code text (kinda like markdown when you do this )"}, {"post_id": 47046, "ts": "2026-08-14T17:23:43Z", "hours": 1.6747, "text": "Create the settings tab in the node screen Added enabled state to all the inputs & switches in the create node popup Updated the updateNode function’s body & params since some required params were marked as nullable"}, {"post_id": 46843, "ts": "2026-08-14T11:23:01Z", "hours": 2.9253, "text": "Created the node screen & its about tab Moved node specific endpoints to their own ApiService instead of having them in the ApplicationApiService and added 2 endpoints to respectively fetch system data in v1 and v2 Made it so create new node button is disabled until all locations are fetched"}, {"post_id": 45978, "ts": "2026-08-12T20:16:10Z", "hours": 2.9544, "text": "Created the popup to create a node When fetching the node lists, now it also fetches all the locations (needed for a select in the create popup) Added fastlane metadata (will be used for F-Droid in the future) The Popup component now has a scrollbar Updated the scrollbar so now it only shows up when the container has enough contents to be scrollable Added an arrangement property in the Table ’s headers & row cells so that i can center certain things Updated TextInput and Switch components to make their description text color customizable Updated the workflow to automatically push the .aab file to play store after it’s built and made the release (hopefully, i didn’t test it) Fixed create location popup not clearing the inputs upon closing"}, {"post_id": 45461, "ts": "2026-08-11T23:00:38Z", "hours": 0.5592, "text": "Fixed admins not being able to manage servers subusers’ permissions Fixed not being aple to open sub-directories in the file browser Fixed create location popup not closing after creating the location"}, {"post_id": 45335, "ts": "2026-08-11T18:39:18Z", "hours": 1.6944, "text": "Created nodes screen (missing the popup to create a node for now) App name is now dynamically generated in the build.gradle.kts file (so debug build get the (Debug) suffix) Added an HTTP endpoint to check a node status"}, {"post_id": 45109, "ts": "2026-08-11T11:53:58Z", "hours": 0.4881, "text": "Created a CodeText component to display text as code (kinda like this ) and applied it in all the places where I previously just copy pasted same code Creating an API key now copies the key to the clipboard"}, {"post_id": 45061, "ts": "2026-08-11T10:17:04Z", "hours": 5.8633, "text": "Created the locations screen Created the location screen Took and modified to adapt to this app the Table component, originally from my Zipline app Fixed the pull to refresh, when calling onRefresh it didn’t actually set isRefreshing to true so the spinner would immediately disappear instead of swithcing to the spinner state till it finished loading Removed the page property from functions since the page is already stored in the viewModel so it made no sense to retrieve it from the viewModel just to send it to a function in the viewModel Fixed the formatDate function, it was crashing the app on older Android versions (<= 13) because the date time parser couldn’t understand the timezone (it expected a date like 2026-08-08-T15:43:30Z instead of 2026-08-08-T15:43:30+02:00 ) Added a new primary color variant that looks good enough on light bgs Fixed some multi-line TextInput s being marked as singleLine"}, {"post_id": 42647, "ts": "2026-08-07T14:13:23Z", "hours": 0.4458, "text": "Fixed the pull to refresh box having incorrect padding, so the circle was being hidden by the header and by the time it was out, it was already fully pulled and so it would refresh Updated the README also did some tests with downloading but i failed so i just undid them without committing or anything"}, {"post_id": 42285, "ts": "2026-08-06T22:21:15Z", "hours": 2.0292, "text": "Created a website for the app & a privacy policy (that was needed for the play store app), it’s available at https://ptero.stefdp.com Added a prompt to request the notification permission in the login screen and a button in the settings in case you want to enable notification in a second moment Improved the eventDescription variable in the ActivityDisplay component (i didn’t even know that was possible, i found it out cuz i made a _count variable and android studio suggested me to put it directly in the when , lmao) Updated versioning to follow SemVer ( 1.0 -> 1.0.0 )"}, {"post_id": 41895, "ts": "2026-08-06T12:09:27Z", "hours": 3.0606, "text": "in the account settings screen added a tab for the app settings Fixed some activity log event having incorrect names and causing the app to crash Added an action to build the app when the commit is prefixed with [build] or [release] Moved the *Scrollbar modifiers above any padding modifier so they look better Switch ScrollableTabRow to a normal Row instead of LazyRow since it’ll never have enough items to cause any lag Updated the README Removed the admin input in the login screen since it’s currently not available"}, {"post_id": 41497, "ts": "2026-08-05T19:00:04Z", "hours": 1.0289, "text": "In the account settings screen created the activity tab (i think i finished all the client side of the app , now i just gotta finish the small importance TODOs like removing the padding to the scrollbar in most scrollable views & stuff like that) Moved ActivityDisplay in the general components as it’s used in the accoutn activity too Updated ActivityDisplay to include the user agent button when available"}, {"post_id": 41417, "ts": "2026-08-05T16:42:56Z", "hours": 0.65, "text": "In the account settings screen added the SSH Keys tab (basically a almost full copy paste of the API Credentials for the frontend) Fixed capitalization of a variable & function in the api key tab"}, {"post_id": 41037, "ts": "2026-08-04T23:29:22Z", "hours": 2.9483, "text": "In the account settings screen created the API credentials tab Update the server screen so each tabs remembers its own data after switching to another tab (previously it would reset when the user switched to another tab). Also tabs now only fetch data on first render, then they use the previously fetched data instead of re-fetching, unless the user manually refreshes via the “pull to refresh” action (the thing where you swipe from top to down and it shows the refresh circle, idk it’s “professional” name ) Applied same changes as above to the account settings screen Updated the formatDate function to include a param to toggle the year in the date"}, {"post_id": 40669, "ts": "2026-08-04T11:04:30Z", "hours": 5.4211, "text": "Added the account settings screen and its account tab (now missing “API Credentials”, “SSH Keys” and “Activity” tabs, then the app is done ) in the server screen’s files tab file names are now limited to one line and if they overflow, they get cut off and “…” is added Now each warning popup in the server screen has its own icon instead of all using the suspended icon in all places, replaced refreshIndex += 1 with refreshIndex++ The app now no longer shows “Missing Server ID” toast as soon as you open a server Fixed disable 2FA endpoint (i forgot to add /disable at the end and i was wondering why 2FA wasn’t getting disabled even tho the request succeeded (without /disable it acts as enable endpoint)) Fixed get qr code response as it was different from what the API docs listed In the get qr code function added a secondary response to tell that 2FA is already enabled (used to check 2FA status so i know whether to show enable or disable button in the 2FA cuz the user object doesn’t tell me if the user has 2FA on … shitty API fr) Added a simple regex to parse emails (so the change email button is enabled only if this regex passes) Servers screen now uses a normal Column instead of a LazyColumn as lazily loading the server was causing more lag than loading all at once (after all it’s just 10 servers per page) Same as above for the server screen activity tab (jusy 25 logs per page) Fixed the pagination system in servers screen and server screen activity tab (for total amount of pages it was using the total amount of items in the current pages ( .total ) instead of the total number of pages ( .totalPages ), idk how i missed that ) Moved the file picker stuff outside of the LazyColumn & put the permissions in a remember to hopefully try to decrease lag I wanted to make a screen rec but i was too lazy to then go and censor my 2FA secret"}, {"post_id": 39547, "ts": "2026-08-02T15:55:34Z", "hours": 5.2503, "text": "Created the activity tab (finally finished all server tabs :D) along with a function to parse the variables in the logs’ description Improved loading for schedules, backup and databases tabs Fixed JSON text highlighting not highlighting strings inside of arrays Added padding for the Waterfall Cutout (aka screens with rounded edges) in the Header and ScrollableTabRow components In the settings tab added a popup to confirm the reinstallation of the server Added the endpoint to get the server activity (idk how i had skipped that one) and its function to call it Renamed AccountActivity to ActivityLog as it’s used in server activity too Installed a lib to generate avatars thta look like “Boring Avatars” one (cuz boring avatars API is paid ) add .trim() to all user inputs Now tabs refresh only when the server ID changes instead of anything in the server object"}, {"post_id": 39101, "ts": "2026-08-01T20:10:32Z", "hours": 4.3317, "text": "Create a custom PullToRefreshBox component that just uses Material3 PullToRefreshBox under the hood, i just made a component so i can easily style it as it’s in 1 single place Added the pull to refresh gesture to servers list & server details screens Added a warning for when the server is suspended, installing, transferring, restoring from a backup or its node is under maintenance (all warnings for now use same icons, i gotta change that) In the servers list servers now are disable and show a pill when they are suspended, installing, transferring, restoring from a backup or their node is under maintenance (basically when the warning is displayed, the server is also disabled aka you can’t access its data like console, files etc.) The app now properly handles padding for devices that have a “waterfall inset” (aka those kind of phones with curved screen at the edge) The top bar in the server list now properly shows a loading state instead of just disappearing and appearing when the user permissions are fetched Created a function hasPermission to check if an user has a certain permission instead of repeating the same code like 20 times Moved StartupContainer to a more general Container Moved ServerStatus enum to Server.Status Removed navController from all tabs as it was unused"}, {"post_id": 38795, "ts": "2026-08-01T11:14:01Z", "hours": 2.0736, "text": "Created the startup tab Made startup variable description nullable as it’s an optional property"}, {"post_id": 38468, "ts": "2026-07-31T21:10:19Z", "hours": 0.7469, "text": "Network tab now just disables all the buttons when loading instead of switching to skeleton loading for any small change like updating an allocation’s notes Doubled hamburger menu icon left padding to match the avatar padding on the right Doubled the gaps between the cards in the backups & network tabs Halved the gaps between the cards in the schedules tab I also tried to make the TextInput label not squared for a while but failed 😭 , for some reasons even if i clip my highest component to rounded corners, it still has the squared bg in the back"}, {"post_id": 38370, "ts": "2026-07-31T18:28:20Z", "hours": 1.9514, "text": "Added the network tab to manage server allocations Added a “Tertiary” button type (just cuz secondary was almost invisible on the allocation bg 🥀) Fixed allocation endpoints using String instead of Long Moved backup popups outside of the padded Column Updated my github username in the readme"}, {"post_id": 36009, "ts": "2026-07-27T20:28:50Z", "hours": 0.4436, "text": "After i tested more the additions of the last devlog i found some issues so here i fixed them Fixed backups downloading as .gz instead of .tar.gz Fixed “Create Backup” not showing up when the current backup count was 0 (making it impossible to create backups at all) Disabled inputs in the restore & create popups when respectively restoring and creating Removed the enabled param in the BackupDisplay as it was basically useless"}, {"post_id": 35992, "ts": "2026-07-27T19:54:26Z", "hours": 4.4839, "text": "Finished the users tab Made the backups tab Made all popup’s horizontal padding equal When editing or creating a new subuser, the permissins that the current user doesn’t have are disabled in the permissions list Disabled the “Create Database” button when at the limit Renamed File to FileDisplay for consistency with other components Fixed edit & create user body still using String instead of ServerSubuser.Permission Fixed the deleteServerBackup function which was marked as GET instead of DELETE Made the truncate param required in the restoreServerBackup function as it’s required in the API"}, {"post_id": 34673, "ts": "2026-07-25T16:12:15Z", "hours": 5.4628, "text": "Started making the users tab but it’s really WIP, none of the buttons except create new user works) Handled subuser permissions for all current tabs Added a LabeledCheckbox component Removed some function params that were pointless to have Installed the Gravatar SDK for the subusers’ avatar I legit think Android Studio is ragebaiting me, as soon as i start the rec the app starts to lag, when i stop the rec it’s fine"}, {"post_id": 34147, "ts": "2026-07-24T17:24:53Z", "hours": 3.77, "text": "Finished handling buttons in the schedules tab & created all the popups for schedule & tasks management In all screens & tab now all the inputs, switches, selects etc. are disabled when loading or making a HTTP request (like delete schedule, update file name etc.) Added a function to convert ISO date strings in human-readable strings Added a missing endpoint to execute a schedule Added a missing only_when_online property in the ServerSchedule data class Fixed schedule & tasks endpoint types (was using String instead of Long for the IDs) Fixed ScrollableTabRow not using all the horizontal space when in landscape mode"}, {"post_id": 33800, "ts": "2026-07-24T00:56:20Z", "hours": 2.5242, "text": "Finished the UI side of the schedule details popup (still WIP for backend like button handling) Moved each popup into its own folder & file to avoid having many long Popup calls at the top of screen/tab files Changed task action from a normal screen to an enum Took the formatDate function from my Zipline app"}, {"post_id": 33067, "ts": "2026-07-22T17:17:14Z", "hours": 4.2242, "text": "Created the schedules tab for the server screen (still WIP, for now only works for displaying & creating schedules, gotta add edit, deletion and task management) Moved each tab to its own ViewModel for better ordering instead of putting everything is a generic one Improved code layout by using return s in some places instead of many if else blocks Fixed ScrollableTabRow component improperly placing icons when there was no text Moved ‘linked’ data class es inside each other so i can do Server.Attributes.Limits instead of having a class with a long name like ApplicationServerAttributesLimits"}, {"post_id": 32681, "ts": "2026-07-22T00:08:40Z", "hours": 5.6317, "text": "Updated the file edit screen to use VSCode’s Dark+ theme colors for highlighting and added Java and CASM/Crawssembly by @The_Craw Added the databases tab with handling for creation, deletion and rotation of the password Fixed rotateServerDatabasePassword and deleteServerDatabase , they were using the wrong endpoint ( /server instead of /servers ) Made each tab independently scrollable instead of making the parent component scrollable Took the IconButton component from my Zipline app and slightly modified it (the MoreActionsButton component now uses that) Changed the Notification object component’s background color"}, {"post_id": 31859, "ts": "2026-07-20T16:06:12Z", "hours": 2.1247, "text": "FInished file handling (handled edit & save files & create new file) Added file highlighting for .env files Fixed writeServerFile having a wrong Content-Type (it had application/json instead of text/plain since the input is a raw string) Fixed HTML syntax highlighting, it wasn’t highlighting the > part of the tag"}, {"post_id": 31721, "ts": "2026-07-20T10:47:03Z", "hours": 2.645, "text": "Added a screen for code editing with simple syntax highlighting (via a newly installed library) and a warning if you try to leave without saving (that’s still WIP, saving isn’t implemented yet and neither reading the content of the selected file) Updated the TextInput component to have a fontFamily property so that in the core editor i can set the text to be monospace On the login screen i disabled the application api key input till the admin side is actually done"}, {"post_id": 31407, "ts": "2026-07-19T19:00:46Z", "hours": 4.4347, "text": "(Sorry for the slightly laggy video, not sure if it’s cuz it’s via a emulator or cuz i compressed the video from 136 MiB down to 36 MB) In the server screen added the handling for download, upload, delete, copy, create folder, rename/move, change permissions, archive & unarchive Filled the File component’s “more actions” menu (before it was empty) Updated uploadServerFiles to be able to upload multiple files at once Added a function to convert linux string permissions (like drwxr-xr-x ) to int/octal (like 755 ) Added a regex for the linux int/octal permission Took the Popup component and Storage object form my Zipline app Updated the SecureStorage class to add the file download folder variable"}, {"post_id": 30962, "ts": "2026-07-18T23:42:06Z", "hours": 2.1631, "text": "Created the Files tab in the server screen (still WIP, most of the buttons do nothing rn) Created a File component to avoid repeating same code Added a new color surfaceContainer used in notifications Took the “More Actions” component from my Zipline app Took the “Checkbox” component from my Zipline app and modified it to be toggleable In server screen disable global scroll on certain tabs as they’d cause the app to crash for infinite scroll moved the WebSocket connection to the Console tab instead of the general server screen, this way it auto reconnects when the user switches back to the console tab (since it disconnects when the user moves to another tab to save resources)"}, {"post_id": 30840, "ts": "2026-07-18T19:40:14Z", "hours": 3.5069, "text": "Added charts to the console tab of the server screen Added a top scrollbar like ptero’s to the server screen and moved the console stuff to its own file for better sorting Created a component for the chart container & top scrollbar to avoid repetition Added AI declaration in the readme cuz i only found out now that it’s required Removed a double new line the Button component"}, {"post_id": 29863, "ts": "2026-07-17T00:51:22Z", "hours": 3.43, "text": "Created the server screen and right now i only made the console section out of all the ones i gotta do (console, files, databases, schedules, users, backups, network, startup, settings & activity) The server screen itself is WIP as it’s missing the buttons to switch between the sections The console tab is also WIP as i haven’t done the line charts for CPU, RAM & Network I/O) (devlogging with this stuff half-made cuz it’s almost 3AM so i gotta sleep ) Took the formatMs function from my zipline app to convert ms to human readable time like “1h 30m 20s” for the server uptime In the WebSocketManager class renamed the setPowerState function to sendPowerSignal as it makes more sense On the console screen i wanted the console to follow its actual colors but only lib i found to do that doesn’t support jetpack compose that well so i had to rely on the XML’s TextView (but in compose thanks to the AndroidView component)"}, {"post_id": 29055, "ts": "2026-07-15T18:23:36Z", "hours": 2.9633, "text": "Fixed websocket not working (apparently it 403’s unless you put the panel URL as Origin header) Added pagination to the servers screen and also made the server load lazily and get unrendered when out of the display Also suspended servers’ names now are grayed out Installed a ANSI parser library to correctly color console output (hopefully it works however they already said it won’t work for outline 😭) Took the scrollbar modifiers from my Zipline app and put a scrollbar in the servers list Created a object to easily access the WebSocketManager from a ViewModel class Currently working on the specific server page, right now it’s empty but i got websocket working, i’ll push it once it’s finished"}, {"post_id": 28568, "ts": "2026-07-14T21:58:36Z", "hours": 3.9736, "text": "Added the UI for the client servers list screen (still gotta finish it tho, just have to add pagination and will only shows 10 servers per page to avoid getting ratelimited as i have to make a separate HTTP request for each server to get their resources usage) Added pterodactyl panel colors to be used in the server status (red, green and yellow) Fixed listServers not working cuz of wrong path (i didn’t know how to tell retrofit to use just the baseUrl , then after it threw an error i googled it and realized i just had to put . ) Updated getServerResources response class, now the server state uses a enum instead of a generic string Updated Server class to better fix some typed and add 1 missing key Added the uploadServerFile HTTP method (i didn’t do i it initially cuz the docs were confusing and i couldn’t understand how to select the upload directory, turns out i was setting the directory query on the request to get the signed url instead of the signed url itself 😭 Improved login process to handle the case when the user logged with just an application api key and not a client one Added application API key validation for the same reason as the login Took shimmerable modifier from my Zipline app to make skeleton loading Added definitions & placeholders for all screens until i make them"}, {"post_id": 28257, "ts": "2026-07-14T12:33:25Z", "hours": 2.8692, "text": "Created Loading and Login Screen After making a HTTP request the app crashed and only then i realized that i didn’t make the HTTP request suspend functions so i fixed it Took the Notification object from my Zipline app, tho i gotta fix it a bit cuz the color is kinda ugly and i still don’t know which one in the palette to use cuz imo none of them fits, maybe i’ll just use a separate color out of the palette for it Updated the TextInput component to add a optional required field which when set to true adds a red * next to the label, might do this with switches too I took some common regex (domain, IPv4, number and decimal) since i might need them later and some of them (domain & IPv4) are also aready used in the login"}, {"post_id": 27777, "ts": "2026-07-13T17:06:27Z", "hours": 2.8914, "text": "Finished creating the methods to call the client API (same as application ones, copy pasted same code and changed method & function vars) (except for the download* ones, i took those from my other app Zipline) I also took the Transfer Service from my Zipline app Updated all the libraries Set target SDK to 37 (Android 17) now i gotta do the frontend part"}, {"post_id": 27272, "ts": "2026-07-12T18:21:50Z", "hours": 0.7419, "text": "Finished creating the methods to call the application API (basically just copy pasted same code and changed the method & the fuction vars) Now i gotta make the same thing for the client API"}, {"post_id": 27163, "ts": "2026-07-12T14:07:41Z", "hours": 1.4042, "text": "Started creating methods to call the API endpoints easily Took the Header component from one of my other apps"}, {"post_id": 26528, "ts": "2026-07-11T12:05:14Z", "hours": 0.8058, "text": "Set up color scheme (right now both light and dark color are the same, idk what colors to use to differ but make it still look like the official app) Added some util modules that i also use in my other apps Created an empty login screen"}, {"post_id": 26500, "ts": "2026-07-11T10:27:23Z", "hours": 0.9733, "text": "I had forgotten to add the client API HTTP endpoint to get the console websocket token & URL so i added it now Added the WebSocket handling (untested) Updated the proguard rules so that HTTP request/response classes are not shrunk or minified by R6"}, {"post_id": 26100, "ts": "2026-07-10T18:05:31Z", "hours": 0.6336, "text": "Finished adding the application API HTTP requests (added application/servers/{serverId}/databases , application/nests and application/nests/{nestId}/eggs ) Also fixed some classes having wrong data cuz i realized that i copy pasted them without actually changing their name in some places 😭 you can see them in the commit here even tho i’m kinda confused cuz in the docs i didn’t see any endpoint to create or manage nests, eggs and database hosts"}, {"post_id": 26051, "ts": "2026-07-10T17:14:07Z", "hours": 2.1628, "text": "Added more application API HTTP requests (all the application/nodes/{nodeId}/allocations , application/locations and application/servers endpoints) you can see them in the commit here"}, {"post_id": 21431, "ts": "2026-07-03T11:41:26Z", "hours": 2.1569, "text": "Added more application API HTTP requests (all the /application/user and /application/nodes endpoints) you can see them in the commit here"}, {"post_id": 7486, "ts": "2026-06-12T14:24:53Z", "hours": 1.1056, "text": "Split the API in 2 types: application and client (as pterodactyl handles those differently with 2 diff api keys) Fixed some wrong or missing types Finished adding the HTTP requests for the client API Started adding the HTTP requests for the application API"}, {"post_id": 7451, "ts": "2026-06-12T12:46:34Z", "hours": 1.6653, "text": "Added more HTTP requests (ngl am too lazy to list them all, just watch them in the commit here )"}, {"post_id": 4342, "ts": "2026-06-07T16:58:23Z", "hours": 4.2092, "text": "Added even more HTTP requests, tho could be not 100% accurate cuz ptero API is shit 😭, the official one is AI generated and has hallucinations…. anyway i added: GET /api/client/account/activity GET /api/client/account/ssh-keys POST /api/client/account/ssh-keys POST /api/client/account/ssh-keys/remove GET /api/client/servers/{identifier} GET /api/client/servers/{identifier}/resources POST /api/client/servers/{identifier}/command POST /api/client/servers/{identifier}/power GET /api/client/servers/{identifier}/databases POST /api/client/servers/{identifier}/databases POST /api/client/server/{serverIdentifier}/databases/{databaseIdentifier)/rotate-password DELETE /api/client/server/{serverIdentifier}/databases/{databaseIdentifier} GET /api/client/servers/{identifier}/files/list GET /api/client/servers/{identifier}/files/contents GET /api/client/servers/{identifier}/files/download POST /api/client/servers/{identifier}/files/write POST /api/client/servers/{identifier}/files/create-folder POST /api/client/servers/{identifier}/files/copy PUT /api/client/servers/{identifier}/files/rename POST /api/client/servers/{identifier}/files/compress POST /api/client/servers/{identifier}/files/decompress POST /api/client/servers/{identifier}/files/delete GET /api/client/servers/{identifier}/files/upload POST /api/client/servers/{identifier}/files/chmod GET /api/client/servers/{identifier}/schedules GET /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{identifier}/schedules POST /api/client/servers/{identifier}/schedules/{scheduleIdentifier} DELETE /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} DELETE /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} Writing all these took alot of time"}, {"post_id": 3759, "ts": "2026-06-06T20:13:46Z", "hours": 1.5667, "text": "Started adding some HTTP requests typedef, still missing alot tho for now i added: GET /api/client GET /api/client/permissions GET /api/client/account GET /api/client/account/two-factor POST /api/client/account/two-factor (enable) POST /api/client/account/two-factor (disable) PUT /api/client/account/email PUT /api/client/account/password GET /api/client/account/api-keys DELETE /api/client/account/api-keys/{identifier} POST /api/client/account/api-keys no frontend yet, i’m doing the backend first"}, {"post_id": 3611, "ts": "2026-06-06T16:44:59Z", "hours": 0.7236, "text": "Just created the app skeleton based on the other 2 apps i’ve already made (with alot of TODOs for now) now working on writing the code for HTTP requests to the pterodactyl API and their response types"}]...
|
Title: Pterodactyl Panel (Android App) by @stefdp Title: Pterodactyl Panel (Android App) by @stefdp | Stardance
Devlogs:
Just created the app skeleton based on the other 2 apps i’ve already made (with alot of TODOs for now) now working on writing the code for HTTP requests to the pterodactyl API and their response types
Started adding some HTTP requests typedef, still missing alot tho for now i added: GET /api/client GET /api/client/permissions GET /api/client/account GET /api/client/account/two-factor POST /api/client/account/two-factor (enable) POST /api/client/account/two-factor (disable) PUT /api/client/account/email PUT /api/client/account/password GET /api/client/account/api-keys DELETE /api/client/account/api-keys/{identifier} POST /api/client/account/api-keys no frontend yet, i’m doing the backend first
Added even more HTTP requests, tho could be not 100% accurate cuz ptero API is shit 😭, the official one is AI generated and has hallucinations…. anyway i added: GET /api/client/account/activity GET /api/client/account/ssh-keys POST /api/client/account/ssh-keys POST /api/client/account/ssh-keys/remove GET /api/client/servers/{identifier} GET /api/client/servers/{identifier}/resources POST /api/client/servers/{identifier}/command POST /api/client/servers/{identifier}/power GET /api/client/servers/{identifier}/databases POST /api/client/servers/{identifier}/databases POST /api/client/server/{serverIdentifier}/databases/{databaseIdentifier)/rotate-password DELETE /api/client/server/{serverIdentifier}/databases/{databaseIdentifier} GET /api/client/servers/{identifier}/files/list GET /api/client/servers/{identifier}/files/contents GET /api/client/servers/{identifier}/files/download POST /api/client/servers/{identifier}/files/write POST /api/client/servers/{identifier}/files/create-folder POST /api/client/servers/{identifier}/files/copy PUT /api/client/servers/{identifier}/files/rename POST /api/client/servers/{identifier}/files/compress POST /api/client/servers/{identifier}/files/decompress POST /api/client/servers/{identifier}/files/delete GET /api/client/servers/{identifier}/files/upload POST /api/client/servers/{identifier}/files/chmod GET /api/client/servers/{identifier}/schedules GET /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{identifier}/schedules POST /api/client/servers/{identifier}/schedules/{scheduleIdentifier} DELETE /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} DELETE /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} Writing all these took alot of time
Added more HTTP requests (ngl am too lazy to list them all, just watch them in the commit here )
Split the API in 2 types: application and client (as pterodactyl handles those differently with 2 diff api keys) Fixed some wrong or missing types Finished adding the HTTP requests for the client API Started adding the HTTP requests for the application API
Added more application API HTTP requests (all the /application/user and /application/nodes endpoints) you can see them in the commit here
Added more application API HTTP requests (all the application/nodes/{nodeId}/allocations , application/locations and application/servers endpoints) you can see them in the commit here
Finished adding the application API HTTP requests (added application/servers/{serverId}/databases , application/nests and application/nests/{nestId}/eggs ) Also fixed some classes having wrong data cuz i realized that i copy pasted them without actually changing their name in some places 😭 you can see them in the commit here even tho i’m kinda confused cuz in the docs i didn’t see any endpoint to create or manage nests, eggs and database hosts
I had forgotten to add the client API HTTP endpoint to get the console websocket token & URL so i added it now Added the WebSocket handling (untested) Updated the proguard rules so that HTTP request/response classes are not shrunk or minified by R6
Set up color scheme (right now both light and dark color are the same, idk what colors to use to differ but make it still look like the official app) Added some util modules that i also use in my other apps Created an empty login screen
Started creating methods to call the API endpoints easily Took the Header component from one of my other apps
Finished creating the methods to call the application API (basically just copy pasted same code and changed the method & the fuction vars) Now i gotta make the same thing for the client API
Finished creating the methods to call the client API (same as application ones, copy pasted same code and changed method & function vars) (except for the download* ones, i took those from my other app Zipline) I also took the Transfer Service from my Zipline app Updated all the libraries Set target SDK to 37 (Android 17) now i gotta do the frontend part
Created Loading and Login Screen After making a HTTP request the app crashed and only then i realized that i didn’t make the HTTP request suspend functions so i fixed it Took the Notification object from my Zipline app, tho i gotta fix it a bit cuz the color is kinda ugly and i still don’t know which one in the palette to use cuz imo none of them fits, maybe i’ll just use a separate color out of the palette for it Updated the TextInput component to add a optional required field which when set to true adds a red * next to the label, might do this with switches too I took some common regex (domain, IPv4, number and decimal) since i might need them later and some of them (domain & IPv4) are also aready used in the login
Added the UI for the client servers list screen (still gotta finish it tho, just have to add pagination and will only shows 10 servers per page to avoid getting ratelimited as i have to make a separate HTTP request for each server to get their resources usage) Added pterodactyl panel colors to be used in the server status (red, green and yellow) Fixed listServers not working cuz of wrong path (i didn’t know how to tell retrofit to use just the baseUrl , then after it threw an error i googled it and realized i just had to put . ) Updated getServerResources response class, now the server state uses a enum instead of a generic string Updated Server class to better fix some typed and add 1 missing key Added the uploadServerFile HTTP method (i didn’t do i it initially cuz the docs were confusing and i couldn’t understand how to select the upload directory, turns out i was setting the directory query on the request to get the signed url instead of the signed url itself 😭 Improved login process to handle the case when the user logged with just an application api key and not a client one Added application API key validation for the same reason as the login Took shimmerable modifier from my Zipline app to make skeleton loading Added definitions & placeholders for all screens until i make them
Fixed websocket not working (apparently it 403’s unless you put the panel URL as Origin header) Added pagination to the servers screen and also made the server load lazily and get unrendered when out of the display Also suspended servers’ names now are grayed out Installed a ANSI parser library to correctly color console output (hopefully it works however they already said it won’t work for outline 😭) Took the scrollbar modifiers from my Zipline app and put a scrollbar in the servers list Created a object to easily access the WebSocketManager from a ViewModel class Currently working on the specific server page, right now it’s empty but i got websocket working, i’ll push it once it’s finished
Created the server screen and right now i only made the console section out of all the ones i gotta do (console, files, databases, schedules, users, backups, network, startup, settings & activity) The server screen itself is WIP as it’s missing the buttons to switch between the sections The console tab is also WIP as i haven’t done the line charts for CPU, RAM & Network I/O) (devlogging with this stuff half-made cuz it’s almost 3AM so i gotta sleep ) Took the formatMs function from my zipline app to convert ms to human readable time like “1h 30m 20s” for the server uptime In the WebSocketManager class renamed the setPowerState function to sendPowerSignal as it makes more sense On the console screen i wanted the console to follow its actual colors but only lib i found to do that doesn’t support jetpack compose that well so i had to rely on the XML’s TextView (but in compose thanks to the AndroidView component)
Added charts to the console tab of the server screen Added a top scrollbar like ptero’s to the server screen and moved the console stuff to its own file for better sorting Created a component for the chart container & top scrollbar to avoid repetition Added AI declaration in the readme cuz i only found out now that it’s required Removed a double new line the Button component
Created the Files tab in the server screen (still WIP, most of the buttons do nothing rn) Created a File component to avoid repeating same code Added a new color surfaceContainer used in notifications Took the “More Actions” component from my Zipline app Took the “Checkbox” component from my Zipline app and modified it to be toggleable In server screen disable global scroll on certain tabs as they’d cause the app to crash for infinite scroll moved the WebSocket connection to the Console tab instead of the general server screen, this way it auto reconnects when the user switches back to the console tab (since it disconnects when the user moves to another tab to save resources)
(Sorry for the slightly laggy video, not sure if it’s cuz it’s via a emulator or cuz i compressed the video from 136 MiB down to 36 MB) In the server screen added the handling for download, upload, delete, copy, create folder, rename/move, change permissions, archive & unarchive Filled the File component’s “more actions” menu (before it was empty) Updated uploadServerFiles to be able to upload multiple files at once Added a function to convert linux string permissions (like drwxr-xr-x ) to int/octal (like 755 ) Added a regex for the linux int/octal permission Took the Popup component and Storage object form my Zipline app Updated the SecureStorage class to add the file download folder variable
Added a screen for code editing with simple syntax highlighting (via a newly installed library) and a warning if you try to leave without saving (that’s still WIP, saving isn’t implemented yet and neither reading the content of the selected file) Updated the TextInput component to have a fontFamily property so that in the core editor i can set the text to be monospace On the login screen i disabled the application api key input till the admin side is actually done
FInished file handling (handled edit & save files & create new file) Added file highlighting for .env files Fixed writeServerFile having a wrong Content-Type (it had application/json instead of text/plain since the input is a raw string) Fixed HTML syntax highlighting, it wasn’t highlighting the > part of the tag
Updated the file edit screen to use VSCode’s Dark+ theme colors for highlighting and added Java and CASM/Crawssembly by @The_Craw Added the databases tab with handling for creation, deletion and rotation of the password Fixed rotateServerDatabasePassword and deleteServerDatabase , they were using the wrong endpoint ( /server instead of /servers ) Made each tab independently scrollable instead of making the parent component scrollable Took the IconButton component from my Zipline app and slightly modified it (the MoreActionsButton component now uses that) Changed the Notification object component’s background color
Created the schedules tab for the server screen (still WIP, for now only works for displaying & creating schedules, gotta add edit, deletion and task management) Moved each tab to its own ViewModel for better ordering instead of putting everything is a generic one Improved code layout by using return s in some places instead of many if else blocks Fixed ScrollableTabRow component improperly placing icons when there was no text Moved ‘linked’ data class es inside each other so i can do Server.Attributes.Limits instead of having a class with a long name like ApplicationServerAttributesLimits
Finished the UI side of the schedule details popup (still WIP for backend like button handling) Moved each popup into its own folder & file to avoid having many long Popup calls at the top of screen/tab files Changed task action from a normal screen to an enum Took the formatDate function from my Zipline app
Finished handling buttons in the schedules tab & created all the popups for schedule & tasks management In all screens & tab now all the inputs, switches, selects etc. are disabled when loading or making a HTTP request (like delete schedule, update file name etc.) Added a function to convert ISO date strings in human-readable strings Added a missing endpoint to execute a schedule Added a missing only_when_online property in the ServerSchedule data class Fixed schedule & tasks endpoint types (was using String instead of Long for the IDs) Fixed ScrollableTabRow not using all the horizontal space when in landscape mode
Started making the users tab but it’s really WIP, none of the buttons except create new user works) Handled subuser permissions for all current tabs Added a LabeledCheckbox component Removed some function params that were pointless to have Installed the Gravatar SDK for the subusers’ avatar I legit think Android Studio is ragebaiting me, as soon as i start the rec the app starts to lag, when i stop the rec it’s fine
Finished the users tab Made the backups tab Made all popup’s horizontal padding equal When editing or creating a new subuser, the permissins that the current user doesn’t have are disabled in the permissions list Disabled the “Create Database” button when at the limit Renamed File to FileDisplay for consistency with other components Fixed edit & create user body still using String instead of ServerSubuser.Permission Fixed the deleteServerBackup function which was marked as GET instead of DELETE Made the truncate param required in the restoreServerBackup function as it’s required in the API
After i tested more the additions of the last devlog i found some issues so here i fixed them Fixed backups downloading as .gz instead of .tar.gz Fixed “Create Backup” not showing up when the current backup count was 0 (making it impossible to create backups at all) Disabled inputs in the restore & create popups when respectively restoring and creating Removed the enabled param in the BackupDisplay as it was basically useless
Added the network tab to manage server allocations Added a “Tertiary” button type (just cuz secondary was almost invisible on the allocation bg 🥀) Fixed allocation endpoints using String instead of Long Moved backup popups outside of the padded Column Updated my github username in the readme
Network tab now just disables all the buttons when loading instead of switching to skeleton loading for any small change like updating an allocation’s notes Doubled hamburger menu icon left padding to match the avatar padding on the right Doubled the gaps between the cards in the backups & network tabs Halved the gaps between the cards in the schedules tab I also tried to make the TextInput label not squared for a while but failed 😭 , for some reasons even if i clip my highest component to rounded corners, it still has the squared bg in the back
Created the startup tab Made startup variable description nullable as it’s an optional property
Create a custom PullToRefreshBox component that just uses Material3 PullToRefreshBox under the hood, i just made a component so i can easily style it as it’s in 1 single place Added the pull to refresh gesture to servers list & server details screens Added a warning for when the server is suspended, installing, transferring, restoring from a backup or its node is under maintenance (all warnings for now use same icons, i gotta change that) In the servers list servers now are disable and show a pill when they are suspended, installing, transferring, restoring from a backup or their node is under maintenance (basically when the warning is displayed, the server is also disabled aka you can’t access its data like console, files etc.) The app now properly handles padding for devices that have a “waterfall inset” (aka those kind of phones with curved screen at the edge) The top bar in the server list now properly shows a loading state instead of just disappearing and appearing when the user permissions are fetched Created a function hasPermission to check if an user has a certain permission instead of repeating the same code like 20 times Moved StartupContainer to a more general Container Moved ServerStatus enum to Server.Status Removed navController from all tabs as it was unused
Created the activity tab (finally finished all server tabs :D) along with a function to parse the variables in the logs’ description Improved loading for schedules, backup and databases tabs Fixed JSON text highlighting not highlighting strings inside of arrays Added padding for the Waterfall Cutout (aka screens with rounded edges) in the Header and ScrollableTabRow components In the settings tab added a popup to confirm the reinstallation of the server Added the endpoint to get the server activity (idk how i had skipped that one) and its function to call it Renamed AccountActivity to ActivityLog as it’s used in server activity too Installed a lib to generate avatars thta look like “Boring Avatars” one (cuz boring avatars API is paid ) add .trim() to all user inputs Now tabs refresh only when the server ID changes instead of anything in the server object
Added the account settings screen and its account tab (now missing “API Credentials”, “SSH Keys” and “Activity” tabs, then the app is done ) in the server screen’s files tab file names are now limited to one line and if they overflow, they get cut off and “…” is added Now each warning popup in the server screen has its own icon instead of all using the suspended icon in all places, replaced refreshIndex += 1 with refreshIndex++ The app now no longer shows “Missing Server ID” toast as soon as you open a server Fixed disable 2FA endpoint (i forgot to add /disable at the end and i was wondering why 2FA wasn’t getting disabled even tho the request succeeded (without /disable it acts as enable endpoint)) Fixed get qr code response as it was different from what the API docs listed In the get qr code function added a secondary response to tell that 2FA is already enabled (used to check 2FA status so i know whether to show enable or disable button in the 2FA cuz the user object doesn’t tell me if the user has 2FA on … shitty API fr) Added a simple regex to parse emails (so the change email button is enabled only if this regex passes) Servers screen now uses a normal Column instead of a LazyColumn as lazily loading the server was causing more lag than loading all at once (after all it’s just 10 servers per page) Same as above for the server screen activity tab (jusy 25 logs per page) Fixed the pagination system in servers screen and server screen activity tab (for total amount of pages it was using the total amount of items in the current pages ( .total ) instead of the total number of pages ( .totalPages ), idk how i missed that ) Moved the file picker stuff outside of the LazyColumn & put the permissions in a remember to hopefully try to decrease lag I wanted to make a screen rec but i was too lazy to then go and censor my 2FA secret
In the account settings screen created the API credentials tab Update the server screen so each tabs remembers its own data after switching to another tab (previously it would reset when the user switched to another tab). Also tabs now only fetch data on first render, then they use the previously fetched data instead of re-fetching, unless the user manually refreshes via the “pull to refresh” action (the thing where you swipe from top to down and it shows the refresh circle, idk it’s “professional” name ) Applied same changes as above to the account settings screen Updated the formatDate function to include a param to toggle the year in the date
In the account settings screen added the SSH Keys tab (basically a almost full copy paste of the API Credentials for the frontend) Fixed capitalization of a variable & function in the api key tab
In the account settings screen created the activity tab (i think i finished all the client side of the app , now i just gotta finish the small importance TODOs like removing the padding to the scrollbar in most scrollable views & stuff like that) Moved ActivityDisplay in the general components as it’s used in the accoutn activity too Updated ActivityDisplay to include the user agent button when available
in the account settings screen added a tab for the app settings Fixed some activity log event having incorrect names and causing the app to crash Added an action to build the app when the commit is prefixed with [build] or [release] Moved the *Scrollbar modifiers above any padding modifier so they look better Switch ScrollableTabRow to a normal Row instead of LazyRow since it’ll never have enough items to cause any lag Updated the README Removed the admin input in the login screen since it’s currently not available
Created a website for the app & a privacy policy (that was needed for the play store app), it’s available at https://ptero.stefdp.com Added a prompt to request the notification permission in the login screen and a button in the settings in case you want to enable notification in a second moment Improved the eventDescription variable in the ActivityDisplay component (i didn’t even know that was possible, i found it out cuz i made a _count variable and android studio suggested me to put it directly in the when , lmao) Updated versioning to follow SemVer ( 1.0 -> 1.0.0 )
Fixed the pull to refresh box having incorrect padding, so the circle was being hidden by the header and by the time it was out, it was already fully pulled and so it would refresh Updated the README also did some tests with downloading but i failed so i just undid them without committing or anything
Created the locations screen Created the location screen Took and modified to adapt to this app the Table component, originally from my Zipline app Fixed the pull to refresh, when calling onRefresh it didn’t actually set isRefreshing to true so the spinner would immediately disappear instead of swithcing to the spinner state till it finished loading Removed the page property from functions since the page is already stored in the viewModel so it made no sense to retrieve it from the viewModel just to send it to a function in the viewModel Fixed the formatDate function, it was crashing the app on older Android versions (<= 13) because the date time parser couldn’t understand the timezone (it expected a date like 2026-08-08-T15:43:30Z instead of 2026-08-08-T15:43:30+02:00 ) Added a new primary color variant that looks good enough on light bgs Fixed some multi-line TextInput s being marked as singleLine
Created a CodeText component to display text as code (kinda like this ) and applied it in all the places where I previously just copy pasted same code Creating an API key now copies the key to the clipboard
Created nodes screen (missing the popup to create a node for now) App name is now dynamically generated in the build.gradle.kts file (so debug build get the (Debug) suffix) Added an HTTP endpoint to check a node status
Fixed admins not being able to manage servers subusers’ permissions Fixed not being aple to open sub-directories in the file browser Fixed create location popup not closing after creating the location
Created the popup to create a node When fetching the node lists, now it also fetches all the locations (needed for a select in the create popup) Added fastlane metadata (will be used for F-Droid in the future) The Popup component now has a scrollbar Updated the scrollbar so now it only shows up when the container has enough contents to be scrollable Added an arrangement property in the Table ’s headers & row cells so that i can center certain things Updated TextInput and Switch components to make their description text color customizable Updated the workflow to automatically push the .aab file to play store after it’s built and made the release (hopefully, i didn’t test it) Fixed create location popup not clearing the inputs upon closing
Created the node screen & its about tab Moved node specific endpoints to their own ApiService instead of having them in the ApplicationApiService and added 2 endpoints to respectively fetch system data in v1 and v2 Made it so create new node button is disabled until all locations are fetched
Create the settings tab in the node screen Added enabled state to all the inputs & switches in the create node popup Updated the updateNode function’s body & params since some required params were marked as nullable
Created the node configuration tab Renamed the CodeText component to CodeBlockText and added params to highlight the content with a specific language Created the CodeText component to have both normal text and inline code text (kinda like markdown when you do this )
Created the node allocations tab The servers screen now shows the server description when available The 2FA check now considers 2FA as enabled even if the status code is 400 other than checking the error message (ptero got no way of knowing if 2FA is enabled other than that ) Update the TextInput component to allow showing optional suggestions (used in the assign new allocations popup, IP Address input) The Checkbox component now is more transparent when disabled (from 0.5 to 0.2 alpha) Changed how padding works in the Pager component Updated the Table component to add a param to disable lazy loading (for some reason it was laggier) Updated the libs
Created the servers screen (WIP, inputs are untested and creating servers is not implemented yet) Created node servers tab Added pagination to the list nests HTTP request response Removed useless reset of the allocations in the node allocations tab In the created node popup, switched some inputs description from "quoted" test to actual inline code blocks CodeText component now uses CharSequence instead of String so it also supports annotated strings Switched main components from Text to CodeText Application server status is now an enum Updated list nests query to include eggs variables too (i just found out i can do this so i’m gonna prob do in in all the other ones in the next devlog too)
All *Include enums are now chainable so doing ListNodesQueryInclude.SERVERS + ListServersQueryInclude.USER returns servers.user Also now instead of <enum>.toQueryString(...) (like ListServersQueryInclude.toQueryString(...) ) i do listOf(...).toQueryString() Used the new include enum chaining in 2 places: node servers tab: it now makes way less HTTP requests since the user, nest & egg are directly returned with the server, saving me from making multiple HTTP requests to fetch all users, nests & eggs (which would’ve taken a long time on a large server that for example has thousands of users, since it was fetching at a rate of 50 users per HTTP request, and it being a mobile app, internet might not be fast too) servers screen, now it fetches the egg variable together with the nest instead of having to fetch the egg’s data Moved ApiErrorResponse in a models folder for better organization this is a code only change so ig i’ll show pics of the code
Added server creation Added a searchable property in the Select component that adds a text input to filter the options Created a regex to check node & server names
Created server screen with its: About tab Details tab Build Configuration tab Fixed pull to reload, it was updating the refreshIndex variable before the main resource actually refreshed and this caused the tabs not to refresh unless the user pulled to refresh twice CodeText component now uses default text style & font weight instead of pre-defined ones (for some reasons with pre-defined ones, in the ScrollableTabRow component it adds like a margin on the bottom of the blue active indicator) Updated UpdateServerDetailsBody to mark required fields as non-nullable In the server owner select, fixed the selected user disappearing if it was not in the search results In the allocation selects: Made the UI use alias:port when an alias is available, otherwise will default to ip:port Moved the ip:port text to a variable to avoid writing the same thing twice
Created the server startup tab Changed the way Container components are spaced in the Build Configuration tab and create server popup In the create server popup disabled the docker image select when only 1 image is available
Created the admin server databases tab (it only supports resetting the password and deleting the databases because for creating a database i need the hosts IDs, which there seem to be no API endpoint to get them) Added a modifier param to the Container component In the client server screen added a param to directly switch to the databases tab (this is used when the user goes from the admin server screen to the client server screen) Fixed “Missing Server ID” notification when client server is opened with databases tab as first tab
Created server manage tab (only reinstall & suspend/unsuspend cuz there seem to be no API endpoint to toggle install status & transfer) Created server delete tab Added 2 new button types, SUCCESS (green) and WARNING (yellow) In the admin server screen now most tabs are hidden whent he server is installing
Created users & user screen Updated the AGP (Android Gradle Plugin) Table headers now properly support multi line text (previously if one text was multiline while everything else wasn’t, all the divider would have a gap on the bottom except for the multiline one) In the client server screen, settings tab the UUID is now aligned to the right Improved screen change when deleting a server/node/user/location (instead of navController.popBackStack() (which basically acts as the back button) i specifically navigate to generic screen (eg. “user” -> “users”) and remove current screen from the back history so in the case that there is no screen to back into (eg if the app is opened via a deep link or stuff like that) it will go to the generic tab anyway) Added pull to refresh in the location screen
Created nests, nest & nest egg screens For nest egg screen, created 3 tabs: Configuration Variables Install Script it was pretty easy and quick to create those cuz they’re read-only as there’s no API endpoint to edit/delete them Added a back handler in the tabbed screens so that back button now goes to the previous tab instead of the entire previous screen In the client servers screen added a switch to see others’ server (admin only) Fixed capitalization in the getNestEgg function ( eggid -> eggId )
Added optional biometric authentication so people can lock their app behind phone code or biometric verification (like fingerprint etc.)
Added updated checking For F-Droid flavor it doesn’t do anything For APK flavor it checks my git repo For Play Store flavor it uses play store com.google.android.play:app-update library Updated the app site, available at https://ptero.stefdp.com Updated the changelog & app images in the fastlane folder Added an animation when switching between loading states with circular loading
Ships:
For rating & testing the project, please first read all of the text in the release. I made an Android app to manage your self-hosted Pterodactyl Panel instance (Currently only the client side, later I’ll also add the admin side). For who doesn’t know, Pterodactyl Panel is a panel usually used to manage game servers, but it can run anything, each server is just a docker container. The most challenging part was prob downloading files, and it still confuses me tbh because on the Android Studio emulator it works fine, but when if I try it on my actual phone (Samsung A55 5G) it randomly stops after a few seconds and I can’t seem to understand why...
|
1792961446.2727244
|
1793047846.2727244
|